SVPWM源程序
第15章 用TMS320LF2407 实现空间矢量PWM(SVPWM)<br />15.3 利用TMS320LF240x实现SVPWM算法的程序<br />下面给出了利用TMS320LF2407实现SVPWM算法的一个应用程序。在该程序中,我们假设有200个电压矢量Uout 平均分布在电角度为2π的范围内,通过改变SVPWM的调制周期T可以改变输出的3相正弦波的频率。<br />源程序代码:<br />(1) 所需的复位和中断矢量定义文件“vectors.asm”请读者参考本书相关章节。<br />(2) 主程序<br />// 该程序用于简单的SVPWM演示,产生3相互差120度电角度的正弦交流电压,此程序实<br />// 时计算cmp1和cmp2的值 <br />#include "register.h" <br />#include "float.h" <br />#include "math.h"<br />float ualfa,ubeta; // 存储电压矢量Uout的(α,β)轴分量ualfa、ubeta的数组 <br />int sector; // 定义存储扇区数的数组 <br />#define PI2 2*3.1415926 // 定义2π的值 <br />#define DETA PI2/200 // 定义相临两个Uout之间的电角度的差值 <br />#define INIA 3.1415926/180 // 定义Uout的初始电角度 <br />#define TP 1200 // t1的周期寄存器的值,其值等于SVPWM调制周期T的一半,<br /> // 因为在该程序中2π电角度内Uout的点数一定,故改变此值<br /> // 可以改变输出的3相正弦交流电压的频率 <br />#define KP 0.7 // 定义Uout的标幺值,KP的值在0和1之间,改变此值可以<br /> // 改变逆变桥输出电压的幅值 <br />// 屏蔽中断子程序 <br />void inline disable() <br />{<br /> asm(" setc INTM");<br />}<br />// 系统初始化子程序 <br />viod initial()<br />{<br /> *IFR=0xFFFF; // 清除所有的中断标志 <br /> *IMR=0X0; // 屏蔽所有中断 <br /> *SCSR1=0x81FE; // CLKIN=6M,CLKOUT=24M <br /> *WDCR=0xE8; // 不使能看门狗 <br /> *T3PER=TP; // 通用定时器1的周期=PWM的周期/指令周期/2 <br /> *T3CON=0X0802; // 设置通用定时器1为连续增减模式,以产生对称的PWM,<br /> // 且为了便于调试,使仿真一挂起时时钟就停止运行 <br /> *ACTRB=0X666; // PWM7、9、11高有效,PWM8、10、12低有效 <br /> *COMCONB=0X9200; // 使能PWM输出和比较动作 <br /> *EVBIMRA=0X00; // 禁止EVB和时钟及比较有关的中断 <br /> *T3CNT=0X00; // T1的计数器清0 <br /> *EVBIFRA=0x0FFFF; // 清除EVB相应的中断标志 <br /> *MCRC=*MCRC|0X7E; // PWM7-PWM12输出使能,使能IOPE1-IOPE6第二功能 <br /> WSGR=0x0000; // 不使能所有的等待状态 <br />}<br />// 根据Uout的标幺值KP计算ualfa,ubeta子程序 <br />void calu()<br />{<br /> int i;<br /> for(i=0;i<200;i++)<br /> {<br /> ualfa=KP*cos(INIA+i*DETA);<br /> ubeta=KP*sin(INIA+i*DETA);<br /> }<br />}<br />// 各点的扇区确定子程序 <br />void SECTOR()<br />{<br /> int i,a,b,c;<br /> float vref1,vref2,vref3;<br /> for(i=0;i<200;i++)<br /> {<br /> vref1=ubeta;<br /> vref2=(-ubeta+ualfa*1.732051)/2; <br /> vref3=(-ubeta-ualfa*1.732051)/2; // 计算确定扇区数需要的3个参考量<br />// vref1、vref2、vref3 <br /> if(vref1>0) a=1;<br /> else a=0; <br /> if(vref2>0) b=1;<br /> else b=0;<br /> if(vref3>0) c=1;<br /> else c=0;<br /> a=4*c+2*b+a;<br /> switch(a){<br />case 1:sector=1;break; <br /> case 2:sector=5;break;<br /> case 3:sector=0;break;<br /> case 4:sector=3;break;<br /> case 5:sector=2;break;<br /> case 6:sector=4;break;<br /> default:break;<br /> } // 根据相应的关系确定各个Uout所在的扇区 <br /> }<br />}<br />// 主程序 <br />main()<br />{<br />int anticlk={0x1666,0x3666,0x2666,0x6666,0x4666,0x5666};<br />// 逆时针旋转的6个基本矢量 <br />int i,k=0,cmp1,cmp2;<br />float x,y,z; <br /> disable(); // 屏蔽所有中断 <br /> initial(); // 系统初始化 <br /> calu(); // 计算ualfa,ubeta的值 <br /> SECTOR(); // 确定各点的扇区,在实际应用时应该由即时<br />// 的ualfa和ubeta即时算出 <br />while(1) {<br /> for(i=0;i<200;i++) {<br /> *ACTRB=anticlk]; // 重新装配ACTRA <br /> x=ubeta;<br /> y=(1.732051*ualfa+ubeta)/2;<br /> z=(-1.732051*ualfa+ubeta)/2; // 以上3句计算3个相应的参考量 <br /> switch(sector) {<br /> case 0 :cmp1=(int)(-z*TP),cmp2=(int)(x*TP);break;<br /> case 1 :cmp1=(int)(y*TP),cmp2=(int)(z*TP);break;<br /> case 2 :cmp1=(int)(x*TP),cmp2=(int)(-y*TP);break;<br /> case 3 :cmp1=(int)(z*TP),cmp2=(int)(-x*TP);break;<br /> case 4 :cmp1=(int)(-y*TP),cmp2=(int)(-z*TP);break;<br /> case 5 :cmp1=(int)(-x*TP),cmp2=(int)(y*TP);break; <br /> default : break;<br /> } // 以上根据uout所处的扇区计算相应的cmp1和cmp2的值 <br /> *CMPR4=cmp1; // 比较寄存器4赋值 <br /> *CMPR5=cmp1+cmp2; // 比较寄存器5赋值 <br /> if((i+k)==0) *T3CON=*T3CON|0X040; // 启动定时器,只启动一次 <br />while(1) {<br /> k=*EVBIFRA&0X0200;<br /> if(k==0x0200) break; // 如果T3的中断标志建立,则停止等待 <br /> } <br />}<br />}<br />}<br />// 如果由于干扰引起中断,则执行此直接返回程序<br />void interrupt nothing() <br />{<br /> return;<br />}<br />从刘和平光盘里拷贝的?
从刘和平光盘里拷贝的?<br />不知道能不能用!<br />请高手看看。有问题的话帮我改下,<br />刚接触这行,<br />按的专业是电子技术。<br />先谢过了在贴一个
使用TI TMS2407 实现SVPWM同步电机控制算法。源代码在闻廷科技的2407开发板上已经调试成功<br /><br /><br />#include "register.h"<br />#define Fs 2 //Fs为采样频率kHz(载波频率)<br /><br />#define PI 180 <br />const int csin={0, //查表法计算正弦值<br />174,<br />348, <br />523, <br />697, <br />871, <br />1045, <br />1218, <br />1391, <br />1564, <br />1736, <br />1908, <br />2079, <br />2249, <br />2419, <br />2588, <br />2756,<br />2923, <br />3090, <br />3255, <br />3420, <br />3583, <br />3746, <br />3907, <br />4067, <br />4226, <br />4383, <br />4539, <br />4694, <br />4848, <br />5000, <br />5150, <br />5299, <br />5446, <br />5591, <br />5735, <br />5877, <br />6018, <br />6156, <br />6293, <br />6427, <br />6560, <br />6691, <br />6819, <br />6946, <br />7071, <br />7193, <br />7313, <br />7431, <br />7547, <br />7660, <br />7771, <br />7880, <br />7986, <br />8090, <br />8191, <br />8290, <br />8386, <br />8480, <br />8571, <br />8660, <br />8746, <br />8829, <br />8910, <br />8987, <br />9063, <br />9135, <br />9205, <br />9271, <br />9335, <br />9396, <br />9455, <br />9510, <br />9563, <br />9612, <br />9659, <br />9702, <br />9743, <br />9781, <br />9816, <br />9848, <br />9876, <br />9902, <br />9925, <br />9945, <br />9961, <br />9975, <br />9986, <br />9993, <br />9998, <br />10000,<br />9998, <br />9993, <br />9986, <br />9975, <br />9961, <br />9945, <br />9925, <br />9902, <br />9876, <br />9848, <br />9816, <br />9781, <br />9743, <br />9702, <br />9659, <br />9612, <br />9563, <br />9510, <br />9455, <br />9396, <br />9335, <br />9271, <br />9205, <br />9135, <br />9063, <br />8987, <br />8910, <br />8829, <br />8746, <br />8660, <br />8571, <br />8480, <br />8386, <br />8290, <br />8191, <br />8090, <br />7986, <br />7880, <br />7771, <br />7660, <br />7547, <br />7431, <br />7313, <br />7193, <br />7071, <br />6946, <br />6819, <br />6691, <br />6560, <br />6427, <br />6293, <br />6156, <br />6018, <br />5877, <br />5735, <br />5591, <br />5446, <br />5299, <br />5150, <br />5000, <br />4848, <br />4694, <br />4539, <br />4383, <br />4226, <br />4067, <br />3907, <br />3746, <br />3583, <br />3420, <br />3255, <br />3090, <br />2923, <br />2756, <br />2588, <br />2419, <br />2249, <br />2079, <br />1908, <br />1736, <br />1564, <br />1391, <br />1218, <br />1045, <br />871,<br />697, <br />523, <br />348, <br />174, <br />}; //存储sin函数的91个单元,每<br />个单元存递增一度的sin值,放大了100000倍;<br />unsigned int i=0,j=0;<br />unsigned long int k=0,t=0,N=0,M=9; //M值的大小和Fc有关系, Ud<br />不变,Uc随着Fc的改变而改变,<br />所以M=Uc/Us值改变。<br />unsigned long int tm1=0,tm2=0,tm3=0;<br />unsigned int ADAcount=0,ischange=0,result=0,Fc=25; <br /><br />void initial(void);<br />void sysinit(void);<br />void intinit(void);<br />void evainit(void);<br />void ADInit(void);<br />void interrupt gptime1(void);<br />void interrupt nothing(void);<br />unsigned long int gettime(unsigned long int);<br /><br />main()<br />{ <br /> initial(); //系统初始化<br /> sysinit();<br /> intinit(); <br /> ADInit();<br /> evainit();<br /> N=1000*Fs/Fc;<br /> while(1)<br /> {<br /> if ( ADAcount>=200 ) // 如果ADAcount>=200,以下<br />开始转换和保存转换结果 <br /> {<br /> ADAcount=0; //清保存标志 <br /> result=(*RESULT0); //取ADCINT0通道转换结果 <br /> result>>=6; //取有效位<br /> if(result!=0)<br /> {<br /> Fc=result*50/1024; //将采进的电压值Uc转换为频率Fc<br /> if(Fc<=2)<br /> Fc=2;<br /> M=10*Fc/50; <br /> if(M<=1)<br /> M=1;<br /> if(M>=10)<br /> M=10;<br /> ischange=1;<br /> }<br /> *ADCTRL2= 0x2000;<br /> }<br /> }<br />}<br /><br />void initial(void)<br />{<br /> asm(" setc INTM"); //禁止中断<br /> asm(" clrc SXM"); //清标志位<br /> asm(" clrc OVM"); //OVM清零,累加器中结果正常溢出<br /> asm(" clrc CNF"); //CNF清零,B0被设置为数据存储区<br />}<br /><br />void sysinit(void) <br />{<br /> *WDCR=0x68 ; //看门狗定时控制寄存器<br /> *SCSR1=0x81fe; //系统控制及状态寄存器1,CPU时<br />钟频率设置,设为40MHZ<br /> *XINT1CR=*XINT2CR=0x8006; //禁止外部中断<br /> //*WSGR=0x0000; //设置外部存储器的接口<br />}<br /><br />void intinit(void)<br />{<br /> <br /> *IFR=0x003f; //清所有系统中断标志<br /> *IMR=0x0002; //开 INT2 中断 <br /> <br /> *EVAIFRA=0xffff; //清事件管理器A所有中断标志 <br /> *EVAIFRB=0xffff; //清事件管理器A所有中断标志 <br /> *EVAIFRC=0xffff; //清事件管理器A所有中断标志 <br /> *EVAIMRA=0x0200; //T1下溢中断 使能T1PINT <br /> *EVAIMRB=0; //屏蔽所有中断<br /> *EVAIMRC=0; //屏蔽所有中断<br />}<br /><br />void evainit(void)<br />{<br /> <br /> *MCRA=*MCRA|0X0fc0; //设置PWM1~6引脚<br /> *ACTRA=0X0999; //引脚PWM1、3、5低有效,<br />PWM2、4、6高有效。<br /> *T1PR=10000; //T1周期寄存器 值为10000<br /> *CMPR1=10000; //比较器的比较值,开始为10000,展空比0<br /> *CMPR2=10000;<br /> *CMPR3=10000;<br /> *T1CNT=0; //定时器1计数寄存器 <br /> *DBTCONA=0X08f4; //死区周期值为8,是能比较单元1、2、3<br />的死区操作;死区预分频系数为32,死区<br />值为7×32=224个CPU时钟周期,CPU时钟周期为50ns,定时器周期为7×32×25ns <br /> *COMCONA=0X8200; //比较控制寄存器A 允许比较,下溢重载<br /> *T1CON=0x0842; //定时器1控制寄存器 F=1,连续增减计数方式<br /> asm(" clrc INTM"); //开总中断 <br />}<br /><br />void ADInit(void) //初始化设置<br />{<br /> *ADCTRL1= 0x0900; //设置连续转换模式<br /> *MAXCONV = 0x0; //每次完成转换1个通道<br /> *CHSELSEQ1=0x0; // ADCIN0<br /> *ADCTRL2= 0x2000; //启动转换 <br />}<br /><br />void interrupt nothing(void)<br />{<br /> asm(" clrc INTM"); //开总中断<br /> return;<br /> } <br /> <br /><br />void interrupt gptime1(void)<br />{<br /> if(k>=N){ //如果完成了一个完整的正弦脉冲的转换,<br />重新开始转换一个新的脉冲,从0度开始<br /> k=0; <br /> if(ischange=1){ //如果ischange被置1,重新计算载波比N<br /> N=1000*Fs/Fc; <br /> ischange=0;<br /> } <br /> }<br /> t=k*360/N; //计算采样时间点tp的角度<br /> tm1=gettime(t%360); //计算第一相的开启时间ton<br /> tm2=gettime((t+120)%360); //计算第二相的开启时间<br /> tm3=gettime((t+240)%360); //计算第三相的开启时间<br /> k++; //用来计算下一个开启时间点<br /> ADAcount++; //计到200,ADC重新采样,计算给定的<br /> 正弦调制波的频率 <br /> if(tm1<80) //消除窄脉冲<br /> tm1=0;<br /> if(tm1>19920)<br /> tm1=20000;<br /> *CMPR1=(20000-tm1)/2; //将开启时间赋给比较寄存器<br /><br /> if(tm2<80)<br /> tm2=0; <br /> if(tm2>19920)<br /> tm2=20000; <br /> *CMPR2=(20000-tm2)/2; <br /> if(tm3<80)<br /> tm3=0;<br /> if(tm3>19920)<br /> tm3=20000;<br /> *CMPR3=(20000-tm3)/2;<br /><br /> *EVAIFRA=0xffff; // 清事件管理器A所有中断标志 <br /> asm(" clrc INTM"); //开总中断 <br />}<br /><br />unsigned long int gettime(unsigned long int angle)<br />{ //计算开启时间<br /> unsigned long int num=0;<br /> if (angle>=180)<br /> num=(100000-M*csin)/Fs/5; //其中/5是为了除去放大做法的影响,<br />包括 sin值放大和计时放大。<br /> else<br /> num=(100000+M*csin)/Fs/5; <br /> if(num>=20000)<br /> num=20000;<br /> if(num<=0)<br /> num=0;<br /> return num;<br />}<br /><br />在贴个汇编的
《三相交流异步电动机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 />还有本dsp2000入门与提高,也看看吧
ddddd
ddddd 谢谢谢 非常感谢 不错 看了半天没理解不知道网上搜了一个 对不对SPWM与SVPWM的比较
SPWM原理正弦PWM的信号波为正弦波,就是正弦波等效成一系列等幅不等宽的矩形脉冲波形,其脉冲宽度是由正弦波和三角波自然相交生成的.正弦波波形产生的方法有很多种,但较典型的主要有:对称规则采样法、不对称规则采样法和平均对称规则采样法三种.第一种方法由于生成的PWM脉宽偏小,所以变频器的输出电压达不到直流侧电压的倍;第二种方法在一个载波周期里要采样两次正弦波,显然输出电压高于前者,但对于微处理器来说,增加了数据处理量当载波频率较高时,对微机的要求较高;第三种方法应用最为广泛的,它兼顾了前两种方法的优点. SPWM虽然可以得到三相正弦电压,但直流侧的电压利用率较低, 最大是直流侧电压的倍,这是此方法的最大的缺点.
SVPWM原理 电压空间矢量PWM(SVPWM)的出发点与SPWM不同,SPWM调制是从三相交流电源出发,其着眼点是如何生成一个可以调压调频的三相对称正弦电源.而SVPWM是将逆变器和电动机看成一个整体,用八个基本电压矢量合成期望的电压矢量,建立逆变器功率器件的开关状态,并依据电机磁链和电压的关系,从而实现对电动机恒磁通变压变频调速.若忽略定子电阻压降,当定子绕组施加理想的正弦电压时,由于电压空间矢量为等幅的旋转矢量,故气隙磁通以恒定的角速度旋转,轨迹为圆形. SVPWM比SPWM的电压利用率高15%,这是两者最大的区别,但两者并不是孤立的调制方式,典型的SVPWM是一种在SPWM的相调制波中加入了零序分量后进行规则采样得到的结果,因此SVPWM有对应SPWM的形式.反之,一些性能优越的SPWM方式也可以找到对应的SVPWM算法,所以两者在谐波的大致方向上是一致的,只不过SPWM易于硬件电路实现,而SVPWM更适合于数字化控制系统. 看看 多谢楼主 这个太老了,还是汇编的,TI网上有C语言的,更适合学习…… 好东西,留着有用 好东西,留着有用:) 辛苦楼主,必须力顶 x125852095 发表于 2013-5-22 14:51 static/image/common/back.gif
辛苦楼主,必须力顶
看到过有人找过这方面的资料 曾经也做过这个! 好东西啊,多谢楼主。 可以用?
页:
[1]
2