最近要做一点小东西,使用dsp28335控制舵机,使用pwm信号。在这里写点东西给需要使用pwm这个模块的新人吧。

工程模板代码我传在我的csdn的资源里了,有需要的可以下载。

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 EPWM3AGpioCtrlRegs.GPAMUX1.bit.GPIO5 = 1;   // Configure GPIO5 as EPWM3BEDIS;
}

这里使用的是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 CMPBEPwm3Regs.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 decEPwm3Regs.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 = 0x0000EPwm3Regs.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模块中使用的。

有问题留言即可。

Dsp28335 - ePWM - 50Hz小舵机的控制 - 代码例程相关推荐

  1. 从控制理论的根轨迹法和稳定性分析谈到舵机PD控制代码实现

    在上一次谈到基于MPU6050的基于一阶互补滤波算法实现后,本来想接着就自适应一阶互补滤波和卡尔曼滤波再写一篇的,但是卡尔曼滤波算法我自己写出来并进行姿态解算后发现效果不很好,才疏学浅,等我调好了再写 ...

  2. 51单片机控制小舵机

    以前从没有想过写博客,但是最近发现以前的代码老是找不到,而且找到了也不一定想得起当时的逻辑,很麻烦,所以打算写写提醒一下自己. 最近老板让做一个扫描二维码装钥匙的小盒子,就给个小舵机和3D打印机,传动 ...

  3. (含代码)基于51单片机的红外遥控(独立按键)舵机开关灯控制

    硬件说明: 采用STC89C51作为主控芯片,结合SG90舵机模块,红外遥控(独立按键),等电路模块实现远程控制舵机. 应用实例: 在不改变外部电路的情况下,实现远程开灯,关灯. 远程控制机器开关状态 ...

  4. IDEA几个设置:设置空格显示成小点、显示行数、 Ctrl + 鼠标滚轮 快捷键来控制代码字体大小显示、护眼背景色

    1.设置空格显示成小点和显示行数,最初如图所示 1.1 现在进行设置,设置如图. 1.2 设置后有行数显示,空格变成小点显示效果图. 2.Ctrl + 鼠标滚轮 快捷键来控制代码字体大小显示 3.设置 ...

  5. 12自由度舵机狗arduino uno加PCA 9685控制代码

    12_DOF舵机狗arduino uno加PCA 9685控制代码 硬件接线 参考:https://blog.csdn.net/qq_42807924/article/details/82229997 ...

  6. STM32入门笔记(02):F103C8T6 舵机PWM控制实验(SPL库函数版)

    舵机的结构 舵机简单的说就是集成了直流电机. 电机控制器和减速器等, 并封装在一个便于安装的外壳里的伺服单元. 能够利用简单的输入信号比较精确的转动给定角度的电机系统. 舵机安装了一个电位器(或其它角 ...

  7. 基于ESP8266远程舵机的控制与实现

    一.ESP8266 CP2102介绍 NodeMCU板载ESP-12E(4MBFlash) WIFI模组和USB转TTL串口(CP2102/CH340)芯片,方便下载固件和调试, NodeMCU默认为 ...

  8. openmv利用模板匹配+控制舵机来控制小车使P点触碰到靶心

    (注:每行代码的解释均已标注,适合复习使用和openmv新手学习) import sensor, time, image from image import SEARCH_EX, SEARCH_DS ...

  9. 成熟FOC电机控制代码 可用于电动自行车,滑板 车,电机FOC控制等

    成熟FOC电机控制代码 大厂成熟FOC电机控制图. 可用于电动自行车,滑板 车,电机FOC控制等. 大厂成熟方案,直接可用,不是一般的普通代码可比的. 代码基于Stm031,国产很多芯片可以通用. 以 ...

最新文章

  1. 4行Python代码生成图像验证码
  2. 全球首个开源图像识别系统上线了!人脸、商品、车辆识别一网打尽!
  3. 读入一个数列和N值,返回按优先级排序的N个数 满足...Python解法
  4. 20175221曾祥杰 实验四《Android程序设计》
  5. django异常日志_5分钟教你学会Django系统错误监控
  6. ROW_NUMBER() OVER() 函数用法详解 (分组排序,多例子)
  7. 动态游标for循环_【【动图算法】(动态规划篇):最长回文子串
  8. 在…视域下是什么意思_电影中出现的出品人是什么意思?你需要了解下
  9. sqlserver 性能计数器的问题
  10. excel文件无法打印提示内存不足_U盘拷贝文件提示目标文件过大无法复制怎么解决...
  11. markdown编辑器------------编辑方法
  12. 使用Unity粒子特效的基本步骤
  13. 一篇文章入门Python
  14. oracle rat结果分析比较,Oracle RAT介绍及最佳实践
  15. Process finished with exit code -1073740791(0xC0000409)
  16. 微信公众号主体注册数量提升申请方法
  17. matlab contour3函数,matlab 等值线函数 contour
  18. 高通骁龙芯片的随身wifi入门刷机教程
  19. 学习笔记之Vue基础学习(一)
  20. 使用函数实现数组元素的赋值

热门文章

  1. 关于剩余清账影响账龄和虚增借贷的问题
  2. 国家开发银行 续贷声明
  3. lua 5.3开发调试环境搭建
  4. chrome插件--抢票demo版
  5. 飓风来去无影踪?NASA 发射 8 颗微型卫星监控导航
  6. [1] 无线通信:基本概念
  7. git合并分支总结(一看就懂哟)
  8. SUSE12 SP2配置静态ip
  9. CSS实现图片高斯模糊效果
  10. 三星盖世4上手测评分享