dsp28335例程pwm讲解

电子常识

2647人已加入

描述

DSP的PWM信号

DSP28335共12路16位的ePWM,能进行频率和占空比控制。 ePWM的时钟TBCLK=SYSCLKOUT/(HSPCLKDIV×CLKDIV):

DSP28335

PWM信号频率由时基周期寄存器TBPDR和时基计数器的计数模式决定。初始化程序采用的计数模式为递增计数模式。在递增计数模式下,时基计数器从零开始增加,直到达到周期寄存器值(TBPDR)。然后时基计数器复位到零,再次开始增加。

DSP28335

PWM信号周期与频率的计算如下:

DSP28335

端口对应关系

DSP28335

说明:JP0B的端口号按“Z”字形顺序数。

初始化程序注释 void InitPwm1AB(float32 f)

{

Uint16 T= 2343750/f-1.0;//系统时钟SYSCLKOUT=150MHz,

TBCLK=6.6666667ns,在连续增计数模式下,f=150000000/(TBPDR+1)

EALLOW;

//先初始化通用输入输出口//

GpioCtrlRegs.GPAPUD.bit.GPIO0 = 0;

GpioCtrlRegs.GPAMUX1.bit.GPIO0 = 1;

GpioCtrlRegs.GPAPUD.bit.GPIO1 = 0; GpioCtrlRegs.GPAMUX1.bit.GPIO1 = 1;

EPwm1Regs.TBPHS.half.TBPHS = 0; // 在相位寄存器中设置计数器的起始计数位置

//下面两条语句组合对PWM的时钟进行分频

EPwm1Regs.TBCTL.bit.CLKDIV = 6;

EPwm1Regs.TBCTL.bit.HSPCLKDIV = 0;

EPwm1Regs.TBPRD = T; //在周期寄存器中设置计数器的计数周期

//TBCTL为定时器控制寄存器

EPwm1Regs.TBCTL.bit.CTRMODE = TB_COUNT_UP; //设置计数模式位为连续增计数模式,产生对称方波

EPwm1Regs.TBCTL.bit.PHSEN = TB_DISABLE; // 将定时器相位使能位关闭

EPwm1Regs.TBCTL.bit.PRDLD = TB_SHADOW;//映射寄存器SHADOW使能并配置映射寄存器为自动读写

EPwm1Regs.TBCTL.bit.SYNCOSEL = TB_CTR_ZERO; // 定时器时钟源选择,一共有四种时钟源

EPwm1Regs.CMPA.half.CMPA= 0.0001*T;// 设置EPWM1A比较值寄存器的比较值,即体现EPWM1A的占空比

EPwm1Regs.CMPB= 0.0001*T;

EPwm1Regs.CMPCTL.bit.SHDWAMODE = CC_SHADOW;//A模块比较模式 EPwm1Regs.CMPCTL.bit.SHDWBMODE = CC_SHADOW;//B模块比较模式 EPwm1Regs.CMPCTL.bit.LOADAMODE = CC_CTR_ZERO; // A模块比较使能,

通过写0来清除SHDWAMODE位来使能load on CTR=Zero

EPwm1Regs.CMPCTL.bit.LOADBMODE = CC_CTR_ZERO; // B模块比较使能,

通过写0来清除SHDWBMODE位来使能load on CTR=Zero

//AQCTLA为输出A比较方式控制寄存器

EPwm1Regs.AQCTLA.bit.ZRO = AQ_SET; // TBCTR(计数器)计到零时使输出为反向

EPwm1Regs.AQCTLA.bit.CAU = AQ_CLEAR;//TBCTR(计数器)与CMPA在up计数时相等使输出为high,这关系的输出的占空比

EPwm1Regs.AQCTLB.bit.ZRO = AQ_SET;

EPwm1Regs.AQCTLB.bit.CBU = AQ_CLEAR;

EDIS;

}

Dsp28335 - ePWM - 50Hz小舵机的控制 - 代码例程

使用dsp28335控制舵机,使用pwm信号。

28xx设置的sysclk为150MHz,大家用的时候主频一定要搞清楚,看看底层代码,ti的数据手册虽然是英文的但是看起来很容易,配置起来也很简单无脑。

初始化不多说,这里我用的pwm只是用的最基本功能,dsp中的ePwm模块的功能非常强大,很多功能我都使用不到,有需要的可以针对性的看下。

void InitEPwm3Gpio(void)

{

EALLOW;

/* Enable internal pull-up for the selected pins */

// Pull-ups can be enabled or disabled by the user.

// This will enable the pullups for the specified pins.

// Comment out other unwanted lines.

GpioCtrlRegs.GPAPUD.bit.GPIO4 = 0; // Enable pull-up on GPIO4 (EPWM3A)

GpioCtrlRegs.GPAPUD.bit.GPIO5 = 0; // Enable pull-up on GPIO5 (EPWM3B)

/* Configure ePWM-3 pins using GPIO regs*/

// This specifies which of the possible GPIO pins will be ePWM3 functional pins.

// Comment out other unwanted lines.

GpioCtrlRegs.GPAMUX1.bit.GPIO4 = 1; // Configure GPIO4 as EPWM3A

GpioCtrlRegs.GPAMUX1.bit.GPIO5 = 1; // Configure GPIO5 as EPWM3B

EDIS;

}

这里使用的是GPIO4和GPIO5,其他引脚同理。为了提高驱动能力使用Pullup模式。

设置Mux寄存器为1选择ePWM功能。

void EPwmSetup(void)

{

InitEPwm3Gpio();

EPwm3Regs.TBSTS.all=0;

EPwm3Regs.TBPHS.half.TBPHS=0;

EPwm3Regs.TBCTR=0;

//EPwm2Regs.CMPCTL.all=0x50; // Immediate mode for CMPA and CMPB

EPwm3Regs.CMPCTL.bit.SHDWBMODE = 0x0;

EPwm3Regs.CMPCTL.bit.SHDWAMODE = 0x0;

EPwm3Regs.CMPCTL.bit.LOADBMODE = 0x0;

EPwm3Regs.CMPCTL.bit.LOADAMODE = 0x0;

EPwm3Regs.CMPA.half.CMPA = 6250;

EPwm3Regs.CMPB=3125;

//EPwm3Regs.AQCTLA.all=0x60; // EPWMxA = 1 when CTR=CMPA and counter inc

// EPWMxA = 0 when CTR=CMPA and counter dec

EPwm3Regs.AQCTLA.bit.CBD = 0x0;

EPwm3Regs.AQCTLA.bit.CBU = 0x0;

EPwm3Regs.AQCTLA.bit.CAD = 0x0;

EPwm3Regs.AQCTLA.bit.CAU = 0x1;

EPwm3Regs.AQCTLA.bit.PRD = 0x0;

EPwm3Regs.AQCTLA.bit.ZRO = 0x2;

//EPwm3Regs.AQCTLA.all = 0x0012;

EPwm3Regs.AQCTLB.bit.CBD = 0x0;

EPwm3Regs.AQCTLB.bit.CBU = 0x1;

EPwm3Regs.AQCTLB.bit.CAD = 0x0;

EPwm3Regs.AQCTLB.bit.CAU = 0x0;

EPwm3Regs.AQCTLB.bit.PRD = 0x0;

EPwm3Regs.AQCTLB.bit.ZRO = 0x2;

//EPwm3Regs.AQCTLB.all = 0x0102;

EPwm3Regs.AQSFRC.bit.RLDCSF = 0x0;

EPwm3Regs.AQCSFRC.all=0x0;

EPwm3Regs.DBCTL.all=0x0;

EPwm3Regs.DBRED=0;

EPwm3Regs.DBFED=0;

EPwm3Regs.TZSEL.all=0;

EPwm3Regs.TZCTL.all=0;

EPwm3Regs.TZEINT.all=0;

EPwm3Regs.TZFLG.all=0;

EPwm3Regs.TZCLR.all=0;

EPwm3Regs.TZFRC.all=0;

EPwm3Regs.ETSEL.all=0; // Interrupt when TBCTR = 0x0000

EPwm3Regs.ETFLG.all=0;

EPwm3Regs.ETCLR.all=0;

EPwm3Regs.ETFRC.all=0;

EPwm3Regs.PCCTL.all=0;

EPwm3Regs.TBPRD=62499;

EPwm3Regs.TBCTL.bit.FREE_SOFT = 0x2;

EPwm3Regs.TBCTL.bit.CLKDIV = 0x2;

EPwm3Regs.TBCTL.bit.HSPCLKDIV = 0x6;

EPwm3Regs.TBCTL.bit.SYNCOSEL = 0x3;

EPwm3Regs.TBCTL.bit.PRDLD = 0x0;

EPwm3Regs.TBCTL.bit.PHSEN = 0x0;

EPwm3Regs.TBCTL.bit.CTRMODE = 0x0;

}

模块的初始化

1、注意TBxxx的寄存器控制的是ePWM模块的时钟源,还有外部事件发生的载入计数值以及周期寄存器值,这里我只指出常用的寄存器。这里要根据自己的主频来,我用的是推荐的最高主频150MHz,还有一点要注意的是在UpCount和DownCount的计数方式下PWM周期为(TBPRD+1)*Ttbclk

DSP28335

//3.125MHz.//period 62500.//1ms-》3125.//2ms-》6250

这里自己一定要算清楚,以上几个数据分别是在150MHz主频下此代码产生的1/Ttbclk、周期寄存器值、1ms对应的CMP寄存器值和2ms对应的CMP寄存器值。

2、CMPxxx控制的是与CTR计数器作比较的寄存器值,还有几个控制寄存器。其中需要注意的是dsp的pwm和其他mcu一样为了保护周期信号的完整性采用的缓冲格式,具体的是它成为“shadow”的一种模式,可以使能,也可以不使能。因为控制的是舵机,必须保证信号的周期是完整的20ms,所以选择shadow模式。主要是CMP比较寄存器值的shadow模式,因为周期Period寄存器20ms是固定不变的,设置不设置的无所谓了。

3、AQCTLA和AQCTLB寄存器主要控制的是事件发生时的电平变化情况,这两个寄存器根据自己的需要可以有很多不同的配制方法,是产生电平变化主要要配置的。PWMxA和PWMxB之间使用共同的PRD、CMPA、CMPB以及一些外部事件,这里我不需要那么复杂,只需要两路PWM既可以。

4、剩下几个模块有死区延迟、斩波处理pwm、强制转换电平、pwm中断几种,根据自己的需要再去看吧,控制舵机是完全用不上了。修改占空比只需要

EPwm3Regs.CMPA.half.CMPA = 6250;

EPwm3Regs.CMPB=3125;

改变这两个寄存器。至于为什么CMPA的寄存器和CMP不同,看看底层就明白了,因为CMPA是32位的,其中还有16位是用来组合在HRPWM模块中使用的。

打开APP阅读更多精彩内容
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
评论(0)
发评论
leadgle 2019-08-05
0 回复 举报
讲得很详细 收起回复

全部0条评论

快来发表一下你的评论吧 !

×
20
完善资料,
赚取积分