前言
关于DSP28335的书籍有很多,但都是从乏味的寄存器开始入手。对于新手可能不是很友好,因此关于DSP的学习记录我打算从应用入手去学习寄存器的用法和配置。
一、示波器检测PWM波
1、对应引脚说明
此次实验用J4模块引脚的XPWM1和XPWM2分别产生ePWM1A和ePWM1B,对应芯片GPIO0和GPIO1引脚。
2、PWM波形
黄色线为EPWM1A,紫色线为EPWM1B。从示波器波形中我们可以看到PWM的要求:配置EPWM1频率为10khz,1A和1B互补,死区延时5us,死区延时设置为A上升沿延时和B下降沿延时。如何设置频率和死区延时时间下文会讲。
二、寄存器配置及代码实现
PWM模块可以分为时基模块(TB)、计数比较器模块(CC)、死区产生模块(DB)、斩波模块(PC)和事件触发模块。PWM的频率主要是对时基模块的和计数比较器模块的寄存器进行设置,死区模块自然就是设置死区。
1.时基模块寄存器配置
TB寄存器非常多。但我们只需要对颜色框内进行设置,其他为默认值。
红色框——TBCTL(时基控制寄存器):
DSP时钟为150MHZ,我们PWM-TBCLK只需要75MHZ。那怎么办呢?CLKDIV和HSPCLKDIV寄存器的作用就体现出来了:对系统时钟(SYSCLKOUT)进行分频
CLKDIV设为1,HSPCLKDIV设为2。CTRMOOE选择向上-下计数模式,时基控制寄存器部分代码如下
SysCtrlRegs.PCLKCR0.bit.TBCLKSYNC =0; //禁止使用EPwm时钟,可使所有EPwm模块同步使用时基时钟
EPwm1Regs.TBCTL.bit.CLKDIV =TB_DIV1; //时钟不分频
EPwm1Regs.TBCTL.bit.HSPCLKDIV =TB_DIV2; //系统150MHz经过2倍分频后为75MHz
EPwm1Regs.TBCTL.bit.CTRMODE =0x2; //使用增减计数模式
绿色框——TBPRD(时基周期寄存器):
用来设置PWM波周期。周期设定好,倒数频率就设定好了。我们的要求是10MHZ,上下计数模式为向上或向下计数模式的两倍周期,即
EPwm1Regs.TBPRD =3750; //pwm频率为10khz
黄色框(时基相位寄存器和)
代码如下(示例):
EPwm1Regs.TBPHS.half.TBPHS =0; //相位为0
2.计数比较模块和动作模块
计数比较模块是以时基计数器的值作为输入,与比较寄存器CMPA和比较寄存器CMPB不断进行比较,当时基计数器的值等于其中之一时,就会产生相应事件。
①产生比较事件具体取决于编程时是采用寄存器 A 或者 B:
CTR=CMPA:时基计数器的值与比较寄存器A的值相同
CTR=CMPB:时基计数器的值与比较寄存器B的值相同
②动作模块 AC恰当配置后可以控制 PWM 的占空比。
③采用影子寄存器来更新比较值可以有效防止在 PWM 周期内出现故障以及毛刺。
EPwm1Regs.CMPCTL.bit.SHDWAMODE =1;
EPwm1Regs.CMPCTL.bit.SHDWBMODE =1; //CMPB寄存器采用直接模式
EPwm1Regs.CMPA.half.CMPA =1875; //占空比初值50%
EPwm1Regs.AQCTLA.bit.CAU =2; //CTR=CMPA增计数时,EPwmA输出高电平
EPwm1Regs.AQCTLA.bit.CAD =1; //CTR=CMPA减计数时,EPwmA输出低电平
EPwm1Regs.AQCTLB.bit.CAU =1; //CTR=CMPA增计数时,EPwmB输出低电平
EPwm1Regs.AQCTLB.bit.CAD =2; //CTR=CMPA减计数时,EPwmB输出高电平
EPwm1Regs.AQSFRC.all =0;
EPwm1Regs.AQCSFRC.all =0; //动作软件强制与连续软件强制寄存器均不启用
EPwm1Regs.DBCTL.bit.IN_MODE =2; //EPwm1A为上升沿延时,1B为下降沿延时
EPwm1Regs.DBCTL.bit.POLSEL =1; //1A翻转
EPwm1Regs.DBCTL.bit.OUT_MODE =3; //使能上升沿和下降沿延时
EPwm1Regs.DBRED =375; //上升沿死区时间5us
EPwm1Regs.DBFED =375; //下降沿死区时间5us
EPwm1Regs.ETSEL.bit.INTEN =1; //EPwm中断使能
EPwm1Regs.ETSEL.bit.INTSEL =2; //EPwm中断条件为CTR=PRD
EPwm1Regs.ETPS.bit.INTPRD =1; //事件分频寄存器,每发生一次事件,中断一次
以上就是计数比较模块和动作模块的代码,画幅图利于理解上述代码。
因为这PWM用于H桥电机可逆系统,所以一开始我们设置占空比为50%。后续再设置中断调节运行时的占空比。总的意思就是我们只调用CMPA比较寄存器来改变EPWMA和EPWMB,既然是H桥,那必须设置延时,不然容易导致两组晶闸管同时导通,容易照成事故。
3.死区产生模块
对于死区模块,我们只需要对(IN_MODE和OUT_MODE)、(DBRED和DBFED)这两组寄存器设置即可,具体见代码注释,具体死区时间见下文公式。
代码如下(示例):
EPwm1Regs.DBCTL.bit.IN_MODE =2; //EPwm1A为上升沿延时,1B为下降沿延时
EPwm1Regs.DBCTL.bit.POLSEL =1; //1A翻转
EPwm1Regs.DBCTL.bit.OUT_MODE =3; //使能上升沿和下降沿延时
EPwm1Regs.DBRED =375; //上升沿死区时间5us
EPwm1Regs.DBFED =375; //下降沿死区时间5us
死区设置遵循A上升沿延时,B下降沿延时。
延时时间一般1-5us,假设延时时间为1us。计算公式如下
文章来源:https://www.toymoban.com/news/detail-464581.html
总结
以上就是DSP28335产生PWM波的主程序部分,完整代码还需要加入中断。完整代码见本人发布的资源PWM_code文章来源地址https://www.toymoban.com/news/detail-464581.html
到了这里,关于DSP28335学习笔记-产生PWM波 ——从应用角度出发的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!