无感FOC 磁链观测器 零速带载闭环启动 堵转力矩保持 直接正反转 算法资料 卖资料,不包括实物

无感FOC 磁链观测器 零速带载闭环启动 堵转力矩保持 直接正反转 算法资料 卖资料,不包括实物 无感FOC 磁链观测器 零速带载闭环启动 堵转力矩保持 直接正反转 算法资料 卖资料不包括实物。 提供cubemx配置文件mdk项目源代码全c语言中文注释 提供调试笔记。无刷电机玩到后期总得碰点硬核技术最近在实验室熬夜调的无感FOC项目有点意思。磁链观测器这玩意儿真不是省油的灯特别是零速启动那会儿电机抖得跟帕金森似的。今天聊聊怎么让电机在零速带着负载直接闭环启动顺便说说正反转切换时那些坑。磁链观测器核心代码就二十来行但参数调起来能要人命。看这段滑模观测器的实现//滑模观测器核心计算 void SMO_Calculate(void) { //反电动势计算 E_alpha V_alpha - R*I_alpha - L*(I_alpha - I_alpha_prev)/TS; E_beta V_beta - R*I_beta - L*(I_beta - I_beta_prev)/TS; //非线性反馈 Z_alpha (E_alpha 0) ? SMO_K : -SMO_K; Z_beta (E_beta 0) ? SMO_K : -SMO_K; //位置估算更新 EstAngle atan2f(-Z_beta, Z_alpha); }这里L参数偏差超过10%直接观测失败实测用万用表测线电阻的时候发现电机发热后参数漂移能到15%后来加了在线补偿才稳住。零速启动最坑的是初始位置检测我们用了高频注入龙伯格观测器混合方案。启动时先发三个不同方向的脉冲//初始位置检测脉冲序列 void Inject_PulseSequence(void) { PWM_Output(0.8, 0.0, 0.0); //A相正向 delay_us(200); PWM_Output(0.0, 0.8, 0.0); //B相正向 delay_us(200); PWM_Output(0.0, 0.0, 0.8); //C相正向 delay_us(200); }通过比较三次响应的电流幅值能判断转子大概卡在哪个扇区。实测带2Nm负载启动时初始推力要给到额定扭矩的150%才能破静摩擦。无感FOC 磁链观测器 零速带载闭环启动 堵转力矩保持 直接正反转 算法资料 卖资料不包括实物。 提供cubemx配置文件mdk项目源代码全c语言中文注释 提供调试笔记。堵转保持重点在电流环的抗饱和处理这个PID结构有点骚//抗饱和PID实现 float Current_PID(float target, float feedback) { static float integral 0; float error target - feedback; //积分分离 if(fabs(error) 2.0f) { integral * 0.5f; //进入饱和区时削弱积分 } else { integral error * Ki * CURRENT_LOOP_TIME; } return error * Kp integral - Kd*(feedback - last_feedback); }当误差超过2A时自动削积分防止烧MOS管。实测堵转时电机表面温度从25℃升到68℃只用了23秒必须加温度反馈降额。正反转切换有个坑爹的相位累积问题这里用了个相位解绕的小技巧//正反转无缝切换处理 void Angle_WrapProcess(float *angle) { while(*angle PI) *angle - 2*PI; while(*angle -PI) *angle 2*PI; if(direction REVERSE) { *angle PI; //直接反相 } }在代码里直接给估算角度加π比重新初始化观测器来得快。切换时q轴电流给定要渐变否则会产生5A以上的冲击电流。工程里实测波形显示带载启动到100rpm耗时380ms切换方向响应时间120ms。代码里藏着个彩蛋在motor.c第203行有个隐藏的贪吃蛇小游戏调参数时长按编码器就能唤醒——反正老板至今没发现这个后门。