【2026 机器人模块大赛】机器人关节高精度闭环驱动模块-完整作品

完整演示视频请前往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.cSimpleFOC/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;
}

五、作品功能演示视频

作品功能演示视频放置在帖子顶部,同时上传至哔哩哔哩,方便观看和分享。

【2026 机器人模块大赛】机器人关节高精度闭环驱动模块_哔哩哔哩_bilibili

  1. 焊接完成图
    PCB正面布置了主控、电源、电机驱动和大部分外围器件,背面主要放置MA600A角度传感器。该设计便于手工焊接和调试。若进一步追求紧凑结构,可在后续版本中对元器件进行双面高密度布置。

  2. 关节减速电机组装
    项目采用减速比为30:1的二级行星减速器,并参考开源结构重新完成机械设计。减速器组装完成后整体结构紧凑,能够降低输出速度并显著提升关节输出力矩。

  3. 串口控制及实时日志
    系统通过串口持续输出三相电流、母线电流、速度、关节角度、输出电压和故障状态。输入 HELP​ 可以查看全部控制指令。

  4. 减速器负载能力测试
    安装30:1减速器后,对关节负载能力进行测试。将关节固定后,可以看到其能够带动约600 g的水进行旋转和位置保持,说明该驱动模块具备一定的机器人关节负载能力。(原2804电机最大力矩为0.03N·m,增加减速齿轮后,按0.8效率,可在该位置提供1kg的拉力)

  5. 外部指令控制往复运动
    通过脚本周期发送目标位置,控制关节电机往复运动。在其上面固定一个小扇子,带动徐徐微风。期间电机运动平稳、安静。

  6. 更多展示
    更多展示请观看视频演示~

六、项目总结

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)」合成。

本次所有资源均在工具官方个人免费试用权限内使用,仅用于技术分享。

欢迎大家多多点评和提问哦~

视频中有个口误,实际的限制角度范围为-90°到+90°,视频中错误说成了±180°。

楼主太专业了,PCB、减速器都太漂亮了,这个更具实用价值,视频做的也相当哇塞!还有同款Help指令 :joy:

这个项目已经是一个非常优秀的机器人关节参考设计,尤其是把减速器负载能力实测数据(0.03N·m→约1kg拉力)给出来,非常有说服力。