DSP28335学习笔记-产生PWM波 ——从应用角度出发

文章目录

  • 前言
  • 一、示波器检测PWM波
    • 1、对应引脚说明
    • 2、PWM波形
  • 二、寄存器配置及代码实现
    • 1.时基模块寄存器配置
    • 2.计数比较模块和动作模块
    • 3.死区产生模块
  • 总结


前言

关于DSP28335的书籍有很多,但都是从乏味的寄存器开始入手。对于新手可能不是很友好,因此关于DSP的学习记录我打算从应用入手去学习寄存器的用法和配置。


一、示波器检测PWM波

1、对应引脚说明

此次实验用J4模块引脚的XPWM1和XPWM2分别产生ePWM1A和ePWM1B,对应芯片GPIO0和GPIO1引脚。
DSP28335学习笔记-产生PWM波 ——从应用角度出发_第1张图片
DSP28335学习笔记-产生PWM波 ——从应用角度出发_第2张图片

2、PWM波形

DSP28335学习笔记-产生PWM波 ——从应用角度出发_第3张图片
黄色线为EPWM1A,紫色线为EPWM1B。从示波器波形中我们可以看到PWM的要求:配置EPWM1频率为10khz,1A和1B互补,死区延时5us,死区延时设置为A上升沿延时和B下降沿延时。如何设置频率和死区延时时间下文会讲。

二、寄存器配置及代码实现

DSP28335学习笔记-产生PWM波 ——从应用角度出发_第4张图片
PWM模块可以分为时基模块(TB)、计数比较器模块(CC)、死区产生模块(DB)、斩波模块(PC)和事件触发模块。PWM的频率主要是对时基模块的和计数比较器模块的寄存器进行设置,死区模块自然就是设置死区。

1.时基模块寄存器配置

DSP28335学习笔记-产生PWM波 ——从应用角度出发_第5张图片

TB寄存器非常多。但我们只需要对颜色框内进行设置,其他为默认值。
红色框——TBCTL(时基控制寄存器):
DSP时钟为150MHZ,我们PWM-TBCLK只需要75MHZ。那怎么办呢?CLKDIV和HSPCLKDIV寄存器的作用就体现出来了:对系统时钟(SYSCLKOUT)进行分频
DSP28335学习笔记-产生PWM波 ——从应用角度出发_第6张图片
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,上下计数模式为向上或向下计数模式的两倍周期,即
DSP28335学习笔记-产生PWM波 ——从应用角度出发_第7张图片

EPwm1Regs.TBPRD             =3750; //pwm频率为10khz

黄色框(时基相位寄存器和)

代码如下(示例):

		EPwm1Regs.TBPHS.half.TBPHS  =0; //相位为0

2.计数比较模块和动作模块

计数比较模块是以时基计数器的值作为输入,与比较寄存器CMPA和比较寄存器CMPB不断进行比较,当时基计数器的值等于其中之一时,就会产生相应事件。
DSP28335学习笔记-产生PWM波 ——从应用角度出发_第8张图片
①产生比较事件具体取决于编程时是采用寄存器 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;	//事件分频寄存器,每发生一次事件,中断一次

以上就是计数比较模块和动作模块的代码,画幅图利于理解上述代码。
DSP28335学习笔记-产生PWM波 ——从应用角度出发_第9张图片因为这PWM用于H桥电机可逆系统,所以一开始我们设置占空比为50%。后续再设置中断调节运行时的占空比。总的意思就是我们只调用CMPA比较寄存器来改变EPWMA和EPWMB,既然是H桥,那必须设置延时,不然容易导致两组晶闸管同时导通,容易照成事故。

3.死区产生模块

DSP28335学习笔记-产生PWM波 ——从应用角度出发_第10张图片对于死区模块,我们只需要对(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下降沿延时。
DSP28335学习笔记-产生PWM波 ——从应用角度出发_第11张图片延时时间一般1-5us,假设延时时间为1us。计算公式如下
DSP28335学习笔记-产生PWM波 ——从应用角度出发_第12张图片

总结

以上就是DSP28335产生PWM波的主程序部分,完整代码还需要加入中断。完整代码见本人发布的资源PWM_code

你可能感兴趣的:(DSP,学习,单片机,dsp开发,嵌入式硬件)