42步进电机FOC闭环恒流驱动v1.0

本文介绍了使用CW32F030C8T6控制芯片的FOC闭环步进电机系统,包括全桥驱动、电源管理、通信接口、OLED显示及磁编码器选择。软件部分提供源码链接,但强调功能尚不完善,可能存在细节错误。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

声明:参考B站UP銀河旅人。这是第一版软硬件,仅作学习交流,仅验证基本功能,程序尚不完善。软件为9月份编写,有些细节记忆不是很清晰,文档中描述可能会有错误。

效果见B站:步进电机FOC闭环,进度更新,加入上位机_哔哩哔哩_bilibili

FOC闭环步进,基础速度位置环,站在大佬的肩膀上的大佬的肩膀上_哔哩哔哩_bilibili

銀河旅人:  https://space.bilibili.com/279542681?spm_id_from=333.337.0.0

  • 当前进度
  1. FOC速度位置闭环
  2. 上位机控制
  3. OLED基本信息显示
  • 硬件介绍

使用CW32F030C8T6作为控制芯片

1、全桥驱动使用TB64H750,通过对PWM进行二阶RC低通滤波实现DAC恒流驱动

2、电源部分:12v->5v->3v3,输入部分接入TVS和防反接电路,注意选用的步进电机内阻,防止母线电流过大烧毁MOS。

3、设计步进电机可串接,通过RS485通讯,理论可行未实际验证

4、通过sh1.0接口引出UART,SWD,I2C接口,这里I2C接入了OLED显示基本信息,使用上位机控制OLED使用与否。注意OLED刷新会加长软件执行时间,影响FOC运行带宽,电机运转会有周期性卡顿。

5、板载NTC,电压检测、BUZZER、拨码开关、2xLED,实际作用根据大家需求设计。

6、磁编码器选择:程序中使用14BIT编码器,这里具体型号为MT6701。使用其他编码器,例如AS5600需要自行调整程序。这里FOC的实现方式为校准时旋转一圈,记录4X50步每一步的绝对角度范围。使用12BIT编码器会涉及到个问题:4096/200 =20.48 ;14BIT:16380/200=81.9;使用12BIT在实际旋转时有些小问题,具体看代码吧,记得不是很清楚了,在查找扇区那块。

  • 软件介绍

详见源码,关键部分有注释解释,为个人理解,可能会有些错误。

### STM32 实现步进电机 FOC 闭环驱动 #### 初始化与配置 为了在STM32平台上实现步进电机FOC(磁场定向控制)闭环驱动,首先需要完成必要的初始化工作。这包括创建`StepperMotor`对象、初始化位置传感器(如编码器或磁传感器)、设定PID控制器参数,并将这些组件关联起来。 ```cpp #include "SimpleFOC.h" // 定义电机和传感器引脚 #define MOTOR_PIN_1A PB4 #define MOTOR_PIN_1B PB5 #define SENSOR_CS PA4 // 创建 StepperMotor 和 MagneticSensorSPI 对象 StepperMotor motor(200); // 假设每圈有200个脉冲 MagneticSensorSPI sensor(SENSOR_CS); PIDController pid; void setup() { Serial.begin(115200); // 配置电机引脚模式 pinMode(MOTOR_PIN_1A, OUTPUT); pinMode(MOTOR_PIN_1B, OUTPUT); // 初始化磁传感器 sensor.init(); // 将磁传感器连接到电机 motor.linkSensor(&sensor); // 关联 PID 控制器至电机 motor.controller = &pid; // 启用串行监控以便查看状态信息 motor.useMonitoring(Serial); // 初始化电机本身 motor.init(); } ``` 此部分代码完成了硬件资源分配及软件环境搭建的工作[^2]。 #### 主循环逻辑 进入主程序循环后,核心任务在于持续执行FOC算法迭代计算,依据当前获取的实际角度偏差调整施加给定子绕组上的电压矢量大小方向;同时利用PID调节机制确保最终能够稳定跟踪预设轨迹。 ```cpp float target_position = 0; bool reached_final_pos = false; void loop() { // 更新 FOC 状态机 motor.loopFOC(); // 如果未到达目标位置,则继续前进 if (!reached_final_pos){ motor.move(target_position); // 检查是否已抵达终点 if (motor.isFinalPositionReached()){ delay(1000); // 到达目的地后暂停一秒 reached_final_pos = true; } } else{ // 已经到位后的处理... } // 执行其他周期性任务... } ``` 上述片段展示了如何在一个典型的Arduino风格框架内实施基于位置反馈的闭环控制系统[^1]。 #### 编程方式的选择 对于STM32而言,在编写此类应用程序时通常会面临三种不同的编程途径:直接操控底层寄存器可以获得最高的性能表现但复杂度极高;借助于ST公司提供的标准外设库(ST Standard Peripheral Library),可以在牺牲一定效率的基础上换取更易读写的API接口;而采用最新的HAL(Hardware Abstraction Layer)库则进一步降低了入门门槛,尽管可能带来额外的时间开销[^3]。 考虑到开发便捷性和跨平台兼容性的需求,推荐初学者优先考虑使用HAL库来进行项目构建。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值