PMSM电机无传感器FOC矢量控制图文.docx
- 文档编号:7137992
- 上传时间:2023-01-21
- 格式:DOCX
- 页数:25
- 大小:1.47MB
PMSM电机无传感器FOC矢量控制图文.docx
《PMSM电机无传感器FOC矢量控制图文.docx》由会员分享,可在线阅读,更多相关《PMSM电机无传感器FOC矢量控制图文.docx(25页珍藏版)》请在冰豆网上搜索。
PMSM电机无传感器FOC矢量控制图文
说明:
下面程序取自IFX16位机无传感器PMSM电机矢量控制程序。
程序架构是C语言嵌套汇编。
其中坐标系变换是汇编编写。
有插图说明,便于更好的理解。
其中包括坐标系变换,磁链角估算,PI速度环电流环调节。
(单片机XC2236N,Tasking编译器Cavin整理
坐标系变换说明:
双电阻采样得到两相电流(ia,ib,由abc120°静止坐标系Clarke变换到直角坐标系(iα,iβ,由(iα,iβ静止直角坐标系Park变换到直角旋转坐标系(iq,id。
直流id不变,通过PI速度环电流环得到期望直流iq,进行限幅控制。
由旋转坐标系(vq,vd经过Park逆变换到静止坐标系(vα,vβ,然后再经过矢量调制成PWM控制电机。
无传感器角度估算:
由Clarke变换得到(iα,iβ和由Park逆变换得到的(vα,vβ,经过低通滤波器PT1,再由直角坐标系变极坐标系得到磁链估算角无传感器开环启动策略:
在定子中加入幅值及频率都受控的电流,若PLL收敛,切换到FOC闭环控制。
/********************************************************************************************************************************************************//****************************************************************************
****************************************************************************/
//****************************************************************************//@Functionintclarke_trans(intPhase_s,intPhase_t,int*ia;
//
//----------------------------------------------------------------------------//@Descriptionia=is
//ib=1/sqrt(3*((2*it+is
//
//----------------------------------------------------------------------------
//@Returnvalue(ib*16,"(ia*16"
//
//----------------------------------------------------------------------------//@Parameters
//
//----------------------------------------------------------------------------//@Date09.01.2005
//Conditionoptimizationoff/one
//****************************************************************************inlineintclarke_trans(intPhase_s,intPhase_t,int*ia
{
intretvalue;
__asm(
"movr12,MCW\n"
"movMCW,#0200h;setsaturation\n"
"shl%2,#1;(2*Phase_t\n"
"add%2,%1;+Phase_s\n"
"movr13,#37837\n"
"CoMULsu%2,r13;*1/sqrt(3\n"
"CoSHL#4;default2*4\n"
"CoSTORE%0,MAS;ib=result\n"
"shl%1,#2\n"
"mov[%3],%1;ia=Phase_s*4\n"
"movMCW,r12\n"
:
"=&w"(retvalue/*outputregisters*/
:
"w"(Phase_s,"w"(Phase_t,"w"(ia/*inputregisters*/
:
"r13","r12"/*scratchregisters*/
;
returnretvalue;
}
****************************************************************************/
//****************************************************************************//@Functionintpark_trans(inte_a,inte_b,intphi,int*a_b
//
//----------------------------------------------------------------------------//@Descriptionparktransformation
//
//----------------------------------------------------------------------------//@ReturnvalueId_comp,Iq_comp
//
//----------------------------------------------------------------------------//@Parameters
//
//----------------------------------------------------------------------------//@Date09.01.2005
//Conditionoptimizationoff/one
inlineintpark_trans(inti_a,inti_b,intphi,int*o_q
{
intretvalue;
__asm("\n"
"movr13,MCW\n"
"movMCW,#0600h\n"
"shr%3,#6\n"
"shl%3,#1\n"
"EXTS#SEG(_sincostab,#2\n"
"movr11,[%3+#SOF(_sincostab+512]\n"
"movr12,[%3+#SOF(_sincostab]\n"
"CoMUL%2,r12\n"
"CoMAC%1,r11\n"
"CoSTORE%0,MAS\n"
"CoMUL%2,r11\n"
"CoMAC-%1,r12\n"
"CoSTORE[%4],MAS\n"
"movMCW,r13\n"
"\n"
:
"=&w"(retvalue/*outputregisters*/
:
"w"(i_a,"w"(i_b,"w"(phi,"w"(o_q/*inputregisters*/
:
"r13","r12","r11"/*scratchregisters*/
;
returnretvalue;
}
/****************************************************************************
****************************************************************************///****************************************************************************//@Functionintinv_park_trans(inte_a,inte_b,intphi,int*a_b
//
//----------------------------------------------------------------------------//@Descriptioninverseparktransformation
//
//----------------------------------------------------------------------------//@ReturnvalueI_alpha,I_beta
//
//----------------------------------------------------------------------------//@Parameters
//
//----------------------------------------------------------------------------//@Date09.01.2005
//Conditionoptimizationoff/one
//****************************************************************************inlineintinv_park_trans(inti_d,inti_q,intphi,int*o_b
{
intretvalue;
__asm("\n"
"movr13,MCW\n"
"movMCW,#0600h\n"
"shr%3,#6\n"
"shl%3,#1\n"
"EXTS#SEG(_sincostab,#2\n"
"movr12,[%3+#SOF(_sincostab+512]\n"
"movr11,[%3+#SOF(_sincostab]\n"
"CoMUL%1,r12\n"
"CoMAC-%2,r11\n"
"CoASHR#2\n"
"CoSTORE%0,MAS\n"
"CoMUL%1,r11\n"
"CoMAC%2,r12\n"
"CoASHR#2\n"
"CoSTORE[%4],MAS\n"
"movMCW,r13\n"
"\n"
:
"=&w"(retvalue/*outputregisters*/
:
"w"(i_d,"w"(i_q,"w"(phi,"w"(o_b/*inputregisters*/:
"r13","r12","r11"/*scratchregisters*/
;
returnretvalue;
}
//****************************************************************************//@Functionintcart_polar_conv(intx,inty,int*angle;
//
//----------------------------------------------------------------------------//@Description
//
//----------------------------------------------------------------------------//@Returnvalue
//
//----------------------------------------------------------------------------//@Parameters
//
//----------------------------------------------------------------------------//@Date09.01.2005
//Conditionoptimizationoff/one
//****************************************************************************unsignedintcart_polar_conv(intx,inty,int*angle
{
unsignedintretvalue;
__asm("\n"
"movMCW,#0200h;enablesaturationto+/-0x7fff\n"
"movr13,%1;r13=x\n"
"jmprcc_nn,kpw1co;if(x>=0gotokpw1co\n"
"negr13;elser13=-r13\n"
"kpw1co:
;r13=|x|\n"
"movr12,%2;r12=y\n"
"jmprcc_nn,kpw2co;if(y>=0gotokpw2co\n"
"negr12;r12=-r12\n"
"kpw2co:
;r12=|y|\n"
"movr9,#1024\n"
"cmpr13,r12\n"
"jmprcc_c,kpw3co;if(x "mulur12,r9;MD=y*1024\n" "divlur13;MDL=MD/x\n" "movr9,MDL;r9=MDL=(y/x*1024\n" "shlr9,#1;prepareforwordaddress\n" "EXTS#SEG(_betab,#1\n" "movr10,[r9+#SOF(_betab];r10=sqrt(1+(r9^2\n""CoMULur13,r10;CoACC=x*sqrt(1+(y/x^2\n""CoSHL#1;unsigned->signed\n" "CoSTORE%0,MAS;%0=CoACC\n""\n" "EXTS#SEG(_phitab,#1\n" "movr10,[r9+#SOF(_phitab];r10=arctan(y/x\n""cmp%1,#0;\n" "jmprcc_n,kpw4co;if(x<0gotokpw4co\n""cmp%2,#0\n" "jmprcc_n,kpw5co;if(y<0gotokpw5co\n""mov[%3],r10;angle=arctan(y/x\n""jmprcc_uc,endco\n" "\n" "kpw5co: ;x>0andy<0\n" "negr10\n" "mov[%3],r10;angle=-arctan(y/x\n" "jmprcc_uc,endco\n" "\n" "kpw4co: ;x<0\n" "cmp%2,#0;\n" "jmprcc_n,kpw6co;if(y<0gotokpw6co\n""movr9,#8000h\n" "subr9,r10\n" "mov[%3],r9;angle=180�-arctan(y/x\n""jmprcc_uc,endco\n" "\n" "kpw6co: ;x<0andy<0\n" "addr10,#8000h\n" "mov[%3],r10;angle=-180�+arctan(y/x\n""jmprcc_uc,endco\n" "\n" "kpw3co: ;|x|<|y|\n" "mulur13,r9;MD=|x|*1024\n" "divlur12;MDL=MD/|y|\n" "movr9,MDL;r9=MDL=(y/x*1024\n" "shlr9,#1;prepareforwordaddress\n" "\n" "EXTS#SEG(_betab,#1\n" "movr10,[r9+#SOF(_betab];r10=sqrt(1+(r9^2\n" "CoMULur12,r10;CoACC=x*sqrt(1+(y/x^2\n" "CoSHL#1;unsigned->signed\n" "CoSTORE%0,MAS;%0=CoACC\n" "\n" "EXTS#SEG(_phitab,#1\n" "movr10,[r9+#SOF(_phitab];r10=arctan(y/x\n" "cmp%1,#0\n" "jmprcc_n,kpw7co;if(x<0gotokpw7co\n" "cmp%2,#0\n" "jmprcc_n,kpw8co;if(y<0gotokpw8co\n" "movr9,#4000h\n" "subr9,r10\n" "mov[%3],r9;angle=90�-arctan(x/y=90�-arccot(y/x=arctan(y/x\n" "jmprcc_uc,endco\n" "\n" "kpw8co: ;x>0andy<0\n" "addr10,#0C000h\n" "mov[%3],r10;angle=-90�+arctan(x/y=-(90�-arccot(y/x=-arctan(y/x\n" "jmprcc_uc,endco\n" "\n" "kpw7co: \n" "cmp%2,#0;x<0\n" "jmprcc_n,kpw9co;if(y<0gotokpw9co\n" "addr10,#4000h\n" "mov[%3],r10;angle=90�+arctan(x/y=180�-(90�-arccot(y/x=180�-arctan(y/x\n""jmprcc_uc,endco\n" "\n" "kpw9co: ;x<0andy<0\n" "movr9,#0C000h\n" "subr9,r10;angle=-90�-arctan(x/y=-180�+(90�-arccot(y/x=-180�+arctan(y/x\n" "mov[%3],r9\n" "\n" "endco: \n" : "=&w"(retvalue/*outputregisters*/ : "w"(x,"w"(y,"w"(angle/*inputregisters*/ : "r13","r12","r11","r10","r9"/*scratchregisters*/ ; returnretvalue; } //****************************************************************************//@Function: alowpassfilter2012-9-1317: 58: 43 //Ccallingformat: // //intinlineintpt1_controller32(int*pt1_parameter,intX // //----------------------------------------------------------------------------//@Description // //PT1-Controller //derivedfromtransferfunction // //Y_(k=Y_(k-1+Z1_(k*X_(k-Z2_(k*Y_(k-1 //----------------------------------------------------------------------------//Computingtime42CPU-cycle // //----------------------------------------------------------------------------//@Returnvalue // //int"@3"Outputofpt1_controller //----------------------------------------------------------------------------//@Parameters //----------------------------------------------------------------------------//Conditionoptimizationoff/one //**************************************************************************** inlineintpt1_controller32(PT1_array*pt1_parameter,intX //inlineintpt1_controller32(int*pt1_parameter,intX { intretvalue; __asm("\n" "movr10,MCW;SaveMCWregister\n" "movMCW,#0400h;Setshiftleft\n" "mov%0,[%1+]\n" "CoLOAD%0,[%1];LoadY(k-1inaccumulator\n" "movr13,%1;Saveparametersaddresin%1\n" "addr13,#2\n"
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- PMSM 电机 传感器 FOC 矢量 控制 图文