一、前言
在嵌入式系统设计中,舵机控制是常见的需求,尤其在机器人、无人机和自动化设备等领域。STM32微控制器凭借其强大的功能和灵活性,成为实现舵机控制的理想选择。本文将详细介绍如何通过STM32的PWM引脚和定时器模拟PWM两种方式精确控制舵机。如果觉得这篇文章对您有所帮助,请点赞关注,您的支持是我坚持的动力
二、背景
- 项目背景
最近我接手了一个立体智能车库系统项目,该项目需要用到12个舵机。然而,我接手时发现,前任同事已经将大部分PWM引脚用于其他功能,仅留下2个可用的PWM引脚。因此,我需要重新设计程序,使用定时器模拟PWM来控制剩余的舵机。
2. 解决方案
1.PWM引脚控制:对于可用的PWM引脚,直接使用硬件PWM控制舵机。
2.定时器模拟PWM:对于不足的PWM引脚,通过定时器中断和GPIO输出来模拟PWM信号,控制舵机。
资料链接
本节教程一共提供三个程序
1.STM32PWM引脚控制舵机转动
2.STM32定时器模拟PWM控制舵机转动
3.51单片机呼吸灯程序(我之前的程序,拿这个参考的)
本项目用到的资料已经全部放到QQ群,需要的可以自行下载
三、舵机知识(以SG90舵机为例)
1. 舵机概述
以SG90舵机为例,它通常需要一个20ms左右的时基脉冲,其中高电平部分在0.5ms到2.5ms之间变化,以控制舵机的转动角度。
2.舵机外观图
四. 舵机线序
红色 --------->VCC+5V
棕色 --------->GND
黄色---------->信号线
五.舵机控制信号
0.5ms对应0度
1.0ms对应约45度
1.5ms对应90度
2.0ms对应约135度
2.5ms对应180度
六、STM32 PWM引脚控制舵机
- 初始化PWM
使用STM32的硬件PWM功能,首先需要配置定时器和GPIO引脚。以下是一个简化的配置过程:
c
void TIM3_PWM_Init(uint16_t arr, uint16_t psc) {
GPIO_InitTypeDef GPIO_InitStructure;
TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;
TIM_OCInitTypeDef TIM_OCInitStructure;
// 使能定时器3和GPIOA时钟
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3, ENABLE);
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);
// 配置GPIOA.2为复用推挽输出
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_2;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOA, &GPIO_InitStructure);
// 初始化定时器3
TIM_TimeBaseStructure.TIM_Period = arr; // 自动重装载值
TIM_TimeBaseStructure.TIM_Prescaler = psc; // 预分频值
TIM_TimeBaseStructure.TIM_ClockDivision = 0;
TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;
TIM_TimeBaseInit(TIM3, &TIM_TimeBaseStructure);
// 配置TIM3的OC2为PWM模式
TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1;
TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;
TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High;
TIM_OC2Init(TIM3, &TIM_OCInitStructure);
TIM_OC2PreloadConfig(TIM3, TIM_OCPreload_Enable);
// 使能定时器3
TIM_Cmd(TIM3, ENABLE);
}
2.定义一个频率为50HZ,周期为20MS的波形这里以STM32F103C8T6为例
3.TIM3_PWM_Init(20000-1,72-1)频率为50HZ的波形
4. 设置PWM占空比
通过修改TIM_SetCompare2(TIM3, pwm_value)中的pwm_value,可以设置PWM的高电平时间,从而控制舵机的角度。
七 定时器模拟PWM驱动舵机工作
这里以STM32F407ZGT6为例(由于公司电脑加密过了,没办法提供示例代码)
思路:
1.周期是20ms,频率为50hz的波形
0.5ms是0度
2.我们定义一个0.1ms的定时器中断
定义一个变量timer_cnt进行累加
3.当timer_cnt<=5(这里相当于就是0.5ms),舵机的引脚输出高电平,其余时间输出低电平
4.当timer_cnt累加到200时候,清零重新累加,这就相当于周期为20ms了
5.外部定义一个变量进行5,10,15,20,25这几个数据的切换即可
实现效果
这里是定义了2.5ms,占空比为12.5%的波形,达到了自己预期的结果
两种方法的比较
优势与局限
PWM引脚控制:配置简单,直接使用硬件PWM,响应速度快,但可用的PWM通道数量有限。
定时器模拟PWM:灵活性高,可以自定义更多的控制引脚,但需要更多的CPU资源和编程工作量。
八.应用场景
1.选择PWM引脚控制,当你需要快速简单地实现舵机控制,并且使用的舵机数量较少。
2. 选择定时器模拟PWM,当你的项目中有多个舵机需要控制,或者需要与其它定时器中断任务协同工作。
九总结
本教程介绍STM32使用PWM引脚进行舵机的控制,以及也介绍了使用定时器模拟PWM信号进行舵机的控制.同时也了解了一些舵机的相关知识.为编程提供了一定的基础.本次实践不仅加深了舵机控制的理解,也为后续项目提供了宝贵经验。最后呢,在编写博客的过程中,我尽量保持内容的准确性和完整性,但也难免会有疏漏或错误之处。欢迎各位读者指出其中的问题,帮助我不断进步。谢谢大家的阅读,希望这篇博客能够帮助到大家。点点关注,不迷路哦!
墨小羽ovo个人主页