【电机控制】STM32F103CXT6无刷直流电机SimpleFOC学习板实战:从硬件焊接调试到位置/速度双环控制
1. 从零开始搭建无刷电机控制学习板
第一次接触无刷电机控制时,我被各种专业术语搞得晕头转向。FOC、PWM、霍尔传感器...这些名词就像天书一样。直到发现了SimpleFOC这个开源库,才真正找到了入门的方向。今天要分享的这个项目,就是基于STM32F103CXT6和SimpleFOC库搭建的无刷电机学习平台,特别适合像我这样的初学者。
这个学习板最大的特点就是简化了电流环,专注于位置和速度控制。你可能要问:为什么去掉电流环?其实在入门阶段,电流环调试难度大,容易让人望而却步。我们先掌握位置和速度控制,等基础打牢了再进阶到完整的FOC控制会更顺畅。
我用的主控是STM32F103CXT6,这是颗性价比极高的Cortex-M3芯片。虽然现在M4/M7更强大,但对于学习SimpleFOC来说完全够用。电机选用的是常见的2804无刷电机,搭配DRV8313驱动芯片和AS5600磁编码器。整套硬件成本控制在200元以内,非常适合学生和爱好者。
2. 硬件设计与焊接要点
2.1 PCB设计注意事项
在立创EDA上设计PCB时,有几个关键点需要特别注意。首先是电源布局,我采用了ASM1117-3.3V稳压芯片为系统供电。这里有个坑要注意:DRV8313的VM(电机电源)和VCC(逻辑电源)必须分开供电,否则电机启动时的电流波动会导致MCU复位。
第二个重点是信号隔离。PWM信号线要尽量短,并且远离模拟信号区域。我在设计时犯过一个错误,把编码器的I2C信号线布得太靠近电机驱动线路,结果导致编码器数据经常出错。后来重新布局,增加了地线隔离才解决问题。
PCB的3D视图显示,元器件布局要考虑到实际焊接和调试的便利性。比如AS5600编码器的位置要方便调整与电机转子的距离,调试接口最好集中在一侧。我建议在PCB边缘预留几个测试点,方便用示波器测量关键信号。
2.2 焊接实战经验分享
拿到嘉立创打样的PCB后,焊接顺序很重要。我的经验是:
- 先焊最小的元件(0402封装的电阻电容)
- 然后焊稳压芯片和CH340C下载电路
- 接着焊STM32主控
- 最后焊DRV8313和接插件
焊接DRV8313时有个技巧:这个芯片底部有散热焊盘,需要用热风枪先加热PCB背面,等焊锡熔化了再放正芯片。我第一次没经验,直接用烙铁焊,结果散热不良导致芯片过热保护。
AS5600编码器的安装也需要注意。磁铁与编码器的理想距离是1-3mm,太近会饱和,太远信号又太弱。我做了个简单的支架,用螺丝调节距离,调试起来很方便。
3. 软件环境搭建与配置
3.1 SimpleFOC库的移植
SimpleFOC库的安装比想象中简单。在Arduino IDE中,通过库管理器直接搜索安装即可。但要注意版本兼容性,我用的2.2.0版本与STM32F103配合最稳定。
库安装好后,需要配置几个关键参数:
// 电机参数设置 BLDCMotor motor = BLDCMotor(7); // 7对极 BLDCDriver3PWM driver = BLDCDriver3PWM(PA8, PA9, PA10, PC13); // PWM引脚和使能引脚 // 编码器配置 MagneticSensorI2C sensor = MagneticSensorI2C(AS5600_I2C); void setup() { sensor.init(); motor.linkSensor(&sensor); }这里最容易出错的是极对数设置。我的2804电机是14极(即7对极),一开始设错了导致转速显示不正常。建议查阅电机规格书确认这个参数。
3.2 参数整定技巧
不带电流环的SimpleFOC调试主要关注两个PID控制器:
- 速度环PID
- 位置环PID
我的经验是从速度环开始调,先设一个保守的P值(比如0.5),I和D设为0。然后逐步增加P直到电机开始振动,再回调20%作为最终值。I值用来消除静差,一般取P值的1/10左右。
位置环的调试方法类似,但响应速度可以慢一些。这里分享一个实测可用的参数组合:
// 速度环PID motor.PID_velocity.P = 0.8; motor.PID_velocity.I = 0.2; motor.PID_velocity.D = 0; // 位置环PID motor.P_angle.P = 5; motor.P_angle.I = 0; motor.P_angle.D = 0;调试时建议用VOFA+上位机实时监控曲线,可以清晰看到超调量和稳定时间的变化。
4. 调试过程中的常见问题
4.1 电机不转的排查步骤
第一次上电时,我的电机死活不转。通过以下步骤最终解决了问题:
- 检查DRV8313的VM电压(我用的12V)
- 测量3.3V逻辑电源是否正常
- 用示波器查看PWM信号(发现占空比设置太小,调整到5%后电机启动)
- 确认AS5600编码器数据是否正常(I2C地址是0x36)
最常见的问题是电源不足。无刷电机启动时需要较大电流,建议使用至少2A的电源。我用的是可调稳压电源,慢慢升高电压观察电流变化。
4.2 位置控制精度优化
在测试位置控制时,发现电机总是有±2°的误差。通过以下改进将误差缩小到0.5°以内:
- 在AS5600和磁铁之间加装铝箔屏蔽,减少电机磁场干扰
- 将I2C时钟从400kHz降到100kHz,提高通信稳定性
- 在代码中增加编码器数据滤波:
sensor.init(); sensor.enableInterrupt(); // 启用硬件中断 sensor.setLpf(0.1); // 低通滤波另一个影响精度的因素是机械安装。电机轴和编码器磁铁必须严格同轴,我的解决办法是用3D打印了一个联轴器,效果立竿见影。
5. 进阶功能实现
5.1 速度梯形控制
在基本速度控制稳定后,我实现了梯形速度曲线控制。主要思路是在SimpleFOC的velocity loop中叠加一个斜坡函数:
float target_velocity = 0; float acceleration = 10; // rad/s^2 void velocityRampControl() { static uint32_t last_time = 0; float dt = (millis() - last_time) / 1000.0; target_velocity += acceleration * dt; motor.move(target_velocity); last_time = millis(); }这个功能特别适合需要平滑启停的应用场景,比如云台控制。
5.2 上位机监控与调试
VOFA+上位机是调试神器,我配置了三个监控通道:
- 目标位置(红色曲线)
- 实际位置(蓝色曲线)
- 速度反馈(绿色曲线)
通过串口发送数据时要注意波特率匹配,我用的配置是:
Serial.begin(115200); motor.useMonitoring(Serial);在VOFA+中创建对应的控件,可以实时调整PID参数,大大提高了调试效率。一个实用技巧是保存调试会话,下次直接加载就能恢复所有曲线设置。
6. 项目优化与扩展方向
现在这个学习板已经能稳定运行位置和速度控制,但还有改进空间。下一步我计划:
- 增加CAN总线接口,实现多电机协同控制
- 尝试移植到PlatformIO环境
- 开发手机APP替代VOFA+进行基础调试
电源部分也可以优化,比如增加电流检测功能,为将来实现完整FOC做准备。虽然目前省略了电流环,但硬件上我已经预留了采样电阻的位置。
机械结构方面,3D打印一个带减速箱的测试平台会更有实用价值。我测试过用GT2同步带传动,效果不错但需要定期张紧。直接上谐波减速器当然更好,只是成本会高不少。
