舵机(Servo)设备组件¶
理论¶
舵机是机器人中的常见执行部件,适用于简单的动作控制,通常使用特定频率的 PWM 进行驱动。实车上舵机可应用于控制弹仓盖开合等场景。
通常使用三根线一组来驱动舵机,按照颜色分别对应: 黑色 / 棕色 - GND
,红色 - VCC
,黄色 / 白色 - PWM 信号
。使用舵机时,将与其连接的杜邦线接入对应的 PWM 接口。下图为市面上常见的舵机:
舵机使用的 PWM 信号一般频率为 50Hz,高电平时间为 0.5ms - 2.5ms。不同占空比的 PWM 信号线性对应舵机转动的目标角度,以 180 度舵机为例,对应角度图如下图所示:
以 RoboMaster 开发板 C 型为例,板上有 7 个 PWM 接口,原理图和实物图如下图所示:
从右至左对应
TIM1 CHANNEL 1-4, TIM8 CHANNEL 1-3
快速开始¶
组件源码仓库地址:https://github.com/ZJU-HelloWorld/HW-Components
要在项目中使用该组件,需添加仓库内的以下文件:
外设驱动配置¶
在使用 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 配置可随意。
使用前准备¶
使用前需要做以下准备:
- 在使用 STM32CubeMX 生成项目时,请在
Code Generator
界面Enable Full Assert
,来帮助断言设备驱动中的错误;在main.c
中修改assert_failed
函数以指示断言结果,如添加while(1);
- 在
system.h
中system options: user config
处进行系统设置 - 在
dev_config.h
中设置Conditional Compiling
选项,将使用到的设备对应的条件编译宏开关定义为 1.
示例¶
在项目中引用头文件:
C | |
---|---|
实例化一个舵机设备:
C | |
---|---|
创建参数结构体数组,初始化舵机设备,默认使能,如:
C | |
---|---|
设定舵机角度:
C | |
---|---|
组件说明¶
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 仓库