基于STM32的无人机电机控制模块设计与实现
一、模块概述
本文介绍了一个基于STM32 HAL库的无人机电机控制模块实现,该模块通过PWM信号控制四个无刷电机的转速,是飞控系统的关键执行部件。
无人机电机选择空心杯电机的原因主要为:
1.空心杯电机的效率通常在85%到90%之间,高效率为其突出特点。
2.同时空心杯电机具有高转速、低噪音的特点。
3.电机整体体积小、重量轻有助于提升无人机的飞行效率和稳定性。
4.电机灵敏的控制特性,起动、制动、响应快。能够实现更精准的控制和更复杂的飞行动作。
5.无人机需长时间运行和频繁起降,长寿命与可靠性的特点成为无人机的首选电机类型。

二、 核心功能实现
2.1 电机初始化
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控制,为无人机飞控提供了可靠的执行器接口。模块化设计和安全机制使其具有良好的工程实用价值。

浙公网安备 33010602011771号