完整演示视频请前往Bilibili观看:【2026 机器人模块大赛】机器人关节高精度闭环驱动模块_哔哩哔哩_bilibili
一、作品简介
1. 作品名称、作者、作品照片
作品名称: 机器人关节高精度闭环驱动模块
作者(MPS):XXYY
作品照片:
2. 作品功能介绍
本项目设计了一款面向机器人单关节应用的高精度闭环驱动模块,可用于机械臂关节、小型执行机构及自动追踪基座等场景。
软件实现了电机启停、正反转、速度闭环、角度闭环、电流监测、堵转保护、参数存储及串口控制,形成了一套结构紧凑、功能完整且便于扩展的机器人关节驱动方案。
3. 物料清单
本项目使用的主要器件如下表所示,其中MP6540H、MA600A、MCS1805和MP4583为本次向MPS申请并实际使用的芯片。
| 器件 | 型号 | 主要用途 |
|---|---|---|
| 主控芯片 | STM32F103C8T6 | 完成FOC运算、PWM输出、ADC采样、串口通信及保护逻辑 |
| 三相电机驱动芯片 | MP6540H | 驱动三相无刷电机,完成三相功率输出 |
| 磁角度传感器 | MA600A | 检测电机转子绝对角度,为速度和位置闭环提供反馈 |
| 电流传感器 | MCS1805 | 检测12 V母线输入电流,用于功耗分析和堵转判断 |
| 降压稳压芯片 | MP4583 | 将12 V或更高输入电压转换为5V |
| 主控供电器件 | AMS1117 | 为STM32、角度传感器等低压模块供电3.3V |
二、系统框图
-
电源模块: 12 V输入一路经MCS1805为MP6540H和电机供电,另一路经MP4583和AMS1117-3.3转换为5 V和3.3 V。
-
主控模块: STM32F103C8T6负责FOC运算、PWM生成、ADC采样、串口通信及保护逻辑。
-
电机驱动: STM32输出三相PWM和使能信号,MP6540H驱动无刷电机,电机通过30:1减速器输出关节力矩。
-
角度反馈: MA600A检测转子绝对角度,通过SPI反馈至主控,实现速度和位置闭环。
-
电流检测: MP6540H提供三相电流信号,MCS1805检测母线电流,用于状态监测和堵转保护。
-
通信与存储: UART用于控制和日志输出,内部Flash保存零电角度、传感器方向及关节零点;RS485和CAN作为扩展接口,可按需连接。
三、各部分功能说明
1. 原理图:
本项目硬件主要由电源管理、主控、电机驱动、角度检测和电流检测等模块组成,各模块协同实现机器人关节的高精度闭环控制。
-
电源模块: 采用MP4583完成12V输入电压降压至5V,并通过AMS1117-3.3产生3.3V电源,为控制及传感器模块供电;电机驱动部分直接采用12V母线供电。各电源节点配置滤波和去耦电容,提高系统稳定性。
-
主控模块: 采用STM32F103C8T6作为核心控制器,负责FOC算法计算、PWM信号生成、传感器数据采集、通信控制以及故障保护逻辑,实现电机速度和位置闭环控制。
-
电机驱动模块: 采用MP6540H三相无刷电机驱动芯片,接收STM32输出的三相PWM控制信号,实现BLDC电机驱动。同时通过nSLEEP、nFAULT等接口完成驱动使能和状态监测。
-
角度检测模块: 采用MA600A磁角度传感器,通过SPI接口与STM32通信,实时获取电机转子绝对机械角度,为电角度计算、速度估算以及闭环控制提供反馈。
-
电流检测模块: 系统通过MP6540H内部采样接口获取三相电流信息,用于电机运行状态分析;同时采用MCS1805检测电机驱动母线电流,用于功耗监测、日志记录及堵转保护。
2. PCB介绍:
本项目采用双层PCB设计,根据功能将电源、主控、电机驱动、传感器及通信接口进行模块化布局。
电机驱动部分靠近电机接口,缩短功率走线;主控与反馈采集电路集中布置,提高信号稳定性。
通过合理的电源滤波、去耦设计和走线规划,保证系统在电机高速开关运行下的可靠性。
四、作品源码
软件流程图:
关键代码(源码附在文中最后):
1. 系统初始化与主控制循环
对应文件: user/main.c
系统依次初始化通信、传感器、ADC、DMA和PWM,并将默认目标速度设置为零。主循环持续执行软限位、闭环控制、FOC换相和串口命令处理。
int main(void)
{
foc_port_gpio_init();
foc_port_uart_init(115200);
SPI1_MA600_Init();
foc_port_adc_init();
foc_port_pwm_init();
foc_port_timebase_init();
foc_port_delay_ms(1000);
MagneticSensor_Init();
foc_port_load_defaults();
foc_port_apply_config(&g_foc_port_cfg);
torque_controller = Type_voltage;
controller = Type_velocity;
target = 0.0f;
Motor_init();
Motor_initFOC();
PID_init();
joint_zero_motor_angle =
Motor_get_joint_zero_motor_angle();
foc_port_systick_count_mode();
while (1)
{
apply_joint_soft_limit();
move(target);
loopFOC();
commander_run();
if (time1_cntr >= CURRENT_MONITOR_MS)
{
time1_cntr = 0;
print_motor_status();
}
}
}
2. MA600A角度读取与多圈处理
对应文件: SimpleFOC/MagneticSensor.c
MA600A输出16位单圈绝对角度。程序通过检测角度过零变化累计电机圈数,从而获得多圈机械角度。
#define MA600A_CPR 65536UL
static uint32_t sensor_raw;
static int32_t sensor_turn_count;
static uint32_t sensor_update(void)
{
uint32_t raw = foc_port_ma600a_raw();
int32_t delta =
(int32_t)raw - (int32_t)sensor_raw;
int32_t half_cpr =
(int32_t)(MA600A_CPR / 2U);
if (delta > half_cpr)
sensor_turn_count--;
else if (delta < -half_cpr)
sensor_turn_count++;
sensor_raw = raw;
return raw;
}
float getMechanicalAngle(void)
{
return ((float)sensor_raw /
(float)MA600A_CPR) * _2PI;
}
float getAngle(void)
{
sensor_update();
return (float)sensor_turn_count * _2PI +
getMechanicalAngle();
}
float electricalAngle(void)
{
return _normalizeAngle(
sensor_direction *
getMechanicalAngle() *
pole_pairs -
zero_electric_angle
);
}
3. PWM同步三相电流与母线电流采样
对应文件: Hardware/timer.c、SimpleFOC/foc_port.c
TIM1_CH4在PWM计数峰值后约 0.5 μs 触发ADC注入组,对三相电流进行同步采样。MCS1805母线电流则通过ADC常规组和DMA连续采集。
/* TIM1_CH4:PWM峰值后约0.5 μs触发ADC */
oc.TIM_Pulse = PWM_Period - 1 - 36;
TIM_OC4Init(TIM1, &oc);
/* PA0~PA2:三相电流ADC注入组 */
ADC_InjectedSequencerLengthConfig(ADC1, 3);
ADC_InjectedChannelConfig(
ADC1, ADC_Channel_0, 1,
ADC_SampleTime_1Cycles5
);
ADC_InjectedChannelConfig(
ADC1, ADC_Channel_1, 2,
ADC_SampleTime_1Cycles5
);
ADC_InjectedChannelConfig(
ADC1, ADC_Channel_2, 3,
ADC_SampleTime_1Cycles5
);
ADC_ExternalTrigInjectedConvConfig(
ADC1,
ADC_ExternalTrigInjecConv_T1_CC4
);
/* PA3:MCS1805母线电流,常规组连续转换 */
ADC_RegularChannelConfig(
ADC1, ADC_Channel_3, 1,
ADC_SampleTime_55Cycles5
);
ADC_DMACmd(ADC1, ENABLE);
ADC_ITConfig(ADC1, ADC_IT_JEOC, ENABLE);
ADC_ExternalTrigInjectedConvCmd(ADC1, ENABLE);
DMA_Cmd(DMA1_Channel1, ENABLE);
ADC_SoftwareStartConvCmd(ADC1, ENABLE);
4. 速度与角度闭环控制
对应文件: SimpleFOC/BLDCMotor.c
速度模式使用速度PI计算q轴电压;角度模式采用位置环与速度环级联,首先由角度误差计算目标速度,再由速度误差计算输出电压。
void move(float new_target)
{
if (stall_fault_latched)
{
voltage.q = 0.0f;
voltage.d = 0.0f;
return;
}
shaft_velocity = shaftVelocity();
switch (controller)
{
case Type_angle:
shaft_angle_sp = new_target;
/* 角度外环:角度误差转换为目标速度 */
shaft_velocity_sp =
PID_angle(
shaft_angle_sp -
shaft_angle
);
/* 速度内环:速度误差转换为q轴电压 */
voltage.q =
PID_velocity(
shaft_velocity_sp -
shaft_velocity
);
voltage.d = 0.0f;
break;
case Type_velocity:
shaft_velocity_sp =
_constrain(
new_target,
-velocity_limit,
velocity_limit
);
voltage.q =
PID_velocity(
shaft_velocity_sp -
shaft_velocity
);
voltage.d = 0.0f;
break;
default:
break;
}
Motor_check_stall();
}
5. Flash标定参数加载与自动对齐
对应文件: SimpleFOC/BLDCMotor.c
系统上电后读取Flash中的传感器方向、零电角度和关节零点。数据有效时直接加载;数据无效时自动执行一次电机对齐并写入Flash,避免后续上电重复对齐。
void Motor_initFOC(void)
{
int calibrated;
if (!foc_port_driver_is_enabled())
return;
calibrated = Motor_load_calibration();
if (calibrated)
{
sensor_direction =
motor_calibration.data
.saved_sensor_direction;
zero_electric_angle =
motor_calibration.data
.saved_zero_electric_angle;
printf(
"MOT: calibration loaded\r\n"
);
}
else
{
printf(
"MOT: no calibration, aligning\r\n"
);
if (!alignSensor())
return;
motor_calibration.data
.saved_joint_zero_mechanical_angle =
getMechanicalAngle();
if (Motor_write_calibration())
printf(
"MOT: calibration saved\r\n"
);
else
printf(
"MOT: flash write failed\r\n"
);
}
shaft_velocity = shaftVelocity();
shaft_angle = shaftAngle();
if (motor_calibration_is_valid)
Motor_restore_joint_zero_reference();
else
joint_zero_motor_angle = shaft_angle;
}
五、作品功能演示视频
作品功能演示视频放置在帖子顶部,同时上传至哔哩哔哩,方便观看和分享。
-
焊接完成图
PCB正面布置了主控、电源、电机驱动和大部分外围器件,背面主要放置MA600A角度传感器。该设计便于手工焊接和调试。若进一步追求紧凑结构,可在后续版本中对元器件进行双面高密度布置。 -
关节减速电机组装
项目采用减速比为30:1的二级行星减速器,并参考开源结构重新完成机械设计。减速器组装完成后整体结构紧凑,能够降低输出速度并显著提升关节输出力矩。 -
串口控制及实时日志
系统通过串口持续输出三相电流、母线电流、速度、关节角度、输出电压和故障状态。输入 HELP 可以查看全部控制指令。 -
减速器负载能力测试
安装30:1减速器后,对关节负载能力进行测试。将关节固定后,可以看到其能够带动约600 g的水进行旋转和位置保持,说明该驱动模块具备一定的机器人关节负载能力。(原2804电机最大力矩为0.03N·m,增加减速齿轮后,按0.8效率,可在该位置提供1kg的拉力) -
外部指令控制往复运动
通过脚本周期发送目标位置,控制关节电机往复运动。在其上面固定一个小扇子,带动徐徐微风。期间电机运动平稳、安静。 -
更多展示
更多展示请观看视频演示~
六、项目总结
1. 总结:
本项目完成了一套面向机器人单关节应用的高精度闭环驱动模块。
硬件以STM32F103C8T6为主控,结合MP6540H、MA600A、MCS1805和MP4583,实现了三相无刷电机驱动、角度反馈、母线电流监测、电源管理和外部通信等功能。
软件完成了速度闭环、角度闭环、关节坐标换算、PWM同步采样、DMA数据传输、堵转保护、Flash参数存储及CLI控制。
2. 应用:
本项目可用于机械臂单关节、小型执行机构、云台、自动追踪基座和机器人头部等设备。
配合30:1行星减速器后,能够获得较低的输出速度和更高的输出力矩;配合ESP32或树莓派摄像头,还可以实现基于视觉的目标自动追踪。
3. 不足:
受项目时间和双层PCB空间限制,当前版本仍存在部分可改进之处:
① 原理图中尚未加入复位按钮、BOOT按钮、用户按钮及更加完善的指示灯和接口保护;
② 三相功率走线宽度有限,不适合更大电流;
③ 通信方式目前仅支持UART,尚未加入RS485和CAN;
④ 控制系统目前采用电压模式完成速度和位置闭环,尚未加入完整的电流内环。
4. 之前的帖子链接:
【2026 机器人模块大赛】机器人关节高精度闭环驱动模块-PCB完整焊接测试 - 市场应用解决方案 / 机器人 - MPS技术论坛
【2026 机器人模块大赛】机器人关节高精度闭环驱动模块-PCB焊接电源部分 - 市场应用解决方案 / 机器人 - MPS技术论坛
【2026 机器人模块大赛】机器人关节高精度闭环驱动模块-PCB绘制 - 市场应用解决方案 / 机器人 - MPS技术论坛
【2026 机器人模块大赛】机器人关节高精度闭环驱动模块-原理图修正 - 市场应用解决方案 / 机器人 - MPS技术论坛
【2026 机器人模块大赛】机器人关节高精度闭环驱动模块-基本原理图绘制 - 市场应用解决方案 / 机器人 - MPS技术论坛
5. 项目源码、减速电机3D模型、PCB工程:
项目源码:
MPS_Robot_Motor_Driver_STM32F1.zip (436.5 KB)
3D模型文件:
参考的github工程:github.com/SiyphuS/FICO-44
补充的3D模型元件:针对2804电机的元件.zip (146.7 KB)
PCB工程(立创EDA专业版):
MPS机器人关节电机驱动——原理图与PCB文件.zip (235.9 KB)
七、补充说明
报告内系统框图、软件流程图借助 GPT AI 辅助生成;
演示视频配音采用微软 Azure 文本转语音神经网络音色「云枫(zh-CN-YunfengNeural)」合成。
本次所有资源均在工具官方个人免费试用权限内使用,仅用于技术分享。












