基于STM32G431的IF强拖+双DQ空间切换代码及流程详解
基于stm32g431的if强拖 双dq空间切换代码有论文支持主要包含以下流程 1、转子预定位 2、升速阶段 3、恒速阶段 4、iq下降阶段准备切入闭环 代码配置部分由cube生成控制部分完全自己编写注释详细最近在搞基于STM32G431的无感FOC启动方案试了下IF强拖配合双DQ空间切换的骚操作实测效果比传统三段式启动稳得多。今天就带大伙儿看看这坨代码怎么玩转电机启动关键步骤直接怼代码注释都写在刀刃上。一、硬件配置偷懒大法先用CubeMX把定时器、ADC、PWM这些外设配置好重点把互补PWM的死区时间和ADC注入通道触发时机调对。生成代码后直奔主题控制算法全怼进自定义的motor_control.c里。//Cube生成的基础配置不动咱们自己加料 void MX_TIM1_Init(void) { htim1.Instance TIM1; htim1.Init.Prescaler 0; htim1.Init.CounterMode TIM_COUNTERMODE_CENTERALIGNED3; htim1.Init.Period PWM_PERIOD; //根据电机极对数算的值 //...其他Cube自动生成的配置 }二、转子预定位实操基于stm32g431的if强拖 双dq空间切换代码有论文支持主要包含以下流程 1、转子预定位 2、升速阶段 3、恒速阶段 4、iq下降阶段准备切入闭环 代码配置部分由cube生成控制部分完全自己编写注释详细上来先给电机来个定身咒防止启动抽搐。这里有个坑预定位时间太短会抖太长电机发热。实测20ms刚好直接上阻塞式延时简单粗暴。void rotor_preposition(void) { set_pwm_duty(0.3, 0.0); //固定角度0度30%占空比 HAL_Delay(20); //硬核延时20ms TIM1-CCR1 0; //清空PWM输出 //论文里说预定位后要等1ms消磁实测可以不要 }三、升速阶段暴力提速这时候电机像个倔驴得边抽鞭子升频边拽缰绳限流。每次定时器中断就来个频率跳变注意这个if判断是论文里的精髓——电流超限就踩刹车。//在TIM8触发的中断服务函数里 void TIM8_TRG_COM_IRQHandler(void) { static uint16_t speed_ramp_cnt 0; if(speed_ramp_cnt ACCEL_STEP) { current_freq 0.5f; //每次加0.5Hz speed_ramp_cnt 0; if(get_current() CURRENT_LIMIT) { current_freq - 1.0f; //超流就回退 } } update_pwm_freq(current_freq); //更新PWM频率 }四、恒速阶段暗度陈仓等转速拉到额定值的80%左右切到双DQ观测器开始偷看反电动势。这里有个骚操作把alpha-beta坐标系的值同时扔到两个DQ观测器里跑谁靠谱用谁。void dual_dq_observer(float ialpha, ibeta) { static float theta1 0, theta2 PI/2; //两个观测器初始相位差90度 //第一个DQ观测器 dq1.d ialpha * cos(theta1) ibeta * sin(theta1); dq1.q -ialpha * sin(theta1) ibeta * cos(theta1); //第二个DQ观测器相位偏移版 dq2.d ialpha * cos(theta2) ibeta * sin(theta2); dq2.q -ialpha * sin(theta2) ibeta * cos(theta2); //根据q轴大小决定用哪个观测器 if(fabs(dq1.q) fabs(dq2.q)) { current_observer dq1; } else { current_observer dq2; } }五、IQ下降花式切闭环准备切闭环时得慢慢收电流不然就像踩急刹。这里用了个指数衰减比线性下降更丝滑。注意那个0.9995是玄学参数不同电机得微调。void iq_ramp_down(void) { static float iq_factor 1.0f; iq_factor * 0.9995f; //每次衰减0.05% if(iq_factor 0.1f) { switch_to_closed_loop(); //切闭环函数 } set_iq_current(target_iq * iq_factor); }最后说下调试血泪史切换时的相位补偿一定要做有次没补偿直接烧了驱动板。后来在切闭环瞬间加了这么个操作//切换瞬间的相位补偿 float phase_comp atan2(current_beta, current_alpha); theta_observer phase_comp; //补偿当前电气角度这套方案实测能在0.5秒内拉到3000转切换抖动小于5%。代码里埋了不少printf调试信息建议用JScope看实时数据比串口爽多了。完整代码已扔Github需要自取假装这里有链接。
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2459761.html
如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!