(V/F 恒定)代码
一、V/F 恒定控制核心原理V/F 恒定控制的核心是定子电压幅值与电频率转速成正比同时为了补偿低转速时定子电阻的压降避免转矩不足和抖动需增加IR 补偿低转速段叠加固定补偿电压。公式如下plaintext1. 机械转速 → 电频率f_e (n_mech × P) / 60 P为电机极对数n_mech为机械转速单位rpm 2. 基础电压幅值V_base K × f_e K为V/F比例系数K V_rated / f_e_rated 3. 带IR补偿的电压幅值V_amp V_base V_ir V_ir为IR补偿电压低转速有效高转速可衰减代码采用固定点运算如 Q15 格式缩放因子Q15_SCALE32768适配单片机Cortex-M3/M4的实时性要求同时融入转速斜坡、电压 / 电流限流避免启动噪音。二、V/F 恒定控制完整代码C 语言c运行/****************************************** * 适配场景FOC开环启动阶段的V/F恒定控制 * 核心转速斜坡平滑上升 V/F正比 IR补偿 限流保护 * 固定点运算Q15格式缩放因子32768即2^15 ******************************************/ #include stdint.h #include math.h /************************* 宏定义需根据电机参数适配 *************************/ // 电机参数 #define MOTOR_POLE_PAIR 4 // 电机极对数如4对极 #define MOTOR_RATED_RPM 3000 // 电机额定机械转速rpm #define MOTOR_RATED_VOLT 24 // 电机额定母线电压V如24V #define MOTOR_STATOR_R 0.5f // 定子电阻Ω需实测 #define MOTOR_RATED_IQ 5.0f // 额定q轴电流A转矩电流 // V/F控制参数 #define Q15_SCALE 32768U // Q15固定点缩放因子2^15 #define VF_SCALE (MOTOR_RATED_VOLT * Q15_SCALE) / ((MOTOR_RATED_RPM * MOTOR_POLE_PAIR) / 60) // V/F比例系数Q15 #define IR_COMP_VOLT (MOTOR_STATOR_R * MOTOR_RATED_IQ) // IR补偿电压V低转速补偿 #define IR_COMP_VOLT_Q15 (IR_COMP_VOLT * Q15_SCALE) / MOTOR_RATED_VOLT // IR补偿电压归一化到Q15 #define IR_COMP_MAX_RPM 500 // IR补偿截止转速rpm超过则逐步衰减 // 转速斜坡参数 #define RAMP_RPM_PER_MS 5 // 转速上升斜率rpm/ms如每毫秒升5rpm可调整避免噪音 #define OPEN_LOOP_MAX_RPM 800 // 开环最大转速rpm高于此值切换闭环 // 限流/限压参数 #define MAX_VOLT_AMP_Q15 20433U // SVM线性区最大幅值Q15对应2/√3≈0.9428避免过调制 #define MAX_IQ_Q15 (1.0f * Q15_SCALE) // q轴电流上限Q151.0倍额定 /************************* 全局变量开环控制专用 *************************/ // 转速相关 uint16_t TargetOpenLoopRpm 0; // 开环目标转速rpm uint16_t CurrentOpenLoopRpm 0; // 当前开环机械转速rpm斜坡上升 uint32_t CurrentElecFreq 0; // 当前电频率Hzf_e n_mech*P/60 // 电压矢量相关Q15格式用于SVM调制 typedef struct { uint16_t Amp; // 电压幅值Q15 uint16_t Angle;// 电压角度0~65535对应0~360°电角度 } VECTOR_T; VECTOR_T OpenLoopVoltVector {0, 0}; // 电流反馈实际需从ADC采样并转换为Q15 int16_t CurrentIqQ15 0; // q轴电流Q15 /************************* 核心函数 *************************/ /** * brief 转速斜坡生成避免阶跃减少启动噪音 * param target_rpm: 目标开环转速rpm * retval 当前平滑后的转速rpm */ static uint16_t OpenLoopRpmRamp(uint16_t target_rpm) { // 限制目标转速不超过开环最大值 if (target_rpm OPEN_LOOP_MAX_RPM) { target_rpm OPEN_LOOP_MAX_RPM; } // 转速斜坡上升/下降此处仅处理启动上升可扩展下降逻辑 if (CurrentOpenLoopRpm target_rpm) { CurrentOpenLoopRpm RAMP_RPM_PER_MS; // 按斜率上升 if (CurrentOpenLoopRpm target_rpm) { CurrentOpenLoopRpm target_rpm; } } else { // 如需减速可添加缓慢下降逻辑如RAMP_RPM_PER_MS/2 CurrentOpenLoopRpm target_rpm; } return CurrentOpenLoopRpm; } /** * brief 计算IR补偿电压低转速补偿高转速衰减 * param rpm: 当前机械转速rpm * retval IR补偿电压Q15格式 */ static uint16_t CalcIRCompVolt(uint16_t rpm) { uint16_t ir_comp 0; if (rpm IR_COMP_MAX_RPM) { ir_comp IR_COMP_VOLT_Q15; // 低转速全补偿 } else if (rpm OPEN_LOOP_MAX_RPM) { // 超过补偿转速后线性衰减避免突变 ir_comp IR_COMP_VOLT_Q15 * (OPEN_LOOP_MAX_RPM - rpm) / (OPEN_LOOP_MAX_RPM - IR_COMP_MAX_RPM); } else { ir_comp 0; // 高转速无补偿 } return ir_comp; } /** * brief V/F恒定控制核心计算生成开环电压矢量 * param target_rpm: 目标开环转速rpm * retval 电压矢量幅值角度用于SVM调制 */ VECTOR_T FocOpenLoopVFControl(uint16_t target_rpm) { VECTOR_T volt_vector {0, 0}; uint16_t current_rpm 0; uint32_t volt_base_q15 0; uint32_t volt_amp_q15 0; uint16_t ir_comp_q15 0; // 步骤1转速斜坡平滑核心避免转速阶跃减少噪音 current_rpm OpenLoopRpmRamp(target_rpm); // 步骤2计算电频率f_e 机械转速 × 极对数 / 60 CurrentElecFreq (current_rpm * MOTOR_POLE_PAIR) / 60; // 步骤3计算V/F基础电压幅值V_base K × f_eQ15 volt_base_q15 (uint64_t)VF_SCALE * CurrentElecFreq / Q15_SCALE; // 固定点乘法后还原缩放 // 步骤4计算IR补偿电压低转速补偿定子电阻压降 ir_comp_q15 CalcIRCompVolt(current_rpm); // 步骤5总电压幅值基础电压 IR补偿 volt_amp_q15 volt_base_q15 ir_comp_q15; // 步骤6电压幅值限流避免过调制核心减少电流纹波和噪音 if (volt_amp_q15 MAX_VOLT_AMP_Q15) { volt_amp_q15 MAX_VOLT_AMP_Q15; } // 步骤7电流限流反馈若q轴电流超过上限降低电压幅值避免电流冲击 if (CurrentIqQ15 MAX_IQ_Q15) { // 按电流超限比例降低电压可调整比例系数 volt_amp_q15 volt_amp_q15 * MAX_IQ_Q15 / CurrentIqQ15; } // 步骤8计算电压矢量角度开环控制角度随电频率累加模拟转子旋转 // 角度累加每次调用增加电频率 × 采样周期 × 65536 / 100065536对应360° // 注采样周期需与控制周期一致如1ms此处假设控制周期为1ms static uint16_t volt_angle 0; uint16_t angle_step (CurrentElecFreq * 65536U) / 1000; // 1ms内的角度增量Hz→角度/ms volt_angle angle_step; // 角度累加0~65535循环 // 赋值电压矢量幅值角度 volt_vector.Amp volt_amp_q15; volt_vector.Angle volt_angle; return volt_vector; } /************************* 主循环调用示例 *************************/ void MotorControlMainLoop(void) { // 假设目标开环转速设为800rpm可由外部指令设置 TargetOpenLoopRpm 800; // 执行V/F控制生成电压矢量 OpenLoopVoltVector FocOpenLoopVFControl(TargetOpenLoopRpm); // 将电压矢量传入SVM调制模块后续衔接SVM代码输出PWM // Sector MotorControlSvm(OpenLoopVoltVector); }三、代码关键要点说明1. 固定点运算Q15单片机中浮点运算耗时因此采用Q15 固定点格式将小数放大 32768 倍用整数运算代替浮点例如电压幅值1.0对应额定电压在 Q15 中表示为32768SVM 线性区最大值20433对应2/√3≈0.9428避免过调制。2. 转速斜坡核心降噪措施通过OpenLoopRpmRamp函数让转速从 0线性上升如 5rpm/ms避免直接设置目标转速导致的电流冲击和转矩脉动从根源减少启动噪音。3. IR 补偿低转速时电机定子电阻的压降占比大导致实际气隙磁通不足转矩脉动加剧。通过CalcIRCompVolt函数在低转速段叠加固定的 IR 补偿电压高转速段线性衰减保证全转速段磁通恒定。4. 限流 / 限压保护电压限流限制电压幅值不超过 SVM 线性区最大值20433避免过调制导致的电流纹波增大电流限流若 q 轴电流超过上限按比例降低电压幅值防止大电流引发的电磁噪音。5. 电压矢量角度生成开环控制中电压矢量的角度随电频率累加模拟转子旋转角度增量与控制周期、电频率成正比保证定子磁场匀速旋转。四、代码适配与调试建议电机参数校准MOTOR_STATOR_R定子电阻、MOTOR_POLE_PAIR极对数需实测否则 V/F 比例和 IR 补偿会失真转速斜坡调整RAMP_RPM_PER_MS可根据电机惯量调整大惯量电机设为 2~5rpm/ms小惯量设为 5~10rpm/msIR 补偿调试若低转速时电机抖动可适当增大IR_COMP_VOLT若高转速时噪音大可减小IR_COMP_MAX_RPM衔接 SVM 模块代码中OpenLoopVoltVector可直接传入之前的 SVM 调制函数MotorControlSvm输出 PWM 驱动电机。五、与 FOC 闭环的切换当CurrentOpenLoopRpm达到OPEN_LOOP_MAX_RPM如 800rpm时需切换到 FOC 闭环控制切换时建议采用权重过渡开环电压矢量的权重从 1 逐渐降到 0闭环电压矢量的权重从 0 逐渐升到 1过渡时间设为 50~100ms避免切换冲击导致的噪音。
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2431410.html
如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!