基于STM32的无人机电机控制模块设计与实现
基于STM32的无人机电机控制模块设计与实现
一、模块概述
本文介绍了一个基于STM32 HAL库的无人机电机控制模块实现,该模块通过PWM信号控制四个无刷电机的转速,是飞控系统的关键执行部件。
无人机电机选择空心杯电机的原因主要为:
1.空心杯电机的效率通常在85%到90%之间,高效率为其突出特点。
2.同时空心杯电机具有高转速、低噪音的特点。
3.电机整体体积小、重量轻有助于提升无人机的飞行效率和稳定性。
4.电机灵敏的控制特性,起动、制动、响应快。能够实现更精准的控制和更复杂的飞行动作。
5.无人机需长时间运行和频繁起降,长寿命与可靠性的特点成为无人机的首选电机类型。
二、 核心功能实现
2.1 电机初始化
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
void Inf_Motor_Init(void)
{
/* 启动4个PWM定时器通道 */
HAL_TIM_PWM_Start(&htim3, TIM_CHANNEL_1); // 左上电机
HAL_TIM_PWM_Start(&htim4, TIM_CHANNEL_4); // 左下电机
HAL_TIM_PWM_Start(&htim2, TIM_CHANNEL_2); // 右上电机
HAL_TIM_PWM_Start(&htim1, TIM_CHANNEL_3); // 右下电机
/* 初始化电机速度并启动 */
motorLeftTop.speed = 0;
motorLeftBottom.speed = 0;
motorRightTop.speed = 0;
motorRightBottom.speed = 0;
Inf_Motor_AllMotorsWork();
}
关键点:
- 使用STM32 HAL库的 HAL_TIM_PWM_Start 函数启动四个定时器通道
- 每个电机对应独立的定时器和通道
- 初始化时将所有电机速度设为0(安全启动)
2.2 单电机速度控制
复制代码
void Inf_Motor_SetSpeed(Motor_Struct *motor)
{
/* 速度限幅保护(0-1000) */
motor->speed = LIMIT(motor->speed, 0, 1000);
/* 根据电机位置选择对应PWM通道 */
if(motor->location == LEFT_TOP) {
__HAL_TIM_SetCompare(&htim3, TIM_CHANNEL_1, motor->speed);
}
else if(motor->location == LEFT_BOTTOM) {
__HAL_TIM_SetCompare(&htim4, TIM_CHANNEL_4, motor->speed);
}
else if(motor->location == RIGHT_TOP) {
__HAL_TIM_SetCompare(&htim2, TIM_CHANNEL_2, motor->speed);
}
else if(motor->location == RIGHT_BOOTTOM) {
__HAL_TIM_SetCompare(&htim1, TIM_CHANNEL_3, motor->speed);
}
}
复制代码
技术要点:
- 使用 LIMIT 宏实现速度限幅(0-1000)
- 通过 __HAL_TIM_SetCompare 直接设置PWM占空比
- 采用位置标识区分不同电机
2.3 全电机控制
复制代码
void Inf_Motor_AllMotorsWork(void)
{
/* 统一设置所有电机速度 */
Inf_Motor_SetSpeed(&motorLeftTop);
Inf_Motor_SetSpeed(&motorLeftBottom);
Inf_Motor_SetSpeed(&motorRightTop);
Inf_Motor_SetSpeed(&motorRightBottom);
}
复制代码
特点:
- 提供批量设置接口
- 确保多个电机同步更新
三、 设计亮点
1. 硬件抽象设计 :
- 将电机控制抽象为独立模块
- 通过 Motor_Struct 结构体封装电机属性
2. 安全机制 :
- 启动时自动归零
- 强制速度限幅
3. 可扩展性 :
- 清晰的接口设计
- 方便支持更多电机
四、 总结
该电机控制模块展示了如何通过STM32定时器实现精准的PWM控制,为无人机飞控提供了可靠的执行器接口。模块化设计和安全机制使其具有良好的工程实用价值。




