![]() |
|
||||||||||||||
| . 网站首页 . 新闻 . 新品 . 方案 . 专访 . 活动 . DSP . EDA . 评测室 . 技术文库 . 会员区 . 商城 . 服务导航 . 邮购 . 资源 . | ||
|
||
|
|||||
| TMS320F2812的SPWM原程序 | |||||
作者:Free 文章来源:Free 点击数: 更新时间:2008-1-2 ![]() |
|||||
|
//实现了SPWM的输出 #include "DSP281x_Device.h" #include "stdio.h" #include "math.h" #include "float.h" #define NX 404 #define PI 3.1415925 float M=0.8; int k0=0,h1=0; double a[NX]; void zkb(); interrupt void eva_T1UFINT_ISR(void); unsigned int n=0; float q,l,j; void main(void) { InitSysCtrl(); //系统初始化 DINT; //禁止全局中断 IER=0x0000; IFR=0x0000; EALLOW; GpioMuxRegs.GPAMUX.all = 0x00FF; // EVA PWM 1-6 pins EDIS; InitPieCtrl(); InitPieVectTable(); EALLOW; //使能定时器1下益中断 PieVectTable.T1UFINT=&eva_T1UFINT_ISR; EDIS; IER|=M_INT2; //开中断2 PieCtrlRegs.PIEIER2.bit.INTx6=1; //开下益中断 //////////////////// while (n<=NX) { q=(n+0.75); //为消除偶次偕波,减少谐波角度出发,选择从A相3/4周期进行采样 q=q*2*PI; q/=405; j=sin(q); l=1875*(1+M*j);//M为调制比 //计算占空比表达式 //if(l>=187&l<=1687)(此处网友设置为错误的) if(l>=375&l<=3375) a[n]=l; else { if(l>3375) a[n]=3375; else a[n]=375; } n=n+1; } ////////////////////////////// ///init_eva /////////////////////////////// EvaRegs.ACTRA.all=0x0666; EvaRegs.DBTCONA.all = 0x0000; // Disable deadband EvaRegs.COMCONA.all = 0xa600; //使能比较操作 EvaRegs.EVAIMRA.all=0x0200; //EVAIMRA(EVA的中断屏蔽寄存器A).T1UIINT(通用定时器1的下溢中断使能) EvaRegs.EVAIMRB.all=0x0000; EvaRegs.EVAIMRC.all=0x0000; EvaRegs.EVAIFRA.all=0xffff;//EVAIFRA(EVA的中断标志寄存器.T1UIINT(通用定时器1的下溢中断标志) EvaRegs.EVAIFRB.all=0xffff;//写1清除定时器1的下溢中断标志 EvaRegs.EVAIFRC.all=0xffff; EvaRegs.CMPR1=0; //初始化寄存器的值 EvaRegs.CMPR2=0; EvaRegs.CMPR3=0; EvaRegs.GPTCONA.all=0x0041; //周期必须大于最大的正弦表格值 EvaRegs.T1PR = 3750; // Timer1 period PWM载波周期为 65536个定标的定时器时钟周期 //EvaRegs.T1PR = 0xffff; //EvaRegs.T1CNT = 937; // Timer1 counter EvaRegs.T1CNT = 937; //EvaRegs.T1CON.all = 0x0b4e; // 选择模式产生PWM波10 EvaRegs.T1CON.all = 0x0b4e; EINT; return; /////////////////////////// EvaRegs.T1CON.all=EvaRegs.T1CON.all|0x0040; //启动定时器1 for(;;); } interrupt void eva_T1UFINT_ISR(void) // EV-A { int h2; int flag; flag=(EvaRegs.EVAIFRA.all)&0x0200; //T1UFINT中下益中断标志位置1 if(flag!=0x0200) { EINT; return; } else { if(k0<=NX) { h1=k0+135; //B相表达式 if(h1>=404)h1=h1-404; h2=k0+270; //C相表达式 if(h2>=404)h2=h2-404; EvaRegs.CMPR1=a[k0]; EvaRegs.CMPR2=a[h1]; //更新比较寄存器2的值 EvaRegs.CMPR3=a[h2]; //更新比较寄存器3的值 k0=k0+1; } else { k0=0; } } EvaRegs.EVAIMRA.bit.T1UFINT=1; //清除中断屏蔽标志 EvaRegs.EVAIFRA.bit.T1UFINT=1; //清楚中断使能标志 PieCtrlRegs.PIEACK.all=0x0002; //响应同组中断 EINT; //开全局中断 } |
|||||
| 欢迎点击进入:TI德州中文网 (国内唯一针对TI应用的中文技术网站) 文章录入:admin 责任编辑:admin | |||||
| 【发表评论】【加入收藏】【告诉好友】【打印此文】【关闭窗口】 | |||||
| 网友评论:(只显示最新10条。评论内容只代表网友观点,与本站立场无关!) |
| | 设为首页 | 加入收藏 | 联系站长 | 友情链接 | 版权申明 | 网站公告 | 管理登录 | | |||
|
|