“简简单单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
}
回复 楼主 superwangyang 的帖子
辛苦了。不容易啊。。。。编辑这么长。。。。模范啊。。。。
我的邮箱gaoxiaoan123@163.com!回帖是一种美德!互相帮助,共同进步!
口头禅:生活在于创造机会,把握机会!
辛苦了 支持下!
喜欢单片机的请加群48811593(500人超级群)
为什么在将FCMP1OE等设置为0,这样pwm不是不能输出了吗?困惑好久,请楼主解答~~~~(>_<)~~~~
lz辛苦了,我最近在玩dsp2812,io和定时器,ad和ea都调通了,看了lz这帖感觉很熟悉,呵呵。
好版主!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!