一、PWM 舵机控制简介
舵机是一种特殊的直流电机,它通过接收驱动信号来控制转动角度,一般被广泛应用于机器人、遥控模型、机械臂等领域。PWM(Pulse Width Modulation,脉宽调制)是一种常用的控制舵机的方法,通过控制信号的脉宽来决定舵机的转动角度。
STM32 是一款强大的 32 位微控制器,具有丰富的外设资源和广泛的应用领域。在本教程中,我们将学习如何通过 STM32 的 PWM 外设来控制舵机的转动角度。
二、硬件准备
在开始之前,我们需要准备以下硬件:
- STM32 开发板
- 舵机
- 杜邦线
连接步骤如下:
- 将舵机的 VCC 线连接到开发板的 5V 电源引脚
- 将舵机的 GND 线连接到开发板的 GND 引脚
- 将舵机的信号线(一般为橙色线)连接到开发板的任意 GPIO 引脚(例如 PA0 引脚)
三、PWM 舵机控制代码实现
- 引入必要的头文件
#include "stm32f10x.h"
#include "stm32f10x_gpio.h"
#include "stm32f10x_rcc.h"
#include "stm32f10x_tim.h"
- 定义舵机相关的宏
#define PWM_TIM TIM2
#define PWM_GPIO GPIOA
#define PWM_GPIO_PIN GPIO_Pin_0
#define PWM_GPIO_CLK RCC_APB2Periph_GPIOA
#define PWM_TIM_CLK RCC_APB1Periph_TIM2
- 初始化 GPIO 和 PWM 定时器
void PWM_Init(void)
{
GPIO_InitTypeDef GPIO_InitStruct;
TIM_TimeBaseInitTypeDef TIM_InitStruct;
TIM_OCInitTypeDef TIM_OCInitStruct;
// 使能 GPIO 和 TIM 时钟
RCC_APB2PeriphClockCmd(PWM_GPIO_CLK, ENABLE);
RCC_APB1PeriphClockCmd(PWM_TIM_CLK, ENABLE);
// 配置 GPIO 引脚为复用推挽输出模式
GPIO_InitStruct.GPIO_Mode = GPIO_Mode_AF_PP;
GPIO_InitStruct.GPIO_Pin = PWM_GPIO_PIN;
GPIO_InitStruct.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(PWM_GPIO, &GPIO_InitStruct);
// 配置 TIM 基本参数
TIM_InitStruct.TIM_Prescaler = 72 - 1;
TIM_InitStruct.TIM_CounterMode = TIM_CounterMode_Up;
TIM_InitStruct.TIM_Period = 20000 - 1;
TIM_InitStruct.TIM_ClockDivision = 0;
TIM_TimeBaseInit(PWM_TIM, &TIM_InitStruct);
// 配置 TIM 输出比较参数
TIM_OCInitStruct.TIM_OCMode = TIM_OCMode_PWM1;
TIM_OCInitStruct.TIM_OutputState = TIM_OutputState_Enable;
TIM_OCInitStruct.TIM_OCPolarity = TIM_OCPolarity_High;
TIM_OCInitStruct.TIM_Pulse = 1000 - 1;
TIM_OC2Init(PWM_TIM, &TIM_OCInitStruct);
// 使能 TIM 输出比较
TIM_Cmd(PWM_TIM, ENABLE);
TIM_CtrlPWMOutputs(PWM_TIM, ENABLE);
}
- 舵机角度控制函数
void Servo_SetAngle(int angle)
{
uint16_t pulse = 1000 + angle * 10;
TIM_SetCompare2(PWM_TIM, pulse - 1);
}
四、代码解析
- 初始化 GPIO 和 PWM 定时器
在 PWM_Init 函数中,我们首先使能了 GPIO 和 TIM 的时钟。然后,配置 GPIO 引脚为复用推挽输出模式,这样才能连接到 PWM 定时器输出引脚。接下来,配置 TIM 的基本参数,包括预分频系数、计数器模式、计数范围等。最后,配置 TIM 的输出比较参数,包括 PWM 模式、输出使能、极性设置和占空比等。最后,使能 TIM 的输出比较和 PWM 输出。
- 舵机角度控制函数
在 Servo_SetAngle 函数中,我们根据舵机的工作原理,通过改变 PWM 的脉宽来控制舵机的转动角度。我们使用变量 angle 来表示舵机的角度,将 angle 值乘以 10,并加上偏移量 1000 来计算 PWM 的脉宽。最后,使用 TIM_SetCompare2 函数将计算得到的脉宽值写入 PWM 定时器的捕获比较寄存器,从而改变 PWM 输出的脉宽。
五、使用 PWM 舵机控制函数
在主函数中调用 PWM_Init 函数初始化 PWM,并使用 Servo_SetAngle 函数来控制舵机的转动角度。
int main(void)
{
PWM_Init();
while (1)
{
Servo_SetAngle(0); // 设置舵机角度为 0 度
delay_ms(1000); // 延时 1 秒
Servo_SetAngle(90); // 设置舵机角度为 90 度
delay_ms(1000); // 延时 1 秒
Servo_SetAngle(180); // 设置舵机角度为 180 度
delay_ms(1000); // 延时 1 秒
}
}
六、总结
通过上述代码实现,我们成功地使用 STM32 的 PWM 外设控制了舵机的转动角度。我们可以通过调整 Servo_SetAngle 函数中的 angle 参数来改变舵机的转动角度,从而实现更加精确的控制。
希望本教程对初学者了解 STM32 的 PWM 外设和舵机控制有所帮助。如有任何问题,欢迎留言讨论。