“简简单单DSP”系列学习活动—第七期事件管理器——PWM

superwangyang   2009-11-21 17:46 楼主
“简简单单DSP”系列学习活动—第七期事件管理器——PWM
四、        PWM电路
每一个事件管理器有三个比较单元,每一个比较单元有两个互补的PWM输出,这样三个比较单元就可以产生6路PWM,并且死区时间和输出极性可编程,能够被灵活的应用在电机控制、三相电源变换器中。
PWM单元电路包括如下功能单元:
A、        非对称/对称波形发生器
B、        可编程的死区单元
C、        输出逻辑
D、        空间矢量PWM状态机
PWM单元的存在就减少了CPU的开销,只要设置好就会自动产生PWM波形,就像DMA的存在一样,也同定时器工作一样。可以用到它的中断去改变占空比,如果是固定输出的配置好一切皆OK。对于EVA模块产生PWM用到的寄存器主要有:CMPRX、T1PR、T1CNT、T1CON、COMCONA、ACTRA、DBTCONA(死区控制寄存器),他用的时基单元是通用定时器1,参照上面说得比较单元的设置,因此还包括通用定时器1的基本设置。
使用比较单元以及相关电路产生PWM波形,需要对事件管理器的寄存器进行配置,具体步骤和C代码如下:
(1)时钟设置和通用定时器1的时钟设置操作一样,包括选择内部还是外部时钟以及与分频系数在设置这个之前要保证EVA的时钟开启;
        SysCtrlRegs.PCLKCR.bit.EVAENCLK=1;// EVA的时钟开启
EvaRegs.T1CON.bit.TCLKS10=0;//选择内部时钟
EvaRegs.T1CON.bit.TPS=3;//预分频8倍,如果HSPCLK=150M,那么通用定时器时钟频率是150/8M.
(2)        设置通用定时器1,参照上面的通用定时器设置,这里包括设置T1CNT,T1PR,通常T1CNT初始化设置为0,T1PR设置的是你的PWM的频率,根据自己的需要计算设置。
(3)        设置CMPRX,这个就是设置你的占空比
         EvaRegs.CMPR1 = 0x0C00;
         EvaRegs.CMPR2 = 0x3C00;
           EvaRegs.CMPR3 = 0xFC00;
通用定时器计数器T1CNT一直与比较寄存器比较,当发生比较匹配后,输出PWM引脚就会根据您的设置跳变,通用定时器计数器T1CNT继续计数一直到与周期寄存器周期匹配后,PWM输出引脚再次跳变,这样一直循环下去。
(4)        设置ACTRA
比较方式控制寄存器就是控制输出引脚发生跳变时的极性,还有就是空间矢量PWM产生的设置,这里不作介绍。ACTRA后12位设置PWM输出跳变的极性,每两位设置一个PWM引脚,这里设置和比较产生PWM时一样,需要注意的是一个比较寄存器控制的互补输出的一对PWM设置要正好相反。
EvaRegs.ACTRA.all = 0x0666;//PWM1、PWM3、PWM5输出高有效,PWM2 PWM4 PWM6输出低有效
(5)        设置比较控制寄存器COMCONA
这个寄存器包括设置比较寄存器CMPRX重新装载条件、方式控制寄存器重新装载条件、空间矢量PWM模式使能、使能比较寄存器、全比较器输出使能,其他三个比较器输出使能。
具体设置如下:
(5)比较器控制寄存器COMCONA设置
A、设置CMPRX重载条件
EvaRegs.COMCONA.bit.CLD=0;//当T1CNT=0(下溢)
EvaRegs.COMCONA.bit.CLD=1;//当T1CNT=0或T1CNT =T1PR(下溢后周期匹配)
EvaRegs.COMCONA.bit.CLD=2;//立即
EvaRegs.COMCONA.bit.CLD=3;//保留,结果不可测)
B、方式控制寄存器ACTRA重载条件设置
EvaRegs.COMCONA.bit.ACTRLD=0;// 当T1CNT=0(下溢)
        EvaRegs.COMCONA.bit.ACTRLD=1; 当T1CNT=0或T1CNT =T1PR(下溢后周期匹配)
EvaRegs.COMCONA.bit.ACTRLD=2;// 立即
EvaRegs.COMCONA.bit.ACTRLD=3;// 保留,结果不可测
E、        比较器使能位设置
EvaRegs.COMCONA.bit.CENABLE=0;//禁止比较操作,影子寄存器变透明

        EvaRegs.COMCONA.bit.CENABLE=1;//使能
F、        单个比较器使能
EvaRegs.COMCONA.bit.FCMP1OE=0;//全比较器1禁止

        EvaRegs.COMCONA.bit.FCMP1OE=1;// 全比较器使能
G、全比较器使能
        EvaRegs.COMCONA.bit.FCOMPOE=0;// EVA的三个比较器都禁止
EvaRegs.COMCONA.bit.FCOMPOE=1;// EVA的三个比较器都使能
H、空间矢量PWM模式使能位
EvaRegs.COMCONA.bit.SVENABLE=0;// 空间矢量PWM模式禁止
EvaRegs.COMCONA.bit. SVENABLE =1;// 空间矢量PWM模式使能

(6)        死区控制寄存器DBTCONA
死区控制寄存器设置的是使能死区和死区时间。可编程的死区单元有以下特点:
A、        一个16位死区控制寄存器DBTCONA,可读写
B、        一个16位输入时钟预定标器,其实就是分频器
C、        CPU时钟输入
D、        3个4位减计数的定时器
E、        死区时间是由CPU时钟、分频系数和那个3个4位减计数器共同确定的,DBTCONA【4~2】分频系数,以2的DBTCONA【4~2】次方为系数,DBTCONA【11~8】为递减计数器的值。
死区配置如下:
EvaRegs.DBTCONA.bit.DBTPS=3;//2的3次方对CPU时钟8分频
EvaRegs.DBTCONA.bit.DBT=15;//递减计数器从15开始
/* /
EvaRegs.DBTCONA.bit.EDBT1=1;//死区定时器1使能
EvaRegs.DBTCONA.bit.EDBT2=1;//死区定时器2使能
EvaRegs.DBTCONA.bit.EDBT3=1;//死区定时器3使能
(7)        相应的GPIO设置
要使用它的比较输出PWM功能,相应的GPIO要设置为复用功能,在DSP281x_Gpio.c库函数中void InitGpio(void)子函数设置,在主函数中调用。
函数C代码如下:
void InitGpio(void)
{

     EALLOW;
GpioMuxRegs.GPAMUX.bit.PWM1_GPIOA0=1;
GpioMuxRegs.GPAMUX.bit.PWM2_GPIOA1=1;
GpioMuxRegs.GPAMUX.bit.PWM3_GPIOA2=1;
GpioMuxRegs.GPAMUX.bit.PWM4_GPIOA3=1;
GpioMuxRegs.GPAMUX.bit.PWM5_GPIOA4=1;
GpioMuxRegs.GPAMUX.bit.PWM6_GPIOA5=1;

     EDIS;

}
(8)配置的C代码如下,这些在DSP281x_Ev.c库函数的void InitEv(void)子函数中,在主函数初始化的时候调用即可。
void InitEv(void)
{

        EvaRegs.T1CON.bit.TCLKS10=0;//选择内部时钟
        EvaRegs.T1CON.bit.TPS=4;//预分频8倍,如果HSPCLK=150M,那么通用定时器时钟频率是150/8M.
        EvaRegs.T1CON.bit.TMODE=2;//连续增计数模式
        EvaRegs.T1CNT=0x0000;   //计数器清0
    EvaRegs.T1PR =20000;  //周寄存器的值最大为65535
        EvaRegs.CMPR1=10000;//设置比较寄存器1
        EvaRegs.CMPR2=8000;//设置比较寄存器2
        EvaRegs.CMPR3=5000;//设置比较寄存器3
        EvaRegs.DBTCONA.bit.DBTPS=3;//2的3次方对CPU时钟8分频
        EvaRegs.DBTCONA.bit.DBT=15;//递减计数器从15开始
        EvaRegs.DBTCONA.bit.EDBT1=1;//死区定时器1使能
        EvaRegs.DBTCONA.bit.EDBT2=1;//死区定时器2使能
        EvaRegs.DBTCONA.bit.EDBT3=1;//死区定时器3使能
    EvaRegs.ACTRA.all = 0x0666;//PWM1、PWM3、PWM5输出高有效,PWM2 PWM4 PWM6输出低有效
        EvaRegs.COMCONA.bit.CLD=1;//当T1CNT=0或T1CNT =T1PR(下溢后周期匹配)
    EvaRegs.COMCONA.bit.ACTRLD=1;// 当T1CNT=0或T1CNT =T1PR(下溢后周期匹配)
        EvaRegs.COMCONA.bit.CENABLE=1;//使能
        EvaRegs.COMCONA.bit.SVENABLE=0;// 空间矢量PWM模式禁止
    EvaRegs.COMCONA.bit.FCOMPOE=1;// EVA的三个比较器都使能
        EvaRegs.T1CON.bit.TENABLE=1;//使能定时器1
}

回复评论 (12)

回复 楼主 superwangyang 的帖子

加油!在电子行业默默贡献自己的力量!:)
点赞  2009-11-22 12:49

回复 楼主 superwangyang 的帖子

辛苦了。不容易啊。。。。编辑这么长。。。。模范啊。。。。
我的邮箱gaoxiaoan123@163.com!回帖是一种美德!互相帮助,共同进步! 口头禅:生活在于创造机会,把握机会!
点赞  2009-11-22 17:41
点赞  2009-11-22 22:50
辛苦了 支持下!
喜欢单片机的请加群48811593(500人超级群)
点赞  2009-11-23 11:44
真正的好版主啊
点赞  2010-2-25 18:00
辛苦辛苦!!
点赞  2010-11-7 09:46
为什么在将FCMP1OE等设置为0,这样pwm不是不能输出了吗?困惑好久,请楼主解答~~~~(>_<)~~~~
点赞  2010-11-9 16:00
lz辛苦了,我最近在玩dsp2812,io和定时器,ad和ea都调通了,看了lz这帖感觉很熟悉,呵呵。
点赞  2010-11-13 18:04
先支持,后看
点赞  2011-7-30 10:51
先支持,后看
点赞  2011-7-30 10:51
好版主!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
点赞  2014-5-2 16:50
辛苦了。不容易啊。
点赞  2014-6-16 17:53
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 京公网安备 11010802033920号
    写回复