✅作者简介:热爱科研的嵌入式开发者,修心和技术同步精进
❤欢迎关注我的知乎:对error视而不见
代码获取、问题探讨及文章转载可私信。
☁ 愿你的生命中有够多的云翳,来造就一个美丽的黄昏。
🍎获取更多嵌入式资料可点击链接进群领取,谢谢支持!👇
一、引言
舵机是一种常见的执行机构,广泛应用于机器人、航模等领域。通过控制舵机的角度,可以实现各种复杂的动作。在STM32开发中,我们可以利用其强大的定时器功能产生PWM(脉冲宽度调制)信号来精确控制舵机的转动角度。本文将详细介绍如何使用STM32来实现PWM控制舵机,并给出相应的代码示例。
二、舵机工作原理
舵机一般由直流电机、减速齿轮组、角度传感器和控制电路组成。它通过接收PWM信号来控制转动角度。PWM信号的周期通常为20ms(50Hz),而舵机的转动角度与PWM信号的脉冲宽度有关。一般来说,脉冲宽度在0.5ms - 2.5ms之间变化时,舵机的转动角度从0° - 180°线性变化。具体对应关系如下:
- 0.5ms 脉冲宽度 -> 0°
- 1.5ms 脉冲宽度 -> 90°
- 2.5ms 脉冲宽度 -> 180°
三、硬件连接
以STM32F103C8T6为例,我们选择一个定时器的PWM输出引脚来连接舵机的控制信号引脚。舵机的电源引脚连接到外部电源(一般为5V),接地引脚连接到开发板的GND。假设我们选择TIM3的通道1(PA6)作为PWM输出引脚,连接方式如下:
- 舵机控制信号(橙色线) -> PA6
- 舵机电源(红色线) -> 5V电源
- 舵机接地(棕色线) -> GND
四、STM32定时器PWM模式配置
1. 定时器时钟使能
首先,我们需要使能定时器和GPIO的时钟。
#include "stm32f10x.h"
void TIM3_PWM_Init(u16 arr, u16 psc)
{
GPIO_InitTypeDef GPIO_InitStructure;
TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;
TIM_OCInitTypeDef TIM_OCInitStructure;
// 使能TIM3和GPIOA时钟
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3, ENABLE);
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);
2. GPIO配置
将PA6配置为复用推挽输出模式。
// 配置PA6为复用推挽输出
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOA, &GPIO_InitStructure);
3. 定时器基本参数配置
设置定时器的自动重装载值和预分频系数,确定PWM信号的周期。
// 定时器TIM3基本参数配置
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);
4. PWM模式配置
配置定时器的PWM模式和输出比较参数。
// 定时器TIM3的PWM模式配置
TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1;
TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;
TIM_OCInitStructure.TIM_Pulse = 0;
TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High;
TIM_OC1Init(TIM3, &TIM_OCInitStructure);
// 使能TIM3
TIM_Cmd(TIM3, ENABLE);
}
五、控制舵机转动
1. 计算脉冲宽度
根据舵机的角度和PWM信号的周期,计算出对应的脉冲宽度。
// 计算舵机角度对应的脉冲宽度
u16 Servo_Angle_To_Pulse(u8 angle)
{
// 0.5ms - 2.5ms对应0° - 180°
// 20ms周期,ARR = 1999,PSC = 7199
// 脉冲宽度范围:50 - 250
return (u16)(50 + (200 * angle / 180));
}
2. 控制舵机转动到指定角度
// 控制舵机转动到指定角度
void Servo_Control(u8 angle)
{
u16 pulse = Servo_Angle_To_Pulse(angle);
TIM_SetCompare1(TIM3, pulse);
}
六、主函数代码
int main(void)
{
// 初始化TIM3的PWM,ARR = 1999,PSC = 7199,周期为20ms
TIM3_PWM_Init(1999, 7199);
while (1)
{
// 舵机转动到0°
Servo_Control(0);
delay_ms(1000);
// 舵机转动到90°
Servo_Control(90);
delay_ms(1000);
// 舵机转动到180°
Servo_Control(180);
delay_ms(1000);
}
}
七、总结
通过以上步骤,我们可以使用STM32的定时器产生PWM信号来精确控制舵机的转动角度。在实际应用中,我们可以根据需要调整定时器的参数和舵机的控制角度,实现更加复杂的动作。同时,需要注意舵机的电源供应,确保其稳定工作。
希望本文能帮助你快速掌握STM32使用PWM控制舵机的方法。如果你在实践过程中遇到任何问题,欢迎留言讨论。
注意事项
- 舵机需要外部电源供电,不能直接使用开发板的电源,以免损坏开发板。
- 不同型号的舵机可能具有不同的脉冲宽度与角度对应关系,需要根据实际情况进行调整。