华南理工大学PMSM矢量控制讲义
- 格式:pdf
- 大小:8.13 MB
- 文档页数:42
目录1 引言 (1)1.1 课题的背景与意义 (1)1.1.1 课题背景 (1)1.1.2 课题意义 (1)1.2 永磁电机发展概况 (1)2 机电能量转换和拉格朗日方程 (2)2.1 机电能量转换 (2)2.2 三相同步电机电磁转矩 (7)2.3 拉格朗日方程 (9)3 三相永磁同步电机的数学模型 (11)3.1 三相PMSM的基本数学模型 (11)3.2 三相PMSM的坐标变换 (13)3.2.1 Clark变换 (13)3.2.2 Park变换 (14)3.3 同步旋转坐标系下PMSM的数学模型 (14)4 三相永磁同步电机的矢量控制 (16)4.1 转速环PI调节器的参数整定 (16)4.2 电流环PI调节器的参数整定 (17)4.3 三相PMSM矢量控制系统的仿真 (19)4.3.1 仿真建模 (19)4.3.2 仿真结果分析 (22)总结 (23)参考文献 (23)三相永磁同步电机矢量控制建模与仿真摘要:永磁同步电机具有体积小、效率和功率因数高等优点,因此越来越多的应用在各种功率等级的场合。
永磁同步电机的控制是永磁同步电机应用的关键技术,永磁同步电机的结构特点使得采用矢量控制系统有很大的优势。
本文首先分析了永磁同步电机矢量控制的发展概况,然后从机电能量转换的角度出发,解释三相永磁同步电机的机电能量转换原理,推导拉格朗日运动方程。
此外,列写出永磁同步电机在三相静止坐标系和dq坐标系下的数学模型。
基于Simulink建立了转速电流双闭环矢量控制系统的仿真模型,通过对仿真结果分析,验证了永磁同步电机矢量控制系统性能的优越性。
关键词:永磁同步电机,矢量控制,Simulink1 引言1.1 课题的背景与意义1.1.1 课题背景交流电机的控制性能在磁场定向矢量控制技术提出后才有了质的飞跃。
磁场定向矢量控制技术采用的是励磁电流和转矩电流的解稱控制,兼顾磁场和转矩的控制,克服了交流电机自身耦合的缺点。
电流采样及坐标变换前言永磁同步电机(PMSM)应用范围广泛,经常用于新能源汽车、机床、工业等领域。
在实际使用中,我们经常采用矢量控制算法(FOC)完成PMSM的高性能控制。
矢量控制中通常采用双闭环结构,其中外环为速度环,内环为电流环。
为了实现PMSM高性能控制,我们会采用各种复杂的算法来实现目标,这其中电流环相关算法又是重中之重。
但是需要指出,电流环性能好坏除了与采用的算法有关之外,还与最基本的电流采样问题以及坐标变换问题紧密相关。
只有当这些细节问题研究到位之后,高性能的控制算法才会更好发挥作用。
本文档主要探讨电流环的电流采样问题、故障保护以及坐标变换问题。
1 单相电流采样模型及补偿图1为实际系统中电流采样系统示意图,主要电源(含参考源)、HALL电流传感器、放大及滤波电路、AD转换器。
对于实际采样系统而言,各个器件均不是理想的,综合起来会产生明显的赋值衰减和相位滞后,这势必会降低控制性能。
图1 电流采样系统示意图HALL电流传感器:(1)增益非线性:即使采样的电流为直流时,也会在电流较大时产生增益下降,即增益非线性(饱和效应)。
进行建模时,认为增益非线性只是改变了输出HALL输出电压幅值,并不产生相位滞后。
记为G。
Non(2) 低通特性:此特性会随着电流频率的变化而产生不同程度的相位滞后和幅值衰减。
记为()LPF1G s 。
由上述可知,HALL 传感器的传递函数为()()HALL Non LPF1G s G G s =⋅。
图2为传输非线性Non G 的示意图。
由此图可见在-400A~400A 是线性区域,增益为1pu ;而电流处于-700A~-400A 以及400A~700A 范围内时增益下降到了0.98pu ;当电流处于-900A~-700A 以及700A~900A 范围内时增益下降到了0.952pu 。
为了后续分析方便,这里假设()LPF11=3e -061G s s +。
实际系统的()LPF1G s 可由测试或者查询HALL 传感器的数据手册得到。
PMSM 电机矢量控制之电流采样原理分析摘要:本文分析了PMSM 电机磁场定向控制(FOC)器的电流采集硬件电路,包括母线电流采样和相线电流采样的电路分析。
以下电路是业界常用、稳定、经典的不二之选,工作之余,在此与同僚分享一下。
15621R Uop Up R Up Vcc ----------------------------------------(1-1)158N 157NO R U R U U -------------------------------------------------(1-2)P NU U -----------------------------------------------------------(1-3)整理后,代入数值得:230U 220V 10U OPCC P -----------------------------------------(1-4)O NU 11.21.2U ----------------------------------------------------(1-5) P NU 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)132OPN 140NO R U U R U U ---------------------------------------------------------------------(2-2)P NU U ---------------------------------------------------------------------------------------(2-3) 令15692R R R ,代入上式(2-1),整理得:931BM93CC1PR R U R V R U ----------------------------------------------------------------------(2-4)140132OP140O132NR R U R U R U --------------------------------------------------------------------(2-5)P N U U ----------------------------------------------------------------------------------------(2-6)整理以上各式可得:OP 931132931140BM93113214013293CC9311321401321OU )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 CC9311321401321V 21V )R (R R )R (R R ,第二项和第三项的系数应该相等,即)R (R R )R (R R )R (R R )R (R R 93113293114093113214013293,以此获取下桥臂MOS 管的管压降值。
说明:下面程序取自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;}}。
第2章永磁同步电机的结构特点及数学模型2.1 永磁同步电机概述电机是一种机电能量转换或信号转换的电磁机械装置。
自1831年电磁感应定律为人们所知,人们发现可以利用磁场将电能与机械能进行相互转化,由此发明了电机。
随着不同种类的电机相继出现,大力推动了电气工程行业及电力电子工业的发展。
众所周知,要于电机之内建立所需的磁场,一种方式是可以通过在电机内部对电机绕组通以电流产生磁场,需要持续的提供电能维持磁场存在,磁场强度取决于电机内部的电流及绕组的结构。
另一种可以通过永磁体产生磁场,由于永磁材料的固有特性故不再需要提供其他外在能量便可以持续维持磁场存在,因此采用永磁材料产生磁场可以使电机在自身结构上更为简单,其运行的安全程度和效率也随之提高。
起初人们并未发现可用于建立磁场的较为合适的材料,因此人们利用天然的磁铁矿石制成永磁材料,并在19世纪20年代制成世界上第一台永磁电机。
但由于天然磁铁矿石的磁性较低,因此为了满足磁场需求,制成的电机体积庞大,性能较差,并不能达到人们在工业等相关领域的要求。
直到1845年,英国的惠斯通用电磁铁代替永久磁铁,随后又发明了自励电励磁发电机,开创了电励磁方式的先河。
它弥补了天然磁铁的不足,在随后的几十年中,电励磁电机逐渐取代了原始的永磁电机随着电机技术发展的需要,人们开始不断寻找磁性能更好的永磁材料。
20世纪中期被发现并加以应用的铝镍钴永磁材料和铁氧体永磁材料就是很好的例子,因其磁性能在原有材料基础上的较大提高,因此在工业、农业、军事或者在日常生活中人们又重新重视起永磁电机的应用。
但这两种材料也有其自身的缺陷,铝镍钴永磁材料矫顽力较低、易退磁,铁氧体永磁材料的剩磁较低,在一定程度上又限制了永磁电机的发展。
随着人们的继续探索,20世纪60年代美国人K.J.Stmat研制出的以钐钴为主要成分的稀土永磁材料,被称为第一代稀土永磁材料,引领永磁电机发展到一个新的阶段。
由于其价格昂贵,起初各国研发的重点通常在航空航天和要求高性能的高科技领域。
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 管的管压降值。