跳转至

舵机(Servo)设备组件

理论

舵机是机器人中的常见执行部件,适用于简单的动作控制,通常使用特定频率的 PWM 进行驱动。实车上舵机可应用于控制弹仓盖开合等场景。

通常使用三根线一组来驱动舵机,按照颜色分别对应: 黑色 / 棕色 - GND红色 - VCC黄色 / 白色 - PWM 信号。使用舵机时,将与其连接的杜邦线接入对应的 PWM 接口。下图为市面上常见的舵机:

image-20221207180127349

舵机使用的 PWM 信号一般频率为 50Hz,高电平时间为 0.5ms - 2.5ms。不同占空比的 PWM 信号线性对应舵机转动的目标角度,以 180 度舵机为例,对应角度图如下图所示:

image-20221207180140026

以 RoboMaster 开发板 C 型为例,板上有 7 个 PWM 接口,原理图和实物图如下图所示:

image-20221207180458452

从右至左对应 TIM1 CHANNEL 1-4, TIM8 CHANNEL 1-3

快速开始

组件源码仓库地址:https://github.com/ZJU-HelloWorld/HW-Components

要在项目中使用该组件,需添加仓库内的以下文件:

Text Only
1
2
3
4
devices/dev_servo.c
devices/dev_servo.h
devices/dev_config.h
system.h

外设驱动配置

在使用 PWM 波控制舵机时,需要注意查阅舵机参数,并在使用 CubeMX 配置时将对应定时器预分频至 1MHz,以方便控制。例如对一个工作频率 50Hz - 300Hz 的舵机,工作脉宽 500us - 2500us,工作角度 0° -180°,连接至 RoboMaster 开发板 C 型 TIM1 CH1,驱动流程如下:

  • 对于 TIM1,查看数据手册可知其挂载在 APB2 总线上,时钟频率 168MHz,为达到 1MHz 需要 168 分频 ,因此将预分频值(Prescaler)设置为 167;
  • 工作频率定为 50Hz,对应周期为 20ms (20000us),因此重载值(Counter Period)设置为 19999。此“工作频率”选项仍可在组件初始化时指定更改,CubeMX 配置可随意;
  • 设置初始高电平时间即脉宽(Pulse),一般最小为 0.5ms,即 500us,占空比 2.5%,对应了最小角度 0°;最大为 2.5ms,即 2500us,占空比 12.5%,对应了最大角度 180°. 此“初始角度”选项可在组件初始化时更改,“角度”选项可在组件运行时更改,CubeMX 配置可随意。

image-20221208081137300

使用前准备

使用前需要做以下准备:

  • 在使用 STM32CubeMX 生成项目时,请在 Code Generator 界面 Enable Full Assert,来帮助断言设备驱动中的错误;在 main.c 中修改 assert_failed 函数以指示断言结果,如添加 while(1);
  • system.hsystem options: user config 处进行系统设置
  • dev_config.h 中设置 Conditional Compiling 选项,将使用到的设备对应的条件编译宏开关定义为 1.

示例

在项目中引用头文件:

C
#include "dev_config.h"

实例化一个舵机设备:

C
Servo_t servo;

创建参数结构体数组,初始化舵机设备,默认使能,如:

C
1
2
3
4
5
6
7
8
9
ServoInfo_t info =
{
  .operating_freq_hz = 50,
  .min_pulse_width_us = 500,
  .max_pulse_width_us = 2500,
  .angle_range_deg = 180,
  .init_angle_deg = 1.5f
};
ServoInit(&servo, &HTIM_PWM1, HTIM_PWM_CH1, &info);

设定舵机角度:

C
servo.setAngle(&servo, TAR_ANGLE_DEG); // target angle (float) measured in degree

组件说明

Servo

属性

名称 类型 示例值 描述
htim TIM_HandleTypeDef* &htim1 驱动舵机使用的时钟
tim_ch uint16_t TIM_CHANNEL_1 使用的时钟频道
info ServoInfo_t* / 相关参数结构体指针

方法

名称 参数说明 描述
ServoInit 传入时钟句柄指针、频道、相关参数结构体指针 用传入的参数初始化一个舵机设备。
enable / 使能舵机设备。
disable / 失能舵机设备。
setAngle 传入目标角度值(float degree) 控制舵机输出至目标角度。
setMaxAngle / 控制舵机输出至最大角度。
setMinAngle / 控制舵机输出至最小角度。

ServoInfo 结构体

存储舵机相关参数。

名称 类型 示例值 描述
operating_freq_hz float 50 执行频率
min_pulse_width_us uint16_t 500 最小角度对应脉宽
max_pulse_width_us uint16_t 2500 最大角度对应脉宽
angle_range_deg uint16_t 180 极限角度范围,默认从 0 开始
init_angle_deg float 1.5 初始角度

附录

版本说明

版本号 发布日期 说明 贡献者
2022.12.07 发布舵机组件 薛东来

参考资料

[1] RoboMaster 开发板 C 型嵌入式软件教程文档. Github 仓库