完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
|
|
相关推荐
1个回答
|
|
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的 还有很多生疏之处,如有错误,请大佬们不吝赐教,代码我整理完了会分享的! |
|
|
|
只有小组成员才能发言,加入小组>>
调试STM32H750的FMC总线读写PSRAM遇到的问题求解?
1781 浏览 1 评论
X-NUCLEO-IHM08M1板文档中输出电流为15Arms,15Arms是怎么得出来的呢?
1621 浏览 1 评论
1085 浏览 2 评论
STM32F030F4 HSI时钟温度测试过不去是怎么回事?
728 浏览 2 评论
ST25R3916能否对ISO15693的标签芯片进行分区域写密码?
1680 浏览 2 评论
1938浏览 9评论
STM32仿真器是选择ST-LINK还是选择J-LINK?各有什么优势啊?
732浏览 4评论
STM32F0_TIM2输出pwm2后OLED变暗或者系统重启是怎么回事?
570浏览 3评论
596浏览 3评论
stm32cubemx生成mdk-arm v4项目文件无法打开是什么原因导致的?
559浏览 3评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-12-24 16:14 , Processed in 0.917993 second(s), Total 77, Slave 60 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号