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 |= 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的 还有很多生疏之处,如有错误,请大佬们不吝赐教,代码我整理完了会分享的!
上一篇:MSP430时钟倍频设置 亲测 MSP430F5529有效
下一篇:MSP430F5529火箭板-控制时钟系统输出频率实验(含时钟系统分析)
推荐阅读最新更新时间:2024-10-27 10:21
设计资源 培训 开发板 精华推荐
- EVAL-ADF4156EB1,用于无线 LAN 的 ADF4156 PLL 时钟发生器的评估板
- EVAL-AD7707EB,使用 AD7707 3 通道、16 位、Σ-Δ 模数转换器的评估板
- {训练营}物联网时钟桌搭
- 具有 400mA 突发钳位、fSW = 1MHz 同步降压型稳压器的 LTC3621EDCB-3.3 2.5V Vout 的典型应用
- ROTARYCLICK,基于 EC12D 机械编码器旋转的评估套件
- 使用 Analog Devices 的 LT1317BCS8 的参考设计
- 红外遥控报警器(原理图+PCB图+程序+说明文档)
- MC9S12GN32 超可靠 16 位塔式® 系统模块
- 基于单片机的密码锁设计程序
- esp32c3 mini