MICROCHIP AN1078 PMSM电机FOC控制中文
- 格式:pdf
- 大小:636.75 KB
- 文档页数:28
AN1299 结论本应用笔记阐述了单分流算法的优点、局限性和限制条件。
通过使用单分流电阻来检测流经直流母线的电流,单分流算法能够重构流经电机各相的电流。
为了获取蕴含在直流母线电流中的信息,使用了空间矢量调制方法。
SVM 产生一组采样时间窗口,在时间窗口中可以观察流经电机各相的电流。
在分流电阻真值表(表 1)中对这些时间窗口进行了划分和分组。
此真值表表明了分流电阻提供的信息与电子开关状态之间的关系。
但是,在某些 SVM 区域,要从直流母线电流获取期望信息是不可能的。
通过修改 SVM 开关模式可以克服这一局限性。
对这些模式进行修改,使得在每个 SVM 工作状态中从单分流电阻提取期望信息成为可能。
这些实际结果表明:单分流电阻方法提供了足够精确的信息,能够满足磁场定向控制的需求。
对提取的流经直流母线的电流进行重构,根据重构的信息,还可能获取诸如位置、转矩这样的电机信息。
参考文献本应用笔记参考了下列应用笔记,它们可从 Microchip 网站()下载:•AN908 《使用 dsPIC30F 实现交流感应电机的矢量控制》(DS00908A_CN)• AN955 “VF Control of 3-Phase Induction Motor (DS00955) Using Space Vector Modulation” • AN1017 《使用 dsPIC30F DSC 实现 PMSM 电机的正弦驱动》(DS01017A_CN)• AN1078 《PMSM 电机的无传感器磁场定向控制》(DS01078A_CN) 2009 Microchip Technology Inc. DS01299A_CN 第 21 页AN1299 注: DS01299A_CN 第 22 页 2009 Microchip Technology Inc.请注意以下有关 Microchip 器件代码保护功能的要点:• • • Microchip 的产品均达到 Microchip 数据手册中所述的技术指标。
电助力自行车的FOC控制技术
随着人们生活水平的提高和环保意识的增强,电助力自行车的市场需求不断扩大,越
来越多的人选择使用电动自行车来代替传统的车辆出行。
而FOC(Field-Oriented Control)控制技术,则是电助力自行车上的一种常用控制技术。
本文将介绍FOC控制技术的原理和
应用。
FOC控制技术是一种闭环控制技术,它主要通过电机控制器来控制电机的电流、速度、位置等参数。
FOC控制技术最初是应用于交流电机控制领域,之后逐渐应用于直流电机控
制领域。
通过FOC控制技术,可以实现对电机控制的高精度和高效率控制。
FOC控制技术的原理是将电机控制分为两个部分,即定子电流控制和转子电流控制。
定子电流控制主要控制电机的磁场强度和方向,保证电机的输出扭矩的稳定性和可靠性。
转子电流控制则可以控制电机的速度和位置,使电机输出的转矩符合要求。
FOC控制技术的优点是可以减少电机的噪音和能耗,提高电机的能量利用率。
另外,FOC控制技术还可以实现对电机输出扭矩的高精度控制,从而提高电机的输出效率和稳定性。
在电助力自行车上,FOC控制技术主要应用于电动机控制器中。
通过FOC控制器的控制,可以实现电动车的正、反转、制动等功能。
同时,FOC控制技术还可以控制电动车的
电源电压和输出功率,从而实现对电动车的高效控制。
总之,FOC控制技术是电助力自行车控制系统中非常重要的技术,可以实现对电机控
制的高精度和高效率控制,从而提高电助力自行车的性能和使用体验。
随着技术的不断进
步和发展,相信这种控制技术会越来越得到广泛的应用。
说明:下面程序取自IFX 16位机无传感器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闭环控制。
/******************************************************************* ********************************************************************************* ****//*********************************************************************** ************************************************************************* ********///****************************************************************** ********** // @Function int clarke_trans(int Phase_s, int Phase_t, int *ia;////----------------------------------------------------------------------------// @Description ia = is// ib = 1/sqrt(3*( (2 * it + is////----------------------------------------------------------------------------// @Returnvalue (ib * 16 , "(ia * 16"////----------------------------------------------------------------------------// @Parameters////----------------------------------------------------------------------------// @Date09.01.2005// Condition optimization off / one//****************************************************************** ********** inline int clarke_trans(int Phase_s, int Phase_t, int *ia{int retvalue;__asm(" mov r12,MCW \n"" mov MCW,#0200h ; set saturation \n"" shl %2,#1 ; ( 2*Phase_t \n"" add %2,%1 ; + Phase_s \n"" mov r13,#37837 \n"" CoMULsu %2,r13 ;* 1/sqrt(3 \n"" CoSHL #4 ; default 2 * 4 \n"" CoSTORE %0,MAS ; ib = result \n"" shl %1,#2 \n"" mov [%3],%1 ; ia = Phase_s * 4 \n"" mov MCW,r12 \n": "=&w"(retvalue /* output registers */: "w"(Phase_s,"w"(Phase_t,"w"(ia /* input registers */ : "r13","r12"/*scratch registers */;return retvalue;}******************************************************************** ********///****************************************************************** ********** // @Function int park_trans(int e_a,int e_b,int phi,int *a_b////----------------------------------------------------------------------------// @Description park transformation////----------------------------------------------------------------------------// @ReturnvalueId_comp , Iq_comp////----------------------------------------------------------------------------// @Parameters////----------------------------------------------------------------------------// @Date 09.01.2005// Condition optimization off / oneinline int park_trans(int i_a,int i_b,int phi,int *o_q{int retvalue;__asm( "\n"" mov r13,MCW \n"" mov MCW,#0600h \n"" shr %3,#6 \n"" shl %3,#1 \n"" EXTS #SEG (_sincostab,#2 \n"" mov r11,[%3 + #SOF(_sincostab+512] \n"" mov r12,[%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"" mov MCW,r13 \n""\n": "=&w"(retvalue /* output registers */: "w"(i_a,"w"(i_b,"w"(phi,"w"(o_q /* input registers */: "r13","r12","r11"/*scratch registers */;return retvalue;}/******************************************************************* ***************************************************************************** ********///********************************************************************** ****** // @Function int inv_park_trans(int e_a,int e_b,int phi,int *a_b////----------------------------------------------------------------------------// @Description inverse park transformation////----------------------------------------------------------------------------// @ReturnvalueI_alpha , I_beta////----------------------------------------------------------------------------// @Parameters////----------------------------------------------------------------------------// @Date09.01.2005// Condition optimization off / one//****************************************************************** ********** inline int inv_park_trans(int i_d,int i_q,int phi,int *o_b{int retvalue;__asm( "\n"" mov r13,MCW \n"" mov MCW,#0600h \n"" shr %3,#6 \n"" shl %3,#1 \n"" EXTS #SEG (_sincostab,#2 \n"" mov r12,[%3 + #SOF(_sincostab+512] \n"" mov r11,[%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"" mov MCW,r13 \n""\n": "=&w"(retvalue /* output registers */: "w"(i_d,"w"(i_q,"w"(phi,"w"(o_b /* input registers */ : "r13","r12","r11"/*scratch registers */;return retvalue;}//****************************************************************** ********** // @Function int cart_polar_conv(int x,int y, int *angle;////----------------------------------------------------------------------------// @Description////----------------------------------------------------------------------------// @Returnvalue////----------------------------------------------------------------------------// @Parameters////----------------------------------------------------------------------------// @Date09.01.2005// Condition optimization off / one//****************************************************************** ********** unsigned int cart_polar_conv(int x,int y, int *angle{unsigned int retvalue;__asm( "\n"" mov MCW,#0200h ; enable saturation to +/-0x7fff \n"" mov r13,%1 ; r13 = x \n"" jmpr cc_nn,kpw1co ; if (x >= 0 goto kpw1co \n"" neg r13 ; else r13 = -r13 \n""kpw1co: ; r13 = |x| \n"" mov r12,%2 ; r12 = y \n"" jmpr cc_nn,kpw2co ; if (y >= 0 goto kpw2co \n"" neg r12 ; r12 = -r12 \n""kpw2co: ; r12 = |y| \n"" mov r9,#1024 \n"" cmp r13,r12 \n"" jmpr cc_c,kpw3co ; if( x < y goto kpw3co \n"" mulu r12,r9 ; MD = y * 1024 \n"" divlu r13 ; MDL = MD / x \n"" mov r9,MDL ; r9 = MDL = (y/x * 1024 \n"" shl r9,#1 ; prepare for word address \n"" EXTS #SEG (_betab,#1 \n"" mov r10,[r9+#SOF(_betab] ; r10 = sqrt( 1 + (r9^2 \n" " CoMULu r13,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"" mov r10,[r9+#SOF(_phitab] ; r10 = arctan( y/x \n" " cmp %1,#0 ; \n"" jmpr cc_n,kpw4co ; if ( x < 0 goto kpw4co \n" " cmp %2,#0 \n"" jmpr cc_n,kpw5co ; if ( y < 0 goto kpw5co \n" " mov [%3],r10 ; angle = arctan( y/x \n" " jmpr cc_uc, endco \n""\n""kpw5co: ; x > 0 and y < 0 \n"" neg r10 \n"" mov [%3],r10 ; angle = -arctan( y/x \n"" jmpr cc_uc, endco \n""\n""kpw4co: ; x < 0 \n"" cmp %2,#0 ; \n"" jmpr cc_n,kpw6co ; if ( y < 0 goto kpw6co \n" " mov r9,#8000h \n" " sub r9,r10 \n"" mov [%3],r9 ; angle = 180�- arctan( y/x \n" " jmpr cc_uc, endco \n" "\n""kpw6co: ; x < 0 and y < 0 \n"" add r10,#8000h \n"" mov [%3],r10 ; angle = -180�+ arctan( y/x \n" " jmpr cc_uc, endco \n" "\n""kpw3co: ; |x| < |y| \n"" mulu r13,r9 ; MD = |x| * 1024 \n"" divlu r12 ; MDL = MD / |y| \n"" mov r9,MDL ; r9 = MDL = (y/x * 1024 \n"" shl r9,#1 ; prepare for word address \n"" \n"" EXTS #SEG (_betab,#1 \n"" mov r10,[r9+#SOF(_betab] ; r10 = sqrt( 1 + (r9^2 \n"" CoMULu r12,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"" mov r10,[r9+#SOF(_phitab] ; r10 = arctan( y/x \n"" cmp %1,#0 \n"" jmpr cc_n,kpw7co ; if ( x < 0 goto kpw7co \n"" cmp %2,#0 \n"" jmpr cc_n,kpw8co ; if ( y < 0 goto kpw8co \n"" mov r9,#4000h \n"" sub r9,r10 \n"" mov [%3],r9 ; angle = 90�- arctan( x/y = 90�- arccot( y/x = arctan( y/x \n" " jmpr cc_uc, endco \n""\n""kpw8co: ; x > 0 and y < 0 \n"" add r10,#0C000h \n"" mov [%3],r10 ; angle = -90�+ arctan( x/y = -(90�- arccot( y/x = -arctan( y/x \n"" jmpr cc_uc, endco \n""\n""kpw7co: \n"" cmp %2,#0 ; x < 0 \n"" jmpr cc_n,kpw9co ; if ( y < 0 goto kpw9co \n"" add r10,#4000h \n"" mov [%3],r10 ; angle = 90�+ arctan( x/y = 180�- (90�- arccot( y/x = 180�- arctan( y/x \n" " jmpr cc_uc, endco \n"" \n""kpw9co: ; x < 0 and y < 0 \n"" mov r9,#0C000h \n"" sub r9,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 /* output registers */: "w"(x,"w"(y,"w"(angle /* input registers */: "r13","r12","r11","r10","r9"/*scratch registers */ ;return retvalue;}//****************************************************************** ********** // @Function: a low pass filter 2012-9-13 17:58:43// C calling format://// int inline int pt1_controller32( int *pt1_parameter, int X////----------------------------------------------------------------------------// @Description//// PT1-Controller// derived from transfer function//// Y_(k = Y_(k-1 + Z1_(k * X_(k - Z2_(k * Y_(k-1//----------------------------------------------------------------------------// Computing time 42 CPU-cycle////----------------------------------------------------------------------------// @Returnvalue//// int "@3" Output of pt1_controller//----------------------------------------------------------------------------// @Parameters//----------------------------------------------------------------------------// Condition optimization off / one//****************************************************************** **********inline int pt1_controller32( PT1_array *pt1_parameter, int X//inline int pt1_controller32( int *pt1_parameter, int X{int retvalue;__asm( "\n"" mov r10,MCW ;Save MCW register \n"" mov MCW,#0400h ;Set shift left \n"" mov %0,[%1+] \n"" CoLOAD %0,[%1] ;Load Y(k-1 in accumulator \n"" mov r13,%1 ;Save parameters addres in %1 \n"" add r13,#2 \n"" mov r12,[r13+] ;Load Z1 in R5 \n"" mov r11,[r13+] ;Load Z2 in R6 \n"" CoMAC r12,%2 ;CoACC = Y(k-1 + Z1 * X \n"" CoMAC- r11,[%1] ;CoACC = Y(k-1 + Z1 * X - Z2 * Y(k-1 \n" "\n""\n"" mov r11,[r13+] ;Load ynmax (limit value max \n"" mov r12,[r13+] ;Load ynmin (limit value min \n"" mov %0,ZEROS ;Load zero in %0 \n"" CoMIN %0,r11 ;Limit max yn \n"" CoMAX %0,r12 ;Limit min yn \n"" CoSTORE %0,MAS ;Store Y(k-high in R4 \n"" CoSTORE r13,MAL ;Store Y(k-low in R3 \n"" mov [%1],%0 ;Store in Y buffer(High \n"" mov [-%1],r13 ;Store in Y buffer(Low \n""\n"" mov MCW,r10 ;Restore MCW register \n""\n": "=&w"(retvalue /* output registers */: "w"(pt1_parameter,"w"(X /* input registers */: "r13","r12","r11","r10"/*scratch registers */;return retvalue;}//****************************************************************** **********// @Function void ADC0_vStartSeq0ReqChNum(ubyte ubExtTrg, ubyte// ubEnIntr, ubyte ubRFill, ubyte ubChannelNum////----------------------------------------------------------------------------// @Description This function starts the conversion of the requested// channel.// NOTE -// Before passing ubEnIntr argument as 1,make sure that Seq 0// source interrupt is enabled.// External Trigger -> 0,Indicates software trigger// (Conversion starts once this function is executed////---------------------------------------------------------------------------- // @Returnvalue None////---------------------------------------------------------------------------- // @Parameters ubExtTrg:// External Trigger : defines external trigger.// @Parameters ubEnIntr:// Enable Source Interrupt : defines source interrupt// @Parameters ubRFill:// Refill : defines the refill// @Parameters ubChannelNum:// Channel number : Name of the Request Channel Number (0 - // 15- see macros defined in the header file////----------------------------------------------------------------------------// @Date 14.05.2010////****************************************************************** **********void ADC0_vStartSeq0ReqChNum(ubyte ubExtTrg, ubyte ubEnIntr, ubyte ubRFill, ubyte ubChannelNum {uword uwVal = 0;if (ubExtTrg == 1{uwVal = 0x0080;}if (ubEnIntr == 1{uwVal = uwVal + 0x0040;}if (ubRFill == 1{uwVal = uwVal + 0x0020;}uwVal = uwVal + (ubChannelNum & 0x001f;ADC0_QINR0 = uwVal; // requested channel} // End of function ADC0_vStartSeq0ReqChNum//****************************************************************** ********** // @Function void ADC0_viSRN0(void////----------------------------------------------------------------------------// @Description This is the interrupt service routine for the Service// Request Node 0 of the ADC0 module.////----------------------------------------------------------------------------// @Returnvalue None////----------------------------------------------------------------------------// @Parameters None////----------------------------------------------------------------------------// @Date14.05.2010////****************************************************************** ********** // USER CODE BEGIN (ADC0_viSRN0,0// USER CODE END_interrupt(ADC0_SRN0INT void ADC0_viSRN0(void{if((ADC0_EVINFR & 0x0100 == 0x0100 //Result0 event interrupt{ADC0_EVINCR = 0x0100; // Clear Result0 event interrupt// USER CODE BEGIN (ADC0_viSRN0,20if( CCU60_TCTR0 & 0x0040 // check count direction of T12.ADC0_CHCTR8 |= 0x1000; // 1: T12 counts down -> assign ADC-CH8 to RESREG1 elseADC0_CHCTR8 &= 0xefff; // 0: T12 counts up -> assign ADC-CH8 to RESREG0if( !(svm0.Sector & 0x0001CCU60_T13PR = svm0.T2Store/2 + svm0.ADCDELAY; // set T13 Period valueelseCCU60_T13PR = svm0.T1Store/2 + svm0.ADCDELAY; // set T13 Period valueCCU60_vEnableShadowTransfer(CCU60_TIMER_13; // enable shadow transfer// USER CODE END}} // End of function ADC0_viSRN0//****************************************************************** ********** // @Function void ADC0_viSRN1(void////----------------------------------------------------------------------------// @Description This is the interrupt service routine for the Service// Request Node 1 of the ADC0 module.////----------------------------------------------------------------------------// @Returnvalue None////----------------------------------------------------------------------------// @Parameters None////----------------------------------------------------------------------------// @Date 14.05.2010////****************************************************************** **********// USER CODE BEGIN (ADC0_viSRN1,0// USER CODE END_interrupt(ADC0_SRN1INT void ADC0_viSRN1(void{if((ADC0_EVINFR & 0x0200 == 0x0200 //Result1 event interrupt{ADC0_EVINCR = 0x0200; // Clear Result1 event interrupt// USER CODE BEGIN (ADC0_viSRN1,21ADC0_CHCTR8 &= 0xefff; // assign ADC-CH8 to RESREG0 if( !(svm0.Sector & 0x0001CCU60_T13PR = svm0.T1Store/2 + svm0.ADCDELAY; // set T13 Period value elseCCU60_T13PR = svm0.T2Store/2 + svm0.ADCDELAY; // set T13 Period value CCU60_vEnableShadowTransfer(CCU60_TIMER_13; // enable shadow transfer// calculate Ialpha and Ibeta from single shunt measurementswitch( svm0.SectorStore{case 0:svm0.IphaseA = (ADC0_RESR0 & 0x0fff - svm0.ADCOFFSET;svm0.IphaseB = (ADC0_RESR1 & 0x0fff - (ADC0_RESR0 & 0x0fff;break;case 1:svm0.IphaseA = (ADC0_RESR1 & 0x0fff - (ADC0_RESR0 & 0x0fff;svm0.IphaseB = (ADC0_RESR0 & 0x0fff - svm0.ADCOFFSET;break;case 2:svm0.IphaseA = -(ADC0_RESR1 & 0x0fff + svm0.ADCOFFSET;svm0.IphaseB = (ADC0_RESR0 & 0x0fff - svm0.ADCOFFSET;break;case 3:svm0.IphaseA = -(ADC0_RESR1 & 0x0fff + svm0.ADCOFFSET;svm0.IphaseB = (ADC0_RESR1 & 0x0fff - (ADC0_RESR0 & 0x0fff; break;case 4:svm0.IphaseA = (ADC0_RESR1 & 0x0fff - (ADC0_RESR0 & 0x0fff; svm0.IphaseB = -(ADC0_RESR1 & 0x0fff + svm0.ADCOFFSET; break;case 5:svm0.IphaseA = (ADC0_RESR0 & 0x0fff - svm0.ADCOFFSET;svm0.IphaseB = -(ADC0_RESR1 & 0x0fff + svm0.ADCOFFSET; break;default:break;}// Calculate currents Id and Iqfoc0.Id = park_trans( foc0.Ialpha, foc0.Ibeta, foc0.AngleStore, &foc0.Iq ; // USER CODE END}} // End of function ADC0_viSRN1//****************************************************************** ********** // @Function void CCU60_viNodeI0(void////----------------------------------------------------------------------------// @Description This is the interrupt service routine for the CCU60 node// I0. If the content of the corresponding compare timer// (configurable equals the content of the capture/compare// register or if a capture event occurs at the associated// port pin, the interrupt request flag is set and an// interrupt is triggered (only if enabled.// Please note that you have to add application specific code// to this function.////----------------------------------------------------------------------------// @Returnvalue None////----------------------------------------------------------------------------// @Parameters None////----------------------------------------------------------------------------// @Date14.05.2010////****************************************************************** ********** // USER CODE BEGIN (NodeI0,1// USER CODE END_interrupt(CCU60_NodeI0_INT void CCU60_viNodeI0(void{// USER CODE BEGIN (NodeI0,2// USER CODE ENDif(CCU60_IS & 0x0040 // if CCU60_IS_T12OM{// Timer T12 one match detection// USER CODE BEGIN (NodeI0,20CCU60_vEnableShadowTransfer(CCU60_TIMER_12;// USER CODE ENDCCU60_ISR |= 0x0040; // clear flag CCU60_IS_T12OM}if(CCU60_IS & 0x0080 // if CCU60_IS_T12PM{// Timer T12 period match detection// USER CODE BEGIN (NodeI0,19CCU60_TCTR2 = t13_trigger[svm0.Sector];svm0.SectorStore = svm0.Sector;svm0.T1Store = svm0.T1;svm0.T2Store = svm0.T2;foc0.AngleStore = foc0.Angle;// Flux Estimator//****************************************************************** **********************DSP_MAC(foc0.Ialpha, foc0.STATOR_R, foc0.Valpha;DSP_MAC(foc0.Ibeta, foc0.STATOR_R, foc0.Vbeta;foc0.FluxAmplitude = cart_polar_conv(foc0.Fluxalpha, foc0.Fluxbeta,&foc0.FluxAngle;//****************************************************************** **********************if( status0.control == 0{foc0.Vd = 0;if( foc0.AngleSpeed > 0foc0.Vq = vf_control(foc0.Vf_offset, foc0.Vf_slew, foc0.AngleSpeed;elsefoc0.Vq = vf_control(-foc0.Vf_offset, foc0.Vf_slew, foc0.AngleSpeed;}else{control0.ReferenceIq = pi_controller32(&control0.Speed, control0.ReferenceSpeed, control0.ActualSpeed;foc0.Vd = pi_controller32(&control0.Id, control0.ReferenceId, foc0.Id;foc0.Vq = pi_controller32(&control0.Iq, control0.ReferenceIq, foc0.Iq;}foc0.Valpha = inv_park_trans( foc0.Vd, foc0.Vq, foc0.Angle, &foc0.Vbeta ;// Modulatorsvm( &svm0 ;// USER CODE ENDCCU60_ISR |= 0x0080; // clear flag CCU60_IS_T12PM }} // End of function CCU60_viNodeI0//****************************************************************** ********** // @Prototypes Of Local Functions//****************************************************************** ********** unsigned int V_TA, V_TB;void svm( tSVM *svm{unsigned char gamma;unsigned int tmp, T1_2;tmp = (((unsigned intsvm->Angle >> 4 * 6;gamma = (unsigned char (tmp>>4;svm->Sector = tmp >> 12;svm->T1 = DSP_minMUL( svm->Amplitude, Sinus60_tab[(unsigned char~gamma], svm->SVMTMIN ; svm->T2 = DSP_minMUL( svm->Amplitude,Sinus60_tab[(unsigned char gamma], svm->SVMTMIN ;T1_2 = (svm->T1 + svm->T2/2;V_TA = svm->T12PERIODE/2 + T1_2;V_TB = svm->T12PERIODE/2 - T1_2;switch( svm->Sector{case 0:*((unsigned int volatile*(svm->CCU6_BASEADDR + CC60SR = V_TB;*((unsigned int volatile*(svm->CCU6_BASEADDR + CC61SR = V_TB + svm->T1; // V_TC;*((unsigned int volatile*(svm->CCU6_BASEADDR + CC62SR = V_TA;break;case 1:*((unsigned int volatile*(svm->CCU6_BASEADDR + CC60SR = V_TB + svm->T2; // V_TC;*((unsigned int volatile*(svm->CCU6_BASEADDR + CC61SR = V_TB;*((unsigned int volatile*(svm->CCU6_BASEADDR + CC62SR = V_TA;break;case 2:*((unsigned int volatile*(svm->CCU6_BASEADDR + CC60SR = V_TA;*((unsigned int volatile*(svm->CCU6_BASEADDR + CC61SR = V_TB;*((unsigned int volatile*(svm->CCU6_BASEADDR + CC62SR = V_TB + svm->T1; // V_TC;break;case 3:*((unsigned int volatile*(svm->CCU6_BASEADDR + CC60SR = V_TA;*((unsigned int volatile*(svm->CCU6_BASEADDR + CC61SR = V_TB + svm->T2; // V_TC;*((unsigned int volatile*(svm->CCU6_BASEADDR + CC62SR = V_TB;break;case 4:*((unsigned int volatile*(svm->CCU6_BASEADDR + CC60SR = V_TB + svm->T1; // V_TC;*((unsigned int volatile*(svm->CCU6_BASEADDR + CC61SR = V_TA;*((unsigned int volatile*(svm->CCU6_BASEADDR + CC62SR = V_TB;break;case 5:*((unsigned int volatile*(svm->CCU6_BASEADDR + CC60SR = V_TB;*((unsigned int volatile*(svm->CCU6_BASEADDR + CC61SR = V_TA;*((unsigned int volatile*(svm->CCU6_BASEADDR + CC62SR = V_TB + svm->T2; // V_TC;break;default:break;}}。
PMSM 电机矢量控制之电流采样原理分析摘要:本文分析了PMSM 电机磁场定向控制(FOC)器的电流采集硬件电路,包括母线电流采样和相线电流采样的电路分析。
以下电路是业界常用、稳定、经典的不二之选,工作之余,在此与同僚分享一下。
15621R Uop Up R Up V cc -=-----------------------------------------(1-1)158N 157N O R U R U U =--------------------------------------------------(1-2)P N U U =-----------------------------------------------------------(1-3)整理后,代入数值得:230U 220V 10U OP CC P +=-----------------------------------------(1-4)O N U 11.21.2U =----------------------------------------------------(1-5)P N U U =-----------------------------------------------------------(1-6)最终,推出:OP O U 8.93V 1.34U +=-----------------------------------------(1-7)一、当MOS 管IRFB3607处于正向导通状态时,电流在一定范围内会使二极管D13处于不导通状态(Up-Un<,但是电流超过阈值后,便会使二极管D13导通,并将电压嵌制在。
当MOS 管IRFB3607处于反向导通状态时,其体二极管也起到电压嵌制作用,电路工作原理相似。
5692BM P 93P CC R R U U R U V +-=----------------------------------------------------------------------(2-1)132OP N 140N O R U U R U U -=----------------------------------------------------------------------(2-2)P N U U =---------------------------------------------------------------------------------------(2-3)令15692R R R =+,代入上式(2-1),整理得:931BM 93CC 1P R R U R V R U ++=----------------------------------------------------------------------(2-4)140132OP 140O 132N R R U R U R U ++=--------------------------------------------------------------------(2-5)P N U U =----------------------------------------------------------------------------------------(2-6)整理以上各式可得:OP 931132931140BM 93113214013293CC 9311321401321O U )R (R R )R (R R U )R (R R )R (R R V )R (R R )R (R R U ++-+++++=------(2-7)分析(2-7)式可知,第一项应该是基准电压,必须有CC CC 9311321401321V 21V )R (R R )R (R R =++,第二项和第三项的系数应该相等,即)R (R R )R (R R )R (R R )R (R R 93113293114093113214013293++=++,以此获取下桥臂MOS 管的管压降值。
(19)中华人民共和国国家知识产权局
(12)发明专利申请
(10)申请公布号
CN111193442A
(43)申请公布日 2020.05.22(21)申请号CN202010271566.3
(22)申请日2020.04.09
(71)申请人南京美均电子科技有限公司
地址210000 江苏省南京市江宁区清水亭东路1318号12号楼
(72)发明人周志华;袁剑恩;徐波
(74)专利代理机构常州佰业腾飞专利代理事务所(普通合伙)
代理人姜晓钰
(51)Int.CI
权利要求说明书说明书幅图
(54)发明名称
一种基于无感FOC算法的PMSM电机开环切换闭环控制方法
(57)摘要
本发明公开了一种基于无感FOC算法的
PMSM电机开环切换闭环控制方法,涉及PMSM电
机控制技术领域,包括在PMSM电机的FOC控制的
开环切换闭环系统中,在达到开环最大速度后,
保持一定时间,在此时间内让电压幅值递减,在
此过程中,当
法律状态
法律状态公告日法律状态信息法律状态
法律状态公告日法律状态信息法律状态2020-05-22公开公开
2020-05-22公开公开
2020-06-16实质审查的生效实质审查的生效
权利要求说明书
一种基于无感FOC算法的PMSM电机开环切换闭环控制方法的权利要求说明书内容是....请下载后查看
说明书
一种基于无感FOC算法的PMSM电机开环切换闭环控制方法的说明书内容是....请下载后查看。
PMSM 电机矢量控制之电流采样原理分析摘要:本文分析了PMSM 电机磁场定向控制(FOC)器的电流采集硬件电路,包括母线电流采样和相线电流采样的电路分析。
以下电路是业界常用、稳定、经典的不二之选,工作之余,在此与同僚分享一下。
15621R Uop Up R Up V cc -=-----------------------------------------(1-1) 158N 157N O R U R U U =--------------------------------------------------(1-2) P N U U =-----------------------------------------------------------(1-3)整理后,代入数值得:230U 220V 10U OP CC P +=-----------------------------------------(1-4) O N U 11.21.2U =----------------------------------------------------(1-5) P N U U =-----------------------------------------------------------(1-6)最终,推出:OP O U 8.93V 1.34U +=-----------------------------------------(1-7)一、当MOS 管IRFB3607处于正向导通状态时,电流在一定范围内会使二极管D13处于不导通状态(Up-Un<0.7V),但是电流超过阈值后,便会使二极管D13导通,并将电压嵌制在0.7V 。
当MOS 管IRFB3607处于反向导通状态时,其体二极管也起到电压嵌制作用,电路工作原理相似。
5692BM P 93P CC R R U U R U V +-=----------------------------------------------------------------------(2-1) 132OP N 140N O R U U R U U -=----------------------------------------------------------------------(2-2) P N U U =---------------------------------------------------------------------------------------(2-3) 令15692R R R =+,代入上式(2-1),整理得:931BM 93CC 1P R R U R V R U ++=----------------------------------------------------------------------(2-4) 140132OP 140O 132N R R U R U R U ++=--------------------------------------------------------------------(2-5) P N U U =----------------------------------------------------------------------------------------(2-6) 整理以上各式可得:OP 931132931140BM 93113214013293CC 9311321401321O U )R (R R )R (R R U )R (R R )R (R R V )R (R R )R (R R U ++-+++++=------(2-7) 分析(2-7)式可知,第一项应该是基准电压,必须有CC CC 9311321401321V 21V )R (R R )R (R R =++,第二项和第三项的系数应该相等,即)R (R R )R (R R )R (R R )R (R R 93113293114093113214013293++=++,以此获取下桥臂MOS 管的管压降值。
CEM I专题报道I Feature Report电器设计中的电机控制趋势I Microchip公司||Patrick Heath许多家用电器都包括一个或多个对其功能至关重要的电机。
在不断提高市场份额的斗争中,新产品设计力求使其产品在竞争中脱颖而出。
本文将探讨五个主要趋势,这些趋势塑造了电器电机控制的未来,电器电机控制适用于从HVAC系统到食品加工的所有领域。
能效最大限度地降低电机和压缩机的功耗仍然是电器设计的大趋势之一。
在很大程度上,美国环境保护局(EPA)家用电器能源之星计划推动着这一进程。
这项计划会对产品进行评级并提供相应的标签,显示运行该设备所需的全年电量(kWh)。
更高效的产品将获得能源之星评级,而这是许多消费者眼中的必备家电属性。
许多其他国家/地区的政府提供类似的评级系统。
低端设备通常使用交流感应电机(ACIM)。
使用变频驱动器(VFD)可以相对简单地控制这些电机。
在这种技术中,三相正弦波形为电动机的绕组供电。
电机的控制通过改变脉宽调制(PWM)占空比来实现,PWM占空比通过其变化率来设置电压和频率。
对于VFD,只要负载不变,即可通过使电压与频率之比保持恒定来提供恒定的转矩。
遗憾的是,装备有VFD的ACIM对变化的负载或速度请求的反应缓慢,这降低了它的效率。
例如,洗衣机通常使用ACIM,并且ACIM对可变负载的变化反应不佳。
当湿衣服在滚筒内翻转,或者在搅拌期间滚筒旋转发生变化时,就会发生这种情况。
提高效率的最直接方法是改变运行设备的电机类型。
高端设备已经开始采用一种新型电机.称为永磁同步电机(PMSM)。
由于设计原因,这种电机提供了更好的控制,但制造成本也更高。
PMSM的效率更高,因为它们在转子中使用永磁体,而感应电机转子使用的绕线线圈需要额外的能量来维持磁场。
PMSM设计的优点是可以使用一种称为磁场定向控制(FOC)的改进控制算法,这种算法可以在更宽的负载或速度范围内非常精确地控制电机使用的能量。
电助力自行车的FOC控制技术电助力自行车的FOC控制技术随着环保意识的不断增强和城市交通的拥堵,电动自行车成为了越来越多人出行的选择。
而在电动自行车中,电助力自行车则拥有着更高的普及度和市场份额。
那么,在电助力自行车中,FOC控制技术又是什么呢?FOC控制技术是电动车较为常见的一种控制技术,它是一种用于转子感应电机(PMSM)和无刷直流电机(BLDC)的电机控制技术。
FOC控制技术的主要目标是使电机运转时,转子位置和电流的波形尽可能接近正弦波,以达到最高效率。
这种技术可以提高电动自行车的动力性能、降低能耗、延长电机寿命等。
FOC控制技术在电助力自行车中的应用,可以带来以下几个显著的优点:1. 提高动力性能:通过FOC控制技术,可以增强电机的输出功率、提高转矩和启动度,从而使车辆更加快速和平稳地起步,加速和爬坡。
2. 降低能耗:FOC控制技术可以使电机在低转速下达到最高效率,从而最大限度地利用电池电量,降低能源消耗。
3. 延长电机寿命:在FOC控制技术的控制下,电动自行车的电机运行更加平稳,噪声更小,从而减少电机的磨损程度,延长电机寿命,降低维护成本。
4. 提高骑行舒适性:FOC控制技术可以使电动自行车的骑行更加平稳,减少颠簸和震动,提高骑行的舒适性。
虽然FOC控制技术带来的优点是显著的,但是它也存在一些挑战需要解决。
例如,采用FOC技术需要在硬件上增加一些传感器和处理器,增加了成本和复杂度;另外,FOC控制技术的精度要求比较高,需要采用高性能的控制算法和传感器。
总的来说,FOC控制技术在电助力自行车中的应用,可以提高车辆的动力性能、降低能耗、延长电机寿命等。
虽然它存在一些挑战,但是随着技术的不断成熟和降低成本,FOC控制技术将成为电动自行车控制技术的重要发展方向。
二轮电动车foc电机控制策略下载温馨提示:该文档是我店铺精心编制而成,希望大家下载以后,能够帮助大家解决实际的问题。
文档下载后可定制随意修改,请根据实际需要进行相应的调整和使用,谢谢!并且,本店铺为大家提供各种各样类型的实用资料,如教育随笔、日记赏析、句子摘抄、古诗大全、经典美文、话题作文、工作总结、词语解析、文案摘录、其他资料等等,如想了解不同资料格式和写法,敬请关注!Download tips: This document is carefully compiled by the editor. I hope that after you download them, they can help you solve practical problems. The document can be customized and modified after downloading, please adjust and use it according to actual needs, thank you!In addition, our shop provides you with various types of practical materials, such as educational essays, diary appreciation, sentence excerpts, ancient poems, classic articles, topic composition, work summary, word parsing, copy excerpts, other materials and so on, want to know different data formats and writing methods, please pay attention!二轮电动车foc电机控制策略一、引言随着环保意识的增强和能源危机的出现,电动车成为了普遍受到关注的交通工具之一。
工业技术科技创新导报 Science and Technology Innovation Herald88①作者简介:郝玉峰(1986,3—),男,汉族,江苏徐州人,硕士,工程师,研究方向:PMSM无传感器控制。
DOI:10.16660/ki.1674-098X.2020.03.088电助力自行车的FOC控制技术①郝玉峰(芜湖飞龙汽车电子技术研究院有限公司 安徽芜湖 241000)摘 要:电助力自行车是自行车的一种,通常以锂电池作为动力源,并装有电机及其控制系统。
文章介绍了电助力自行车(E-Bike )及其驱动方式,分析了目前E-Bike的控制方法及其优劣,并结合扭矩传感器的反馈信号,分析了在E-Bike上的FOC控制算法。
最后对控制结果进行分析,并对未来电助力自行车的控制算法发展方向进行展望。
关键词:E-Bike FOC 扭矩传感器 PMSM 中图分类号:TM351 文献标识码:A 文章编号:1674-098X(2020)01(c)-0088-021 电助力自行车(E-Bike )及其驱动电机电助力自行车是自行车的一种,通常以锂电池作为动力源,并装有电机及其控制系统。
与电动自行车的区别就是,电助力自行车不是通过转把来实现骑行控制,而是通过人骑行时踩踏脚踏板的力矩大小来输出不同力矩与转速,实现助力骑行功能。
由于这种动力方式并不完全依赖于电池动力输出,而是人电动力混合的输出方式,因此,电助力自行车的骑行续航能力比一般电动自行车要远很多。
电助力自行车的电机一般为永磁同步电动机(PMSM),电机的安装方式主要有中置(Mid-Motor )和后置(Rear-Motor )两种。
其外形如图1所示。
中置电机安装在车架的中间部分,两侧安装脚踏板,通过链条将动力传递到后轮。
在没有动力源的情况下,骑行阻力与非助力自行车相差不大。
后置电机安装在后轮轮毂处,直接驱动后轮提供助力。
电助力自行车的助力感应传感器除了力矩传感器外还有后轴勾爪传感器、扭簧传感器和转速传感器等[1],但从控制效果来看,最好的还是力矩传感器,因为它可以及时准确的感知骑行者的意图,实时调节输出力矩与转速的大小,这是其他传感器无法做到的。
基于FOC的PMSM速度控制系统的研究根据磁场定向控制理论以及永磁同步电动机调速控制系统的控制方案建立仿真模型,并对永磁同步电动机的调速过程进行仿真。
仿真结果较好地反映了永磁同步电动机的调速运行过程,对进一步开发永磁同步电动机速度控制系统具有重要意义。
l近年来,随着控制理论、永磁材料和电力电子技术的发展,基于磁场定向控制的永磁同步电动机(PMSM)以其优良的控制性能、高功率密度和高效率,广泛应用于各种高性能伺服系统及其他领域。
本文对永磁同步电动机的磁场定向控制(FOC)系统进行了理论研究与分析,并运用Matlab/Simulink对其调速系统进行建模与仿真。
2永磁同步伺服电动机的模型是一个多变量、非线性、强耦合系统。
为了实现动态过程的矢量控制,首先要实现解耦。
转子磁场定向控制是一种常用的解耦控制方法。
转子磁场定向控制实际上是将Odq同步旋转坐标系放在转子上,随转子同步旋转。
其d轴(直轴)与转子的磁场方向重台(定向),q轴(交轴)逆时针超前d轴90°电角度,如图1所示。
图l(图中转子的磁极对数为1)表示转子磁场定向后,定子三相不动坐标系A、B、c与转子同步旋转坐标系Odq的位置关系。
定子电流矢量is在Odq坐标系上的投影id、iq可以通过对iA、iB、iC的Clarke变换(3/2变换)和Park变换(交/直变换)求得,因此id、iq是直流量。
三相永磁同步伺服电动机的转矩方程为:式中,ψd、ψq——定子磁链在d、q轴的分量;ψf——转子磁钢在定子上的耦合磁链,它只在d轴上存在;p——转子的磁极对数;Ld、Lq——永磁同步电动机d、q轴的主电感。
式(1)说明转矩由两项组成,括号中的第一项是由三相旋转磁场和永磁磁场相互作用所产生的电磁转矩;第二项是由凸极效应引起的磁阻转矩。
对于嵌入式转子,Ld<Lq,电磁转矩和磁阻转矩同时存在。
可以灵活有效地利用这个磁阻转矩,通过调整和控制β角,用最小的电流幅值来获得最大的输出转矩。