《三相交流异步电动机SVPWM开环调速控制程序(硬件法)》<br /><br />《三相交流异步电动机SVPWM开环调速控制程序(硬件法)》<br />.include "240x.h" ; 寄存器地址<br />.global _c_int0 ;全局化标号<br />;--------------------------------------以下定义变量-----------------------------------------------------------<br />ST0 .set 0 ;状态寄存器ST0<br />ST1 .set 1 ;状态寄存器ST1<br />.bss TEMP,1 ;临时变量<br />.bss SET_F,1 ;频率调节比,Q16格式(值为0-1,对应0-50Hz)<br />.bss F_OMEGA,1 ;频率调节比-角频率转换率,Q5格式<br />.bss OMEGA,1 ;调制波角频率,Q5格式<br />.bss SET_V,1 ;参考电压,Q14格式<br />.bss MAX_V,1 ;最大参考电压幅值1/ ,Q14格式<br />.bss T_SAMPLE,1 ;采样周期,Q24格式<br />.bss THETA_H,1 ;参考电压相位角高字,Q12格式<br />.bss THETA_L,1 ;参考电压相位角低字,Q12格式<br />.bss THETA_R,1 ;相位角的圆整值,Q12格式<br />.bss THETA_M,1 ;相位查表值(0-90度),Q12格式<br />.bss THETA_I,1 ;相角查表索引,Q9格式<br />.bss SS,1 ;SIN符号,Q0格式<br />.bss SC,1 ;COS符号,Q0格式<br />.bss SIN_INDX,1 ;SIN表索引,Q0格式<br />.bss SIN_ENTRY,1 ;SIN表入口地址<br />.bss SIN_END,1 ;SIN表结束地址<br />.bss SIN_THETA,1 ;SINθ值,Q14格式<br />.bss COS_THETA,1 ;COSθ值,Q14格式<br />.bss UA,1 ;参考电压D轴分量UA,Q12格式<br />.bss UB,1 ;参考电压Q轴分量UB,Q12格式<br />.bss THETA_S,1 ;θ-扇区数转换系数,Q15格式<br />.bss SECTOR,1 ;参考电压所在的扇区数,Q0格式<br />.bss THETA_90,1 ;90度,Q12格式<br />.bss THETA_180,1 ;180度,Q12格式<br />.bss THETA_270,1 ;270度,Q12格式<br />.bss THETA_360,1 ;360度,Q12格式<br />.bss DEC_MS,24 ;6个逆阵,Q14格式<br />.bss T1_PERIODS,1 ;定时器1周期值,Q5格式<br />.bss CMP_1,1 ;第1基本矢量,Q0格式<br />.bss CMP_2,1 ;第2基本矢量,Q0格式<br />.bss SVPAT,1 ; ACTRA的空间矢量字<br /> .bss ACCH,1 ;ACC高字保存单元<br /> .bss ACCL,1 ;ACC低字保存单元<br /> .bss AR0_SAVE,1 ;AR0保存单元<br /> .bss P_HI,1 ;P寄存器高字保存单元<br /> .bss P_LO,1 ;P寄存器低字保存单元<br />; -------------------------------------CONTEXT段,定义保护现场数据区---------------------------<br />ST0_SAVE .usect ".context",1 ;状态寄存器ST0保存单元<br />ST1_SAVE .usect ".context",1 ;状态寄存器ST1保存单元<br />;--------------------------------------定义主向量段------------------------------------------------------<br />.sect ".vectors" ;定义主向量段<br />RESET B _c_int0 ;地址0000H,复位,优先级1<br />INT1 B PHANTOM ;地址0002H,INT1,优先级4<br />INT2 B _C_INT2 ;地址0004H,INT2,优先级5<br />INT3 B PHANTOM ;地址0006H,INT3,优先级6<br />INT4 B PHANTOM ;地址0008H,INT4,优先级7<br />INT5 B PHANTOM ;地址000AH,INT5,优先级8<br />INT6 B PHANTOM ;地址000CH,INT6,优先级9 <br />RESERVED B PHANTOM ;地址000EH,测试,优先级10<br />SW_INT8 B PHANTOM ;地址0010H,自定义软中断<br />SW_INT9 B PHANTOM ;地址0012H,自定义软中断<br />SW_INT10 B PHANTOM ;地址0014H,自定义软中断<br />SW_INT11 B PHANTOM ;地址0016H,自定义软中断<br />SW_INT12 B PHANTOM ;地址0018H,自定义软中断<br />SW_INT13 B PHANTOM ;地址001AH,自定义软中断<br />SW_INT14 B PHANTOM ;地址001CH,自定义软中断<br />SW_INT15 B PHANTOM ;地址001EH,自定义软中断<br />SW_INT16 B PHANTOM ;地址0020H,自定义软中断<br />TRAP B PHANTOM ;地址0022H,TRAP矢量<br />NMI B PHANTOM ;地址0024H,NMI,优先级3<br />EMU_TRAP B PHANTOM ;地址0026H,仿真Trap,优先级2<br />SW_INT20 B PHANTOM ;地址0028H,自定义软中断<br />SW_INT21 B PHANTOM ;地址002AH,自定义软中断<br />SW_INT22 B PHANTOM ;地址002CH,自定义软中断<br />SW_INT23 B PHANTOM ;地址002EH,自定义软中断<br />SW_INT24 B PHANTOM ;地址0030H,自定义软中断<br />SW_INT25 B PHANTOM ;地址0032H,自定义软中断<br />SW_INT26 B PHANTOM ;地址0034H,自定义软中断<br />SW_INT27 B PHANTOM ;地址0036H,自定义软中断<br />SW_INT28 B PHANTOM ;地址0038H,自定义软中断<br />SW_INT29 B PHANTOM ;地址003AH,自定义软中断<br />SW_INT30 B PHANTOM ;地址003CH,自定义软中断<br />SW_INT31 B PHANTOM ;地址003EH,自定义软中断<br />;--------------------------------------定义子向量段----------------------------------------------------------<br />.sect ".pvecs" ;定义子向量段<br />PVECTORS B PHANTOM ;偏移地址0000H <br /> B PHANTOM ;偏移地址0001H<br /> B PHANTOM ;偏移地址0002H<br /> B PHANTOM ;偏移地址0003H<br /> B PHANTOM ;偏移地址0004H<br /> B PHANTOM ;偏移地址0005H<br /> B PHANTOM ;偏移地址0006H<br /> B PHANTOM ;偏移地址0007H<br /> B PHANTOM ;偏移地址0008H<br /> B PHANTOM ;偏移地址0009H<br /> B PHANTOM ;偏移地址000AH<br /> B PHANTOM ;偏移地址000BH<br /> B PHANTOM ;偏移地址000CH<br /> B PHANTOM ;偏移地址000DH<br /> B PHANTOM ;偏移地址000EH<br /> B PHANTOM ;偏移地址000FH <br /> B PHANTOM ;偏移地址0010H<br /> B PHANTOM ;偏移地址0011H<br /> B PHANTOM ;偏移地址0012H<br /> B PHANTOM ;偏移地址0013H<br /> B PHANTOM ;偏移地址0014H<br /> B PHANTOM ;偏移地址0015H<br /> B PHANTOM ;偏移地址0016H<br /> B PHANTOM ;偏移地址0017H <br /> B PHANTOM ;偏移地址0018H<br /> B PHANTOM ;偏移地址0019H <br /> B PHANTOM ;偏移地址001AH<br /> B PHANTOM ;偏移地址001BH<br /> B PHANTOM ;偏移地址001CH<br /> B PHANTOM ;偏移地址001DH<br /> B PHANTOM ;偏移地址001EH<br /> B PHANTOM ;偏移地址001FH<br /> B PHANTOM ;偏移地址0020H<br /> B PHANTOM ;偏移地址0021H <br /> B PHANTOM ;偏移地址0022H<br /> B PHANTOM ;偏移地址0023H<br /> B PHANTOM ;偏移地址0024H<br /> B PHANTOM ;偏移地址0025H<br /> B PHANTOM ;偏移地址0026H <br /> B PHANTOM ;偏移地址0027H <br /> B PHANTOM ;偏移地址0028H<br /> B T1UF_ISR ;偏移地址0029H<br /> B PHANTOM ;偏移地址002AH<br /> B PHANTOM ;偏移地址002BH<br /> B PHANTOM ;偏移地址002CH<br /> B PHANTOM ;偏移地址002DH<br /> B PHANTOM ;偏移地址002EH<br /> B PHANTOM ;偏移地址002FH <br /> B PHANTOM ;偏移地址0030H<br /> B PHANTOM ;偏移地址0031H<br /> B PHANTOM ;偏移地址0032H<br /> B PHANTOM ;偏移地址0033H<br /> B PHANTOM ;偏移地址0034H<br /> B PHANTOM ;偏移地址0035H<br /> B PHANTOM ;偏移地址0036H<br /> B PHANTOM ;偏移地址0037H<br /> B PHANTOM ;偏移地址0038H<br /> B PHANTOM ;偏移地址0039H<br /> B PHANTOM ;偏移地址003AH<br /> B PHANTOM ;偏移地址003BH<br /> B PHANTOM ;偏移地址003CH<br /> B PHANTOM ;偏移地址003DH<br /> B PHANTOM ;偏移地址003EH<br /> B PHANTOM ;偏移地址003FH<br /> B PHANTOM ;偏移地址0040H<br /> B PHANTOM ;偏移地址0041H<br />;--------------------------------------以下是主程序------------------------------------------------------<br />.text<br />;--------------------------------------系统初始化程序--------------------------------------------------<br />_c_int0 <br /> SETC INTM ; 禁止中断<br />CLRC CNF ;B0为数据存储区<br />LDP #224<br />SPLK #0000001000000100B,SCSR1 ;CLKIN 10M,CLKOUT 20M<br />SPLK #68H,WDCR ;不用看门狗<br />LDP #225<br />LACC MCRA<br />OR #0FC0H ;设置PWM1-6引脚<br />SACL MCRA<br />;--------------------------------------中断初始化程序--------------------------------------------------<br />LDP #0 <br />SPLK #0FFH,IFR ; 清所有系统中断标志<br />SPLK #00000010B,IMR ; 开INT2中断<br />LDP #232 <br />SPLK #0FFFH,EVAIFRA ; 清事件管理器A所有中断标志<br />SPLK #0FH,EVAIFRB <br />SPLK #0FH,EVAIFRC <br />SPLK #0200H,EVAIMRA ; 开T1下溢中断<br />SPLK #0,EVAIMRB ; 屏蔽所有中断<br />SPLK #0,EVAIMRC ; 屏蔽所有中断<br />;--------------------------------------初始化事件管理器A程序--------------------------------------<br />SPLK #500,T1PR ; T1周期值=50 us/50ns/2=500<br />SPLK #500,CMPR1 ; 占空比初值 0%<br />SPLK #500,CMPR2<br />SPLK #500,CMPR3<br />SPLK #0000011001100110B,ACTRA ; 引脚PWM1,3,5高有效,2,4,6低有效<br />SPLK #01F4H,DBTCONA ; 死区时间1*32*50ns=1.6us<br />SPLK #1001001000000000B,COMCONA ;允许比较,使用硬件空间矢量<br />SPLK #1000100000000010B,T1CON ;连续增减计数方式,预分频=1<br />;--------------------------------------变量初始化程序--------------------------------------------------<br /> LDP #6 ; 指向B1<br />SPLK #0347H,T_SAMPLE ;采样周期=50us *224=839秒=347H, Q24格式<br />SPLK #16000,T1_PERIODS ;T1周期值的Q5格式,500*32<br />SPLK #11585,MAX_V ; 最大参考电压幅值1/ ,Q14格式<br />SPLK #0,SET_F ; SET F=0<br />SPLK #10053,F_OMEGA ;频率调节比-角频率转换率,Q5格式<br /> ;当SET_F=1时,对应最大角频率2π50Hz*25=10053<br />SPLK #0,THETA_L ;θ低字,Q12格式<br />SPLK #0,THETA_H ; θ高字,Q12格式<br />LAR AR0,#THETA_90 ; 传送常用角度和逆阵数据<br />LAR AR1,#(28-1) ; 28个<br />LACC #ANGLES_ ; 指向源<br />LARP AR0 <br />INIT_TBL <br /> TBLR *+,AR1 ; 下一个<br />ADD #1 ; 下一个地址<br />BANZ INIT_TBL,AR0 ;AR1=0结束 <br />SPLK #29335,THETA_I ; 相角查表索引,180/π,Q9格式<br />SPLK #31291,THETA_S ; θ-扇区数转换系数,6/(2π),Q15格式<br />SPLK #SIN_ENTRY_,SIN_ENTRY ;SIN表起始地址<br />SPLK #(SIN_ENTRY_+90),SIN_END ;SIN表结束地址<br />LDP #232<br />SPLK #0000100001000010B,T1CON ;使能T1<br />CLRC INTM ; 开总中断<br />;--------------------------------------主循环程序(SET_F由外部输入)---------------------------------<br />MAIN_LOOP <br /> LDP #6<br />LT SET_F ; 将频率调节比(Q16格式)转换成角频率<br />MPYU F_OMEGA ; Q21<br />PAC ; 积送ACC, Q5格式<br />SACH OMEGA ; 保存角频率,Q5格式<br /> LT SET_F ;将频率调节比(Q16格式)转换成参考电压<br />MPYU MAX_V ; Q16*Q14=Q30<br />PAC <br />SACH SET_V ; 保存参考电压幅值,Q14格式<br />B MAIN_LOOP ; 循环<br />;--------------------------------------假中断处理----------------------------------------------------------<br />PHANTOM <br /> CLRC INTM <br /> RET<br />;--------------------------------------T1下溢中断处理子程序-----------------------------------------<br />_C_INT2 <br /> SST #ST0,ST0_SAVE ; 保存现场ST0<br />SST #ST1,ST1_SAVE ; 保存ST1<br />LDP #6 <br />SACH ACCH <br />SACL ACCL ; 保存ACC<br />SPH P_HI <br />SPL P_LO ; 保存 P<br />MPY #1 ; P<=T<br />SPL T_SAVE ; 保存 T <br />SAR AR0,AR0_SAVE ; 保存AR0<br />CLRC SXM<br />LDP #224 <br />LACC PIVR ;读偏移地址<br />SUB #029H ; T1 下溢中断?<br />BCND T1UF_ISR,EQ ;是下溢中断跳T1UF_ISR<br />REST <br /> LDP #6 ;否则恢复现场<br />LAR AR0, AR0_SAVE ; 恢复AR0<br />LT P_LO ;恢复P<br />MPY #1 <br />LPH P_HI <br />LT T_SAVE ;恢复T<br />LACC ACCH,16 <br />ADDS ACCL ;恢复ACC<br />LDP #0 ;指向B2<br />LST #ST1,ST1_SAVE ; 恢复ST1<br />LST #ST0,ST0_SAVE ; 恢复ST0<br />CLRC INTM ; 开中断<br />RET ; 返回<br />T1UF_ISR <br /> LDP #232<br />SPLK #0FFFH,EVAIFRA ; 清中断标志<br />LDP #6 ; 计算转角增量<br />LT OMEGA ; Q5<br />MPY T_SAMPLE ;Q5*Q24<br />PAC ;积存ACC, Q13<br />SFR ; 右移一位成Q12格式<br />ADD THETA_H,16 ; Q12 <br />ADDS THETA_L ;计算绝对位置<br />SACH THETA_H ;保存<br />SACL THETA_L <br />BCND CHK_UPLIM,GEQ ;如果大于0检查上限<br />ADD THETA_360,16 ;否则与2π比较,Q12 <br />SACH THETA_H ; 保存<br />B RND_THETA <br />CHK_UPLIM <br /> SUB THETA_360,16 ;与2π比较,Q12 <br />BCND REST_THETA,LEQ ; 如果在范围内恢复THETA_H<br />SACH THETA_H <br />B RND_THETA <br />REST_THETA <br /> ADD THETA_360,16 ; 恢复THETA_H<br />RND_THETA <br /> ADD #1,15 ; 圆整并保留高字<br />SACH THETA_R ;保存<br />LACC #1 ;假设THETA_H在第一象限<br />SACL SS ; SIN符号=1<br />SACL SC ; COS符号=1<br />LACC THETA_R <br />SACL THETA_M ; 存入THETA_M<br />SUB THETA_90 ;<br />BCND E_Q,LEQ ;在第一象限则跳转<br />SPLK #-1,SC ; COS符号=-1<br />LACC THETA_180 <br />SUB THETA_R ; 180-θ<br />SACL THETA_M ;存入THETA_M<br />BCND E_Q,GEQ ;在第二象限则跳转<br />SPLK #-1,SS ;SIN符号=-1<br />LACC THETA_R <br />SUB THETA_180 ;THETA-180<br />SACL THETA_M ;存入THETA_M<br />LACC THETA_270 <br />SUB THETA_R <br />BCND E_Q,GEQ ;在第三象限则跳转<br />SPLK #1,SC ; COS符号=1<br />LACC THETA_360<br />SUB THETA_R <br />SACL THETA_M ; 在第四象限<br />E_Q <br /> LT THETA_M ; Q12.计算查表索引<br />MPYU THETA_I ; Q12*Q9<br />PAC ; Q5<br />SACH SIN_INDX ; Q5<br />LACC SIN_INDX,11 ;左移11位<br />SACH SIN_INDX ;相当于右移5位变成Q0格式,即整数<br />LACC SIN_ENTRY ;查SIN表<br />ADD SIN_INDX<br />TBLR SIN_THETA <br />LACC SIN_END <br />SUB SIN_INDX ;<br />TBLR COS_THETA ;<br />LT SS ;查COS表<br />MPY SIN_THETA ;修改符号,Q14<br />PAC <br />SACL SIN_THETA ; 左移16位保存,Q14<br />LT SC <br />MPY COS_THETA ; 修改符号, Q14<br />PAC <br />SACL COS_THETA ;左移16位保存,Q14<br />LT SET_V ;开始计算UA , UB <br />MPY COS_THETA ; Q14*Q14<br />PAC ;存入ACC, Q12<br />SACH UA ; UA ,Q12格式<br />MPY SIN_THETA ; Q14*Q14<br />PAC ; 存入ACC, Q12<br />SACH UB ; UB, Q12格式<br />LT THETA_R ; Q12格式.确定扇区<br />MPY THETA_S ; Q12*Q15<br />PAC<br />SACH SECTOR <br />LACC SECTOR,5 <br />SACH SECTOR ; 相当于右移11位变成Q0格式(整数)<br />LACC #DEC_MS ;逆阵数据首地址<br />ADD SECTOR,2 <br />SACL TEMP ;产生地址指针<br />LAR AR0,TEMP ; 指向逆阵表<br />LT UA ; Q12格式.计算UA*M(1,1)+UB*M(1,2)<br />MPY *+ ; M(1,1) UA, Q12*Q14<br />PAC ; Q10格式<br />LT UB ; Q12<br />MPY *+ ; M(1,2) UB, Q12*Q14<br />APAC ; 0.5*C1, Q10<br />BCND CMP1BIG0,GEQ ; 如果大于0继续<br />LACC #0 ; 否则0<br />CMP1BIG0 <br /> SACH TEMP ; 0.5*C1,Q10格式<br />LT TEMP ; Q10格式<br />MPY T1_PERIODS ; Q10*Q5<br />PAC ; Q15格式<br />ADD #1,15 ; 防止C1=0<br />SACH CMP_1,1 ; 0.5*C1*TP,Q0格式<br />LT UA ;计算UA*M(2,1)+UB*M(2,2)<br />MPY *+ ; M(2,1) UA,Q12*Q14<br />PAC ; Q10格式<br />LT UB ; Q12格式<br />MPY *+ ; M(2,2) UB: Q12*Q14<br />APAC ; 0.5*C2,Q10<br />BCND CMP2BIG0,GEQ ; 如果大于0继续<br />LACC #0 ;否则0<br />CMP2BIG0 <br /> SACH TEMP ; 0.5*C2,Q10格式<br />LT TEMP ; Q10格式<br />MPY T1_PERIODS ; Q10*Q5 <br />PAC ; Q15格式<br />ADD #1,15 ; 防止C2 = 0<br />SACH CMP_2,1 ; 0.5*C2*TP,Q0格式<br />LACC #CCKWISE_ ; ACTRA寄存器值表首地址<br />ADD SECTOR ; 查表地址<br />TBLR SVPAT <br />LAR AR0,#ACTRA ;指向ACTRA<br />LACC * ; 读ACTRA<br />AND #0FFFH ; 清高四位<br />OR SVPAT ; 高四位赋新值<br />SACL * ; 更新ACTRA<br />LAR AR0,#CMPR1 ; 指向CMPR1<br />LACC CMP_1<br />SACL *+ ; 更新CMPR1, 指向CMPR2<br />ADD CMP_2 <br />SACL * ; 更新CMPR2<br />SUB #500 ;减T1周期值,CMPR2是否超限<br />BCND IN_LMT,LEQ ;没超跳转<br />SPLK #500,* ;否则赋T1周期值<br />IN_LMT <br /> B REST ; 返回<br />.data <br />;--------------------------------------数据段------------------------------------------------------------------<br />ANGLES_ <br /> .word 01922H ; π/2, Q12格式<br />.word 03244H ; π, Q12格式<br />.word 04B66H ; 3π/2, Q12格式<br />.word 06488H ; 2π, Q12格式<br />.word 20066 ; 矩阵A的逆阵数据,每一个逆阵有4个数据,Q14格式<br />.word –11585 ; 按参考电压所在的扇区索引<br />.word 0<br />.word 23170<br />.word 20066<br />.word 11585<br />.word -20066<br />.word 11585<br />.word 0<br />.word 23170<br />.word -20066<br />.word -11585<br />.word -20066<br />.word 11585<br />.word 0<br />.word -23170<br />.word -20066<br />.word -11585<br />.word 20066<br />.word -11585<br />.word 0<br />.word -23170<br />.word 20066<br />.word 11585<br />CCKWISE_ <br /> .word 0001000000000000B ;逆时针旋转时ACTR高4位值,按扇区索引<br /> .word 0011000000000000B<br /> .word 0010000000000000B<br /> .word 0110000000000000B<br /> .word 0100000000000000B<br /> .word 0101000000000000B<br />SIN_ENTRY_ <br /> .word 0 ; 0-90度SIN值表,Q14格式<br /> .word 286,572,857,1143,1428<br /> .word 1713,1997,2280,2563,2845<br /> .word 3126,3406,3686,3964,4240<br /> .word 4516,4790,5063,5334,5604<br /> .word 5872,6138,6402,6664,6924<br /> .word 7182,7438,7692,7943,8192<br /> .word 8438,8682,8923,9162,9397<br /> .word 9630,9860,10087,10311,10531<br /> .word 10749,10963,11174,11381,11585<br /> .word 11786,11982,12176,12365,12551<br /> .word 12733,12911,13085,13255,13421<br /> .word 13583,13741,13894,14044,14189<br /> .word 14330,14466,14598,14726,14849<br /> .word 14968,15082,15191,15296,15396<br /> .word 15491,15582,15668,15749,15826<br /> .word 15897,15964,16026,16083,16135<br /> .word 16182,16225,16262,16294,16322<br /> .word 16344,16362,16374,16382,16384<br /> .end<br /><br /><br />
|