(所有文件开源)基于STM32G431的电机Foc控制(3D打印电机、摆线减速器+电路设计+三环(位置-速度-电流)、SVPWM控制+(Vofa)图形界面PID调试、波形显示+10kg负载测试)
制作过程+演示+教程(8个视频)(1个月更完) 视频链接:https://www.bilibili.com/video/BV1eRfyB8EVU
所有文件链接:https://pan.quark.cn/s/20bea040f8b7
https://gitee.com/ret2nuh/stm32G431_motor_foc_control_3Dprint_circuit-design
qq群:1092061131 (没想到加群的人这么多,1群满了,有需要的可以加这2群)
概述:
- 机械:核心wk8110,3D打印(耗材:PA6-GF),电机+摆线减速器一体化;
- 驱动板:看下文;
- 代码:
- 实现位置、速度、电流、位置-速度、位置-电流、速度-电流、位置-速度-电流环控制;
- (Vofa串口工具)图形界面PID调试、控制,波形显示;
- SVPWM实现;
- 过流、过温保护;电流、速度滤波实现;
- Can接口;拨盘电位器、按键控制;
机械相关:
- 电机+摆线减速器一体化(减速比16:1)
- 尺寸:111.8 * 111.8 * 53.6 mm
- 重量:500 - 600 g
成本:
- ¥96 wk8110(定子硅钢+线圈+磁铁+转子磁轭)
- ¥63 轴承
- >¥36 3d打印件(耗材:PA6-GF25%)(自备打印机价格,未包含辅件)
- > ¥3 螺丝、热熔螺母、钢轴
- <¥200 电机总成本
- ¥43 驱动板物料成本
材料比对:
- 参数 PA6-GF25%(玻纤增强尼龙) PETG(典型值) 铝合金(典型值)
- 密度 (g/cm³) 1.27 1.27 2.70
- 热变形温度 (°C) 200 75 /
- 拉伸强度 (MPa) 120 60 290
- 弯曲强度 (MPa) 180 80 200
wk8110部分参数::
- 额定电压 24 V
- 额定电流 2.49 A 堵转电流 6.51 A
- 额定扭矩 0.93 N.M 堵转扭矩 2.4 N.M
- 额定转速 349 rpm 最大转速 566 rpm

电机+摆线减速器设计基于B站UP“Cristina绛”的设计进行地再开发
硬件电路:
- 主控 STM32G431(主频170MHz,默认开启FPU),磁编码MT6816(14位精度);
- 栅极驱动 FD6288,6个NMOS(CSD18540Q5B),两路INA240直接采集相电流,一路普通运放下桥臂采集母线/C相电流(冗余);
- 24V供电,带过流、过压、缓启动、防反接、防浪涌电路,输出12V、5V、两路3.3V;
- 接口:FDCAN、串口、SW口;
- 其他:温度监测、led、按键、拨盘电位器、引脚引出;



程序框图:

环路控制:

图片来自网上(忘了出处了)
代码:
- 基于hal库,使用dsp库;
-
foc.c(位置、速度、电流环控制相关、pid相关、svpwm...):
- SVPWM:覆盖从电压归一化、坐标变换、扇区识别到矢量时间分配、占空比输出的全 SVPWM 流程,带多轮限幅与过调制处理;
- PID:分段积分,抗积分饱和、积分衰减、死区判断、限幅、前馈、速度阻尼...;
- 环控制:实现电机端-负载端位置、速度的变换,实现位置、速度、电流、位置-速度、位置-电流、速度-电流、位置-速度-电流环控制;
- 其他:零点校准、一阶低通滤波器、周期差值归一化...;
-
adc.c(3相电流到dq轴电流、电流滤波、过流、过温保护...):
- 3相电流到dq轴电流:采样(带校准)、克拉克变换、帕克变换;
- 电流滤波:3相电流 滑动均值滤波、dq轴电流 一阶低通滤波;
- 过流保护:多重(持续电流过流、瞬间大电流过流)、多次(防误触发)判断;
- 其他:温度、电位器采样...;
- DMA方式;
-
spi.c(mt6816磁编码获取角度、多圈角度计算):
- DMA方式;
-
tim.c(4个定时器):
- 定时器8:pwm控制,发起DMA读取磁编码角度值;
- 定时器7:电机速度计算;
- 定时器6:硬件触发ADC2(温度、电位器采样);
- 定时器4:按键20ms消抖;
-
open_serial_debugger.c(同上位机vofa/open_serial_debugger串口通讯):
- 上位机可图形界面操作 控制模式的选择,目标位置、速度、电流的设置,调试pid等功能(可根据需要自己扩展其他功能),可同时显示多个数据波形;
- justFloat使用DMA方式发送,接收不使用DMA;
-
usart.c(串口DMA方式发送,重定向printf):
- 缓冲区满或遇到换行符发送;
-
fdcan.c(使用传统can帧格式):
- 初始化(过滤器设置,发送头设置,使能);
- 发送函数;
- 接收回调函数;
-
gpio.c(按键、Led):
- 按键中断,按键处理(数据封装);
-
kalman_filter.c(卡尔曼滤波):
-
config.h(参数配置):
foc.c部分代码参考的https://blog.csdn.net/qq570437459 ,推荐大家可以去看看
结果波形图:
-
详情请看视频,这边从视频里截了一些图;
-
空载精度(负载端):
- 位置:误差在 0.3° 左右,支持多圈,范围只要不超 float 最大值就行;
- 速度:误差在 3°/s 上下波动,实测正常控制速度最大在 167°/s (按wk8110参数和减速器减速比换算:额定130°/s,最大200°/s),响应在 240ms 左右;
- 电流:堵转误差在 10mA 上下波动,响应设置在 50ms 左右;




-
负载测试(位置-速度-电流环)(负载端):
- 测试负载在 7.4 - 9.5 kg;
- 位置:误差在 0.5° 以内,支持多圈,范围只要不超 float 最大值就行;
- 速度:误差在 5°/s 上下波动;



负载在重力的作用下拖动电机转动的期间,电机类似于发电机的作用,这里我们看到母线电压被抬升到了30多伏,需要添加制动电阻电路,当电压超过25V时,导通电路消耗这多余的能量;
q轴电流高频波动原因:低转速、减速比1:16、带重载、圆周运动,这种工况下天生就抖,波动来自机械齿隙、摩擦、重力换向等,当然算法上可以针对这种工况做一些优化,减小波动;
7.4kg负载下,随着速度的增大,速度不再是稳定的跟随,到100多°/s,负载从被电机带动到带动电机转动作用力最大的过程中会产生一个短暂的速度尖峰波动(10-20°/s);
-
负载突变测试:

其他:
-
使用软件: SolidWorks、立创EDA、LTspice、STM32CubeMX、VsCode+EIDE、Keil5

问题及解决:
太多了,下载的文件中有一个“ 日志.txt ”的文档,记录了大部分遇到的问题;
AtomGit 是由开放原子开源基金会联合 CSDN 等生态伙伴共同推出的新一代开源与人工智能协作平台。平台坚持“开放、中立、公益”的理念,把代码托管、模型共享、数据集托管、智能体开发体验和算力服务整合在一起,为开发者提供从开发、训练到部署的一站式体验。
更多推荐


所有评论(0)