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

声明:参考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在实际旋转时有些小问题,具体看代码吧,记得不是很清楚了,在查找扇区那块。

  • 软件介绍

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

  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
步进电机FOC控制程序是一种针对步进电机的矢量控制方法。下面是一个简单的步进电机FOC控制程序的示例: ```c #include <stdlib.h> #include <stdio.h> #include <math.h> // 定义 PI 值 #define M_PI 3.14159265358979323846 // 定义步进电机参数 #define STEPS_PER_REVOLUTION 200 // 每转步数 #define MICROSTEPS 16 // 微步数 #define MAX_ACCELERATION 1000 // 最大加速度 // 定义PID控制器参数 #define Kp 1.0 #define Ki 0.0 #define Kd 0.0 // 定义电机状态 typedef struct { float position; float speed; float acceleration; } MotorState; // 初始化电机状态 void init_motor_state(MotorState *state) { state->position = 0; state->speed = 0; state->acceleration = 0; } // 计算相角 float calculate_phase_angle(float angle) { return (angle / (2 * M_PI)) * STEPS_PER_REVOLUTION * MICROSTEPS; } // 计算电机状态 void update_motor_state(MotorState *state, float angle, float dt) { float target_speed = calculate_phase_angle(angle) / dt; float error = target_speed - state->speed; float delta_acceleration = Kp * error + Ki * state->acceleration + Kd * (error - state->speed); state->acceleration = fmin(MAX_ACCELERATION, fmax(-MAX_ACCELERATION, delta_acceleration)); state->speed += state->acceleration * dt; state->position += state->speed * dt; } // 主函数 int main() { MotorState state; init_motor_state(&state); // 设置目标相角和时间步长 float target_angle = 5 * M_PI; float dt = 0.001; // 模拟控制电机的运动 for (float time = 0; time < 10; time += dt) { update_motor_state(&state, target_angle, dt); printf("Time: %f, Angle: %f, Speed: %f, Acceleration: %f\n", time, state.position, state.speed, state.acceleration); } return 0; } ``` 在这个示例中,我们使用了 PID 控制器来计算电机的加速度。首先,我们定义了步进电机的一些参数,如每转步数、微步数和最大加速度。我们还定义了 PID 控制器的参数。然后,我们定义了一个电机状态结构体,其中包含电机的位置、速度和加速度。接下来,我们定义了一些函数来初始化电机状态、计算相角和更新电机状态。最后,我们在主函数中模拟了控制电机的运动,并输出了每个时间步的电机状态。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值