dsp28335例程pwm讲解

dsp的pwm信号 dsp28335共12路16位的epwm,能进行频率和占空比控制。 epwm的时钟tbclk=sysclkout/(hspclkdiv×clkdiv):
pwm信号频率由时基周期寄存器tbpdr和时基计数器的计数模式决定。初始化程序采用的计数模式为递增计数模式。在递增计数模式下,时基计数器从零开始增加,直到达到周期寄存器值(tbpdr)。然后时基计数器复位到零,再次开始增加。
pwm信号周期与频率的计算如下:
端口对应关系
说明: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
//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模块中使用的。

7.5 GHz!!!鼎阳科技重磅发布SSA3000X-R系列实时频谱分析仪
NAND Flash和NOR Flash的比较
增强现实技术(AR)和虚拟现实技术(VR)的区别
智慧驱动的新数据时代,存储需要变革
rfid电子标签无源高频NFC标签
dsp28335例程pwm讲解
中科科技冲击高端隔膜市场
针对Google Wifi路由器出现连接频繁中断问题 谷歌提出临时修复方案
低温试验检查测试低温环境对仪器仪表的影响
四个有趣的真实漏洞挖掘案例
斐纳最新推出的扫地机器人究竟怎么样
最新FORESEE DDR4全方位测评
大量程、高精度的绝对距离测量方法有哪几种?
PROFIBUS,PROFINET,Ethernet三者的区别
大量的科技工作岗位将扩展到美国西海岸以外
智能无人作战力量的场景运用研究
LiNbO3选择性刻蚀的研究
锤子坚果Pro2评测 细节表现让人印象深刻
在智能制造装备市场中高端机床的发展趋势将会如何
微雪电子EP4C FPGA NIOSII开发板简介