关注+星标公众号,不错过精彩内容
作者 | strongerHuang
公众号 | strongerHuang
这里给大家分享一个闭环步进伺服软硬件开源的项目:StepperServo,有做电机开发相关的朋友可以参考一下。
软件开源地址:
https://github.com/dzid26/StepperServoCAN
硬件开源地址:
https://github.com/dzid26/StepperServo-hardware

一、项目概述
StepperServoCAN 是一个开源的闭环步进电机控制器项目,包含固件代码仓库(StepperServoCAN)和硬件设计仓库(StepperServo-hardware)两部分。
该项目定位为一款支持 CANbus 通信的闭环步进电机驱动控制器,完整开源了硬件原理图、PCB 设计文件以及固件源码,并支持 PlatformIO 进行构建和固件烧录。
二、硬件设计分析
2.1 核心主控芯片
硬件平台选用 STM32F103C8T6 作为主控 MCU,其丰富的外设资源(包括多路 SPI、I2C、USART 以及双 CAN 控制器)恰好满足了本项目对 CAN 通信和多路模拟量采集的需求。
2.2 电机驱动电路
电机驱动部分采用 A4950 半桥驱动器,该芯片集成了 MOSFET 功率管和电流限制功能,能够驱动两相步进电机。A4950 支持 PWM 调压调速,配合 STM32 的定时器输出 PWM 信号,可实现平滑的电流控制。固件中对两相电流进行闭环调节,通过磁传感器反馈实现精确的转矩控制。
2.3 角度传感器
项目采用 TLE5012 磁编码器芯片,这是一款基于 GMR(巨磁阻)效应的 15 位角度传感器。其核心优势在于:
•非接触式测量:无需机械编码器,可靠性高,适合工业环境
•15 位分辨率:提供 32768 个离散角度位置,足以满足大多数伺服控制场景
•集成温度传感:芯片同时提供温度测量功能,可用于电机过热保护
•低功耗设计:传感器可在睡眠模式下关闭,降低系统待机功耗
磁编码器需要配合径向充磁的圆盘磁铁使用,磁铁通过胶水固定在电机轴上,与传感器保持约 1mm 的气隙。
2.4 保护与接口设计
硬件在可靠性设计上做了较多考虑:
•电源保护:支持 32V 供电电压,具备反接保护和换向连接器保护,输入端加入 ESD 防护
•电流检测:支持低边电流检测、电机母线电压(V_mot)和电池电压(V_Bat)采集,以及 PCB 温度测量
•CAN 接口:配备 CAN 收发器,支持待机模式,适合汽车和工业场景
•调试接口:提供 SWD 调试端口用于固件烧录和调试,接口处加入 ESD 防护
•扩展接口:可选的 Enable 端口支持 Break 中断能力用于安全急停;可选的扩展端口支持连接 UART/I2C/PWM 设备或传感器(最大 0.4A,v0.6 版本支持 1A)
•PCB 设计:采用单面 PCB 设计,可直接安装在电机上,底部平面设计有利于散热和电机温度测量
2.5 电气规格限制
硬件明确标注了电气极限参数:
•每相峰值堵转电流:3.3A(持续 5 秒)
•电机连续运行 RMS 电流:3.3A(持续 1 分钟以上,指带载旋转但未堵转的状态)
•供电电压:32V
这些参数决定了电机的输出能力边界,在实际应用中需要合理设计散热方案。

三、固件架构分析
3.1 开发环境与构建系统
固件采用 PlatformIO 作为构建和开发环境,而非传统的 STM32 官方 IDE。这一选择体现了项目的开源和跨平台理念:
•PlatformIO:支持 VSCode 集成开发,提供跨平台编译、调试和上传功能
•标准外设库:固件底层使用 ST 的标准外设库(Standard Peripheral Library)进行寄存器级配置,位于 src/lib 目录中
•CAN 协议生成:CAN 通信的 C 代码通过 cantools 工具从 DBC 文件自动生成,通过 generate_Msg.sh 脚本驱动,实现了通信协议与驱动代码的解耦
3.2 CAN 总线通信协议
CAN 通信是本项目的核心特征之一。控制器通过 CANbus 接收上位机指令并上报状态数据,通信周期为 10ms。
下行命令(STM32 接收)—— ID 0x22E (STEERING_COMMAND):
信号名称 | 说明 |
STEER_TORQUE | 目标转矩(Nm),用于转矩控制模式 |
STEER_ANGLE | 目标角度(deg),用于角度控制模式 |
STEER_MODE | 控制模式选择:0=关闭、1=转矩控制、2=角度控制(PID闭环+转矩前馈)、3=软关闭(1秒内转矩归零) |
COUNTER | 帧计数器,用于通信完整性检测 |
CHECKSUM | 校验和 |
上行状态(STM32 发送)—— ID 0x22F (STEERING_STATUS):
信号名称 | 说明 |
STEERING_ANGLE | 当前电机角度(deg) |
STEERING_SPEED | 当前转速(rev/s) |
STEERING_TORQUE | 当前输出转矩(Nm) |
CONTROL_STATUS | 控制状态标志 |
COUNTER | 帧计数器 |
CHECKSUM | 校验和 |
TEMPERATURE | 传感器温度(摄氏度) |
DEBUG_STATES | 调试状态信息 |
值得注意的是,CAN 标识符支持自定义配置——通过在 platformio.ini 中设置构建标志(如 NVM_SET_CAN_STATUS_ID 和 NVM_SET_CAN_COMMAND_ID)可将 ID 存储在 EEPROM 中,也可以通过板载焊盘跳线以 3 为步长偏移,最多支持 4 组独立 CAN 标识符配置。
3.3 控制算法与校准机制
固件的控制策略包含多层设计:
模式切换逻辑:
•TorqueControl 模式:直接使用 STEER_TORQUE 信号控制输出转矩
•AngleControl 模式:使用 STEER_ANGLE 信号通过 PID 闭环控制绝对角度,同时以 STEER_TORQUE 作为前馈信号,实现”位置+转矩前馈”的复合控制策略
•SoftOff 模式:安全模式,在 1 秒内将转矩平滑衰减至零,用于通信故障时的安全停机
自动校准流程:
1.首次启动时加载默认参数并存储到 Flash
2.自动检测电机接线方式(motorWiring)——通过短暂驱动两相并观察磁传感器响应来确定
3.等待用户确认传感器校准(蓝色 LED 常亮提示),按下 F1 键启动校准
4.校准完成后将参数保存到 Flash,断电不丢失
5.可通过 readCalibration.py 脚本从 Flash 中读取校准值
配置参数:
用户需在 actuator_config.c 中配置以下参数:
•rated_current(额定电流)和 rated_torque(额定转矩)
•motor_gearbox_ratio(电机齿轮箱比)
•final_drive_ratio(最终传动比)
•支持负值反转电机旋转方向
3.4 调试与开发工具
项目提供了丰富的调试手段:
•LED 状态指示:蓝色 LED 表示等待用户交互(校准确认),红色 LED 指示各类错误(CPU 过载、编码器初始化失败、电源电压不足等)
•PlatformIO 调试:支持 VSCode 中 F5 启动调试,使用半主机模式(semihosting)将调试信息输出到控制台
•STMViewer:通过 SWD 接口连接,可实时查看和编辑 STM32 全局变量,固件目录中提供了示例配置文件
•GUI 测试工具:提供 StepperServoCANtester.py 图形界面程序,基于 Python + tkinter + python-can 实现,支持 PC 端直接控制电机
3.5 与 openpilot 的集成
该项目的一个重要应用场景是与 openpilot 自动驾驶系统对接。项目提供了参考实现,包括:
•opendbc 目录中存放 ocelot_controls.dbc 通信数据库文件
•car/xxx/xxxcan.py 中实现 CAN 消息发送
•car/xxx/carstate.py 中实现 CAN 状态解析
•safety/safety_xxx.h 中实现 CAN 发送过滤器和安全策略
这种设计使得该步进电机驱动器可以被用作汽车转向执行器,体现了项目在汽车电子领域的应用潜力。
四、系统级设计亮点
4.1 全栈开源理念
从硬件原理图、PCB 布局到固件源码、上位机测试工具,项目实现了完整的开源闭环。开发者使用 KiCad 进行硬件设计,通过 CI/CD 流水线(GitHub Actions + KiBot)自动构建和预览硬件输出,体现了现代化的开源硬件工程实践。
4.2 工程化代码规范
固件开发遵循 MISRA C:2012 编码规范,并使用 Cppcheck 进行静态分析。项目预配置了 misra.json 规则集,与 VSCode 中的 C/C++ Advanced Lint 和 SonarLint 集成,在编码阶段即可发现潜在违规。这种工程化实践在个人开源项目中较为罕见,体现了开发者对代码质量的重视。
4.3 EEPROM 非易失存储策略
校准参数和控制配置存储在 EEPROM 中,固件烧录不会擦除 EEPROM 内容。这意味着用户可以反复刷入新版本固件而无需重新校准,极大地提升了开发效率和用户体验。
4.4 模块化与可移植性
CAN 通信层通过 cantools 从 DBC 文件自动生成代码,实现了通信协议定义与底层驱动的解耦。这种设计使得更换 DBC 文件即可适配不同的 CAN 信号定义,提高了代码的可移植性和复用性。
五、开源许可与生态
固件部分基于 Misfittech 项目(源自 nano_stepper 项目),继承 GPL v3 许可证。硬件设计采用 GPL-3.0 许可证。这意味着基于该项目的衍生作品在商业分发时也必须保持开源。
项目的主要依赖组件包括:
•cantools(CAN 数据库解析库)
•opendbc(comma.ai 的开源 CAN 数据库)
•PlatformIO(嵌入式构建平台)
•KiCad(开源 EDA 工具)
初始软件和硬件设计还参考了 Makerbase、Misfittech 和 Bigtreetech 等开源项目。
六、总结
StepperServoCAN 项目展示了一个完整的、可用于实际产品的闭环步进电机伺服驱动方案。从嵌入式工程师的角度来看,该项目的价值不仅在于其功能实现,更在于其工程化实践——从 MISRA C 编码规范到 CI/CD 自动化构建,从 DBC 驱动的通信层设计到完善的调试工具链,都体现了较高的工程素养。
对于嵌入式开发者而言,该项目提供了多个可学习的切入点:STM32 定时器与 PWM 配置、磁编码器驱动开发、CAN 总线协议实现、PID 闭环控制算法、EEPROM 数据存储策略等。同时,其与 openpilot 的集成方案也为汽车电子方向的开发者提供了有价值的参考。
在硬件方面,单面 PCB 设计兼顾了成本控制和散热需求,丰富的保护电路设计体现了工业级产品的可靠性考量。对于希望从零搭建运动控制系统的开发者来说,该项目提供了一个可直接使用或二次开发的完整基线。