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

img
img

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,涵盖了95%以上物联网嵌入式知识点,真正体系化!

由于文件比较多,这里只是将部分目录截图出来,全套包含大厂面经、学习笔记、源码讲义、实战项目、大纲路线、电子书籍、讲解视频,并且后续会持续更新

需要这些体系化资料的朋友,可以加我V获取:vip1024c (备注嵌入式)

如果你需要这些资料,可以戳这里获取

我们打开msp430F5529的用户手册(user_guide,不是datasheet)

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

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

在头文件库 #include <msp430F5529.h>里面我找到了关于 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

收集整理了一份《2024年最新物联网嵌入式全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升的朋友。
img
img

如果你需要这些资料,可以戳这里获取

需要这些体系化资料的朋友,可以加我V获取:vip1024c (备注嵌入式)

一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人

都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!

一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人

都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!

  • 11
    点赞
  • 25
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
要使用MSP430F5529的TA1.1输出PWM来驱动舵机,你需要进行以下步骤: 1. 配置引脚:将TA1.1引脚配置为PWM输出模式。根据MSP430F5529的引脚映射,TA1.1对应的引脚是P2.5。 2. 配置定时器:配置Timer A1作为PWM发生器。设置定时器的时钟源、模式和计数器上限。 3. 配置PWM参数:设置PWM的周期和占空比,以控制舵机的位置。 4. 初始化定时器:初始化Timer A1,并启动定时器。 5. 更新PWM值:根据舵机的位置需求,通过修改CCR1寄存器的值来调整PWM的占空比。CCR1寄存器用于控制TA1.1的PWM波形。 下面是一个简单的示例代码,演示如何使用MSP430F5529的TA1.1输出PWM来驱动舵机: ```c #include <msp430.h> #define PWM_PERIOD 20000 // PWM周期,单位为微秒 #define PWM_MIN 1000 // 最小PWM占空比,单位为微秒 #define PWM_MAX 2000 // 最大PWM占空比,单位为微秒 void servo_init() { P2DIR |= BIT5; // 配置P2.5为输出模式 P2SEL |= BIT5; // 将P2.5配置为TA1.1功能 TA1CCR0 = PWM_PERIOD - 1; // 设置PWM周期 TA1CCTL1 = OUTMOD_7; // 设置TA1.1为PWM模式 TA1CCR1 = PWM_MIN; // 设置初始PWM占空比为最小值 TA1CTL = TASSEL_2 + MC_1; // 设置定时器A1为SMCLK时钟源,以增计数模式运行 } void servo_set_position(unsigned int position) { TA1CCR1 = position; // 设置PWM占空比为指定位置 } int main() { WDTCTL = WDTPW + WDTHOLD; // 停用看门狗定时器 servo_init(); // 初始化舵机驱动 while (1) { // 舵机位置控制示例 servo_set_position(PWM_MIN); // 设置舵机位置为最小值 __delay_cycles(1000000); // 延时1秒 servo_set_position(PWM_MAX); // 设置舵机位置为最大值 __delay_cycles(1000000); // 延时1秒 } return 0; } ``` 这个示例代码会让舵机在最小和最大位置之间来回摆动。你可以根据具体的舵机规格和要求来调整PWM的周期、最小和最大占空比,以达到控制舵机位置的目的。记得根据你的实际硬件连接情况修改引脚和定时器的配置。 希望对你有帮助!如有其他问题,请随时提问。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值