STM32
直播中

张鑫

7年用户 849经验值
私信 关注
[问答]

如何去实现MSP430F5529输出多路PWM波进而控制舵机呢

控制电机和控制数字舵机的区别在哪?
如何去实现MSP430F5529输出多路PWM波进而控制舵机呢?

回帖(1)

h1654155275.5661

2021-12-22 11:07:02
MSP430F5529有比较丰富的定时器资源,这次我给大家带来的是输出多路PWM波,可以实现控制舵机,当然简单修改后也可以实现控制电机  实验平台是 TI的MSP-EXP430F5529LP 也就是我们常说的launchpad,相信很多做电赛的小伙伴都是人手一块的
首先先简单的说一下控制电机和控制数字舵机的区别,控制电机的话只需要我们可以输出一定的占空比即可,不需要精确控制周期,然而控制舵机则需要我们准确的控制占空比和周期 。 电机控制我们不多谈,只要保证自己输出的频率不是太低(电机嗡嗡响)也不是太高(太高也会有问题,此处不展开)。 咱们初步设定电机调速用的频率是5KHz。数字舵机的控制需求,我这里就不多说了20ms的周期 高电平持续时间是0.5~2.5ms。咱们先说一般的电机控制 产生一个频率可以调整的5KHz频率的方波信号。
这里是代码链接: 代码链接   实现效果会放在文章的最后  主要和大家分享的还是实现的过程
第一步:IO口复用
IO复用对于学过一点STM32 或除了51以外单片机的小伙伴应该都不陌生(甚至像STC12xx这样的增强型51也有IO复用这个功能) 只是功能的介绍  我们就先生成四路PWM 稍微演示一下。。。。
打开我们的芯片的 Datasheet 在Terminal Function这一部分有IO的复用功能介绍





IO复用在MSP里面做的很简单(复用功能比较少,单一映射的不多。。) 只需要将PxSEL寄存器的指定位置1 就可以了  操作是这样的





第二步:对定时器的相关寄存器进行设置
这里 我用的是SMCLK这个时钟,未经过时钟升频的时钟(1MHz) 至于怎么提高系统的时钟 见这篇 博客   这是地址
我们打开msp430F5529的用户手册(user_guide,不是datasheet)





从上面的图我们可以看到大概两部分的寄存器,第一部分是时钟主体的设置:





如上图 我们所需要设置的寄存器参数主要就是这四个选项:第一个选项是时钟源,这里我选用的是1MHz的SMCLK(Subsystem master clock  子系统主时钟)





在头文件库 #include 里面我找到了关于 TA0CTL的 相关位





继续向下找,官方的头文件里面都说的明明白白了 实用的方法很简单
TA0CTL |= TASSEL__SMCLK ;就是这么简单  时钟就选完了! 接下来的操作就是配置 ID 和IDEX 两个寄存器





ID是第一次分频  第二次分频是 IDEX





我们需要计算一下我们需要的分频参数    不过在这之前 我们还需要配置一下其他的一些参数:比如模式
模式的选择直接决定了你的用法,进而改变了参数的意义!   模式的选择就是我们先前图片的MC 的位





我们可以看到 模式的控制时这两个bit在控制的




这里是这两个bit 组合出来的四种 模式  后面都有定义  电机控制和舵机控制都必须选择模式1,这个我们可以简单的计算一下,即便我的时钟不进行分频  也就是计数频率是1MHz (最高25MHz) 那么 我们的脉冲的频率也就是1M/65536 = 15或者是25M/65536 = 381, 在我们1M的情况下只能使用 MC_Up这个选项,也就是把 CCR0 当做ARR(Auto Reload)寄存器用 ,当定时器的CNT计数到 CCR0时 重新置0 以电机控制为例  假设我们的电机控制的精度是1000(这里涉及到一个精度问题,我的理解是这样的 你想要把你一个周期时间分成多少个脉冲就是这个精度。精度也就是和ARR 有关。 例如在控制舵机时你的脉冲20ms分成200份(ARR = 2000),那么你能控制的最小脉冲时间是20ms/2000 =  10us  也就是你不可能产生一个不是10us整数倍的脉冲,你的脉宽最小的步进值就是10us 这个步进值会影响到你的舵机等的控制精度,ARR会影响到你电机速度控制闭环时的输出值的取值范围!) ARR的取值还是很值得深入研究的  ARR过高 计数值会比较大,控制精度很高,但是在430定时器的频率高就意味着 多费电,甚至为此你还需要去产生一个远高于  正常系统时钟 的时钟! 取值过小则会浪费精度(比如高精度的舵机)
我在这里取 SMCLK = 1MHz ID和IDEX 都是默认设置(不分频) CCR0 取100   此时产生得到PWM的频率是
SMCLK / (ID*IDEX*CCR0)   =  100 0000/(1*1*100) = 10KHz   





以上是生成的10KHz频率( 这里的误差较大,是因为时钟不是1Mhz 而是1.05Mhz,至于是为什么是1.05MHz我会查出来。。。 接下来的文章都是按照1.05M的之中在测试的!!!!  文中的计算都是有问题的! 这里就不做后续的修改了,望读者们理解,至于为什么是1.05MHz 的时钟 。
要设置我们的5KHz  只需要调整ID即可





以上脉冲可以用于 电机控制  但是不能用于舵机控制 , 接下来我们设计舵机控制的配置
假设我们是180度舵机 我希望可以达到步进值 是1 度 我们不妨设置CCR寄存器数值变化180个单位时 脉冲时间变化2ms 这样整个周期就需要 1800 个脉冲 也就是我们的CCR0 需要设置成1800  ,计算一下此时 如果不分频的话的频率是多少 SMCLK/CCR0 = 1000000/1800 = 555.555   Hz  > 50Hz   应该可以通过分频得到指定的频率!





接下来 我们应该计算一下分频的系数  我们大概需要的分频系数是  555.5/50 = 11.1  这个数字有点小了可靠的拆分应该是 2*6 = 12





我们获得的是 42Hz的方波   接下来我们调整一下IDEX = 5





Amazing!  我们得到了49Hz的方波,舵机控制应该是没有问题了!
代码链接 我整理以后会奉上。 通过这些测试我也发现了,其实MSP430的时钟波动是比较大的,时钟也不是那么稳定,要想获得最好的参数还是需要自己去测试,测试出来的实际结果和预想的还是有一定差距的
调试用的示波器是 Loto的虚拟示波器 OSC802,可以直接插在电脑上调试的一个工具,调试代码简直不要太方便啊!
我是最近才重新捡起430的  还有很多生疏之处,如有错误,请大佬们不吝赐教,代码我整理完了会分享的!
举报

更多回帖

发帖
×
20
完善资料,
赚取积分