DSP28335学习笔记-产生PWM波 ——从应用角度出发
文章目录
- 前言
- 一、示波器检测PWM波
- 1、对应引脚说明
- 2、PWM波形
- 二、寄存器配置及代码实现
- 1.时基模块寄存器配置
- 2.计数比较模块和动作模块
- 3.死区产生模块
- 总结
前言
关于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.时基模块寄存器配置
![在这里插入图片描述](https://img-blog.csdnimg.cn/602276220d6145f7866516a27439ab56.png#pic_center
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倍分频后为75MHzEPwm1Regs.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; //上升沿死区时间5usEPwm1Regs.DBFED =375; //下降沿死区时间5usEPwm1Regs.ETSEL.bit.INTEN =1; //EPwm中断使能EPwm1Regs.ETSEL.bit.INTSEL =2; //EPwm中断条件为CTR=PRDEPwm1Regs.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; //上升沿死区时间5usEPwm1Regs.DBFED =375; //下降沿死区时间5us
死区设置遵循A上升沿延时,B下降沿延时。
延时时间一般1-5us,假设延时时间为1us。计算公式如下
总结
以上就是DSP28335产生PWM波的主程序部分,完整代码还需要加入中断。完整代码见本人发布的资源PWM_code
DSP28335学习笔记-产生PWM波 ——从应用角度出发相关推荐
- 启明智显分享| ESP32学习笔记参考--PWM(脉冲宽度调制) 篇,配PWM控制 LED呼吸灯代码示例参考
提示:启明智显专为智能产品提供一站式彩屏显示+连接+云端服务+APP软件开发.维护等解决方案,帮厂商快速实现硬件的智能化.作为启明云端旗下方案公司,我们用心整理了开发小伙伴在开发过程中可能会遇到的问题 ...
- STM8学习笔记---利用PWM功能输出SPWM波
要生成SPWM波,其关键是要生成一组正弦规律变化的数字,然后将数字对应成PWM输出的占空比,按照顺序输出占空比就行.生成正弦波的方法在 使用C语言产生正弦波数据 这篇博客有详细说明,这里就不说了. 本 ...
- java学习笔记之斐波那契数列
斐波那契数列计算公式为: f(n) = f(n-1)+ f(n-2) 基于此写了一个方法,用于输出一个长度为指定的斐波那契数列(从正数1开始, 即1,1 ,2 ,3 ,5 ....): static ...
- 树莓派用c语言pwm控制电机,树莓派学习笔记之PWM控制直流电机转速
树莓派控制PWM控制电机转速 一.硬件 树莓派 12V直流电机 L298N电机驱动器 220V转12V变压器 二.连线 树莓派与L298N需要共地 L298N驱动模块 树莓派接线 三.树莓派pytho ...
- 算法学习笔记五 斐波那契数列
斐波那契数列 一.最基本的 所以,只要知道这个数列的前两项,就可以求出之后所有项了. 核心部分(最简单的递推方法,但是范围是n<=48,否则会超时and溢出): #include <cst ...
- DSP28335学习笔记——McBSP配置为SPI
由于28335硬件外设上只有一个SPI接口,所以当SPI接口不够用时,可以将McBSP配置为SPI接口. 参考28335的数据手册,当DSP为主机时,配置McBSP为SPI所用到的接线如下图所示. 另 ...
- 【机器视觉学习笔记】双线性插值实现图片任意角度旋转(C++)
目录 原理 源码 RotateImage_BilinearInterpolation 主函数 效果 与最近邻插值比较 原图 最近邻插值效果(局部) 双线性插值效果(局部) 完整源码 平台:Window ...
- MSP430F5529 DriverLib 库函数学习笔记(六)定时器A产生PWM波
目录 1.通过Timer_A_outputPWM配置产生PWM波 初始化函数 计算 修改占空比的函数 整体程序 效果 2.单定时器产生多路PWM信号 初始化函数 实验结果 3.对称PWM信号的产生 初 ...
- STM8学习笔记---定时器输出7路PWM波
STM8S003F3P6单片机共有三个定时器定时器1.定时器2.定时器4.其中定时器1为16位高级定时器,定时器2为16位通用定时器,定时器4为8位基本定时器.定时器1和定时器2可以输出PWM波.其中 ...
最新文章
- python学习笔记(四)、条件、循环及其他语句
- R语言实战应用精讲50篇(三)-多重线性回归系列之模型评估与诊断应用案例
- 斯坦福CS229机器学习课程的数学基础(概率论)翻译完成
- 济南女子用计算机付款,山东一女子带孩子买鞋,用计算机假装付款,店员:给孩子做个榜样...
- python创建函数、可以接受任意多个整数参数并求和_pythonxlwt:求和函数最大参数限制?...
- 知识图谱之语言计算与信息抽取
- 一张图讲清如何正确应用可视化图表,学会后再也不会用错图表
- 20 位行业专家共话选型经验,CSDN「选型智囊团高端研讨会」圆满落幕!
- 移动端页面开发资源总结
- 软件资源消耗测试,综合测试:性能与资源消耗堪称完美
- 美国军方称密切关注量子加密,法国国防部重金投资量子技术
- 安装之后如何激活冰点还原软件?
- 堪萨斯大学计算机硕士,堪萨斯大学计算机工程硕士专业入学要求及费用
- Forth语言简明教程
- vue获取地址栏参数值
- 解决《CPU设计实战》第四章实践交叉编译时报错mipsel-linux-ld: section .MIPS.abiflags LMA overlaps section .data LMA
- 苹果任性,降低iPhone电池容量,用户需要多买个充电宝奶妈
- SpringCloud Alibaba 实战之《服务门户:Spring Cloud Gateway 如何把好微服务的大门》
- 【转】欧盟物联网研究战略路线图(4)
- redis哨兵模式出现connected_slaves:0解决办法