MSP430F5529 多路PWM输出控制舵机和电机

发布者:rho27最新更新时间:2021-01-11 来源: eefocus关键字:MSP430F5529  多路PWM  输出控制  舵机 手机看文章 扫描二维码
随时随地手机看文章

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的  还有很多生疏之处,如有错误,请大佬们不吝赐教,代码我整理完了会分享的!


关键字:MSP430F5529  多路PWM  输出控制  舵机 引用地址:MSP430F5529 多路PWM输出控制舵机和电机

上一篇:MSP430时钟倍频设置 亲测 MSP430F5529有效
下一篇:MSP430F5529火箭板-控制时钟系统输出频率实验(含时钟系统分析)

推荐阅读最新更新时间:2024-10-27 10:21

MSP430F5529 多路PWM输出控制舵机和电机
MSP430F5529有比较丰富的定时器资源,这次我给大家带来的是输出多路PWM波,可以实现控制舵机,当然简单修改后也可以实现控制电机 实验平台是 TI的MSP-EXP430F5529LP 也就是我们常说的launchpad,相信很多做电赛的小伙伴都是人手一块的 首先先简单的说一下控制电机和控制数字舵机的区别,控制电机的话只需要我们可以输出一定的占空比即可,不需要精确控制周期,然而控制舵机则需要我们准确的控制占空比和周期 。 电机控制我们不多谈,只要保证自己输出的频率不是太低(电机嗡嗡响)也不是太高(太高也会有问题,此处不展开)。 咱们初步设定电机调速用的频率是5KHz。数字舵机的控制需求,我这里就不多说了20ms的周期 高电平持
[单片机]
<font color='red'>MSP430F5529</font> <font color='red'>多路</font><font color='red'>PWM</font><font color='red'>输出</font><font color='red'>控制</font><font color='red'>舵机</font>和电机
MSP430f5529PWM控制舵机程序
#include msp430.h //函数库 int sum=0; //全局变量 int main(void) { volatile unsigned int i; //局部变量 //设置timerA相关参数 WDTCTL = WDTPW+WDTHOLD; // 关闭看门狗 P1DIR |= BIT2; // 将P1.2设置为输出端口,验证状态 P2DIR |= BIT0; //P2.0输出PWM波 TA0CCTL1 = OUTMOD_7;
[单片机]
使用51单片输出PWM控制舵机
SCU 的电子信息学院的某个社团会每年举办船模大赛。 因为去年的船模比赛时候懒,所以就买了成品的遥控器(天地飞6)来参赛,控制自己制作的遥控船上面的电调和舵机。最近有心情想在今年的船模比赛中自己制作遥控器,先从第一步开始吧:使用单片机来控制舵机(控制电调的原理类似)。 0x01.什么是舵机? 其实舵机就是一种伺服电机,根据要求旋转一定的角度,在我看来,知道这些就够了~~ 0x02.舵机有什么用? 就拿模型来说吧,船要转弯的话,可以采用的一种方式就是改变船后面舵片的角度来改变两侧对水的阻力,以此来让船转向,这个也是舵机一词的由来。 0x03.怎么控制? PWM波,这是什么东西呢?其
[单片机]
使用51单片<font color='red'>机</font><font color='red'>输出</font><font color='red'>PWM</font><font color='red'>控制</font><font color='red'>舵机</font>
STM32之使用PWM控制多路舵机
前言 最近在玩一个6自由度的机械臂,我手上这台机械臂的核心控制器件就是那六个能够180度旋转的舵机了。想想之前在学校还没有系统性的把舵机给玩明白,所以就索性拿手上的STM32来自己写驱动代码,将6个舵机给驱动起来。 舵机控制原理 舵机的控制原理还是比较简单的,而且控制的角度和精度能够比较好的按照开发者的意愿来进行,因此经常被应用与一些控制类器械中,如机械手、云台、2自由度摄像头等产品中。 舵机的外接线一般分为3根线,电源线、地线和信号线,而控制舵机转动,就是通过信号线给舵机发送一系列的周期信号(一般的舵机的能接收的信号周期为20ms),然后通过控制周期信号的高电平的持续时间来达到控制舵机转动的目的。我手上的
[单片机]
STM32之使用<font color='red'>PWM</font><font color='red'>控制</font><font color='red'>多路</font><font color='red'>舵机</font>
多路舵机控制PWM发生器的设计与Proteus仿真
  PWM脉宽信号调制是现代电子行业中使用较为广泛的一种脉冲信号,其典型应用就是 舵机控制 。以 Proteus 和Keil软件为基础,介绍了在Proteus环境下利用51单片机产生多路PWM脉冲的实现方法。最后以一个典型的应用实例验证了设计的可行性与可靠性。实验证明,本系统可在单片机定时器资源有限的情况下同时对多个舵机的输出转角进行控制。本文以一个典型的单片机应用实例为基础,使用Proteus和Keil软件作为开发工具,介绍了单片机系统初期开发的设计与仿真过程。   1 Proteus软件简介   Proteus软件是英国Labcenter Electronics公司开发的EDA工具软件,已有近20年的历史,在全球得到了广泛
[单片机]
<font color='red'>多路</font><font color='red'>舵机</font><font color='red'>控制</font><font color='red'>PWM</font>发生器的设计与Proteus仿真
多路舵机控制PWM发生器的设计与Proteus仿真
摘要:PWM脉宽信号调制是现代电子行业中使用较为广泛的一种脉冲信号,其典型应用就是舵机控制。以Proteus和Keil软件为基础,介绍了在Proteus环境下利用51单片机产生多路PWM脉冲的实现方法。最后以一个典型的应用实例验证了设计的可行性与可靠性。实验证明,本系统可在单片机定时器资源有限的情况下同时对多个舵机的输出转角进行控制。 关键词:PWM;舵机控制;Proteus;Keil;单片机 0 引言 单片机是现代仪器仪表、家用电器、工业仪器等领域应用十分广泛的可编程器件之一,有着价格低廉、编程灵活、体积小、可扩展性强等优点。单片机功能的飞速发展,其应用范围日益广泛,小到玩具,大到机器人,无论从数据采集,过程控制,模糊控制等
[工业控制]
<font color='red'>多路</font><font color='red'>舵机</font><font color='red'>控制</font><font color='red'>PWM</font>发生器的设计与Proteus仿真
STM32F103C8T6 实现舵机与电机的控制 2个定时器输出不同频率的PWM
智能小家居------舵机开门,电机做风扇 or 拉窗帘、呼吸灯做提示,小OLED屏幕显示当前状态。 直接上代码 背景:我觉得我看了那么多教程了,然而只会玩单个东西,串起来就不太懂。 本项目的代码部分实现用到了2个时钟,TIM2 和 TIM3。 经历的问题:原本我是想只用一个时钟,不同通道来实现PWM的输出,但是我发现 我如果把TIM_TimeBaseInitStructure.TIM_Period = ARR ; //ARR 自动重装器的值 ARR = 20000 -1 时,只能驱动舵机,不能驱动电机。 ARR = 100 -1 时,只能驱动电机,不能驱动舵机。 后来发现: SG90舵机接收的PWM信号频率为50HZ,T=
[单片机]
STM32F103C8T6 实现<font color='red'>舵机</font>与电机的<font color='red'>控制</font> 2个定时器<font color='red'>输出</font>不同频率的<font color='red'>PWM</font>
利用WinCE的精准计时函数来输出pwm信号以便控制舵机
FL2440的板子只有TOUT0和TOUT1引出了扩展管脚,而TOUT0与GPB0复用,GPB0又连接着蜂鸣器,所以一用TOUT0输出pwm信号蜂鸣器就大叫不止,而TOUT1又因为Wince系统使用Timer1作为系统定时器,所以在Wince下用TOUT1输出pwm信号会马上死机。 本打算用定时器的中断函数来输出pwm信号,但是感觉WinCE封装ADS下的__irq函数很难搞,无意中发现WinCE有比较精准的计时函数,决定干脆用这个来做pwm信号以便控制舵机。 关键代码: 需要头文件: #include ceddk.h #include pkfuncs.h #include Windows.h #includ
[单片机]
小广播
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved