简单理解:ABZ编码器校准方法,只给 q 轴加电压,目的是产生恒定转矩把转子拖拽锁定到 0 电角度位置

📅 2026/6/29 19:48:36
简单理解:ABZ编码器校准方法,只给 q 轴加电压,目的是产生恒定转矩把转子拖拽锁定到 0 电角度位置
/** * brief ABZ编码器校准 * * param foc_motor 电机FOC控制结构体指针包含编码器、VF开环、PWM等所有电机参数 */ bool Motor_ABZ_ENC_CALIB(FOC_MOTOR_t *foc_motor) // ABZ编码器零点校准函数返回bool表示校准是否完成 { bool ret false; // 定义返回值默认false校准未完成 static uint32_t align_count 0; // 静态局部变量只在第一次调用初始化用来统计对齐保持的时钟计数次数 qd_t Out {0, 1.0f}; // 定义dq电压输出结构体d轴电压0q轴电压1.0V施加恒定q轴电压用来把电机转子吸到固定角度 float ElAngle 0.0f; // 临时变量存储当前使用的电角度 foc_motor-abz_enc.speed.PhaseShift 0; // 先把编码器相位偏移零点偏移临时清零校准阶段先不做角度补偿 FOC_ABZENC_Angle_Calc(foc_motor-abz_enc); // 读取ABZ编码器原始机械角度换算出未补偿的电角度 if(foc_motor-abz_enc.align){ // 判断当前是否处于编码器对齐模式校准模式标志位 ElAngle 0; // 强制把电压矢量电角度设为0°往d轴0度方向施加电压固定吸住转子 align_count; // 对齐次数计数器1记录保持对齐的时长 }else{ FOC_VF_Angle_Calc(foc_motor-vf); // 非校准模式运行VF开环角度估算算法 ElAngle foc_motor-vf.speed.ElAngle; // 角度使用VF开环估算出来的电角度 } FOC_PWM_Run(foc_motor-pwm, Out, ElAngle); // 根据设定的dq电压当前电角度执行SVPWM输出三相电压把电机转子锁在指定位置 if(align_count100000){ // 当转子被稳定锁定100000次周期后认为转子已经完全静止对齐到电气零点 ret true; // 校准标志置true代表校准完成 // 核心计算编码器零点偏移 - 当前编码器读到的电角度 // 作用后续正常运行时原始编码器角度加上这个偏移就能把电气零点修正到真实d轴位置 foc_motor-abz_enc.speed.PhaseShift -foc_motor-abz_enc.speed.ElAngle; printf(编码器偏移值: %f\r\n, foc_motor-abz_enc.speed.PhaseShift); // 串口打印算出的相位偏移值方便保存参数 } return ret; // 返回校准状态true校准完成false校准中 }一、整体校准原理通俗总结强制锁转子往电机 d 轴 0° 方向施加固定电压把电机转子牢牢吸到电气零角度位置稳定等待持续锁转子 100000 个运行周期保证转子完全静止、不抖动读原始角度算偏移此时编码器读到的电角度就是编码器机械零点和电机电气 d 轴零点的偏差保存相位偏移 PhaseShift后续正常 FOC 运行时每次读取编码器原始角度都加上这个偏移值就能修正角度零点误差避免电机启动抖动、出力异常。二、关键变量说明PhaseShift编码器相位零点偏移量是本次校准的最终结果static align_count静态变量不会每次函数调用清零用来累计锁轴时长防止转子没稳定就读角度导致校准不准qd_t Out{0,1.0f}只给 q 轴加电压目的是产生恒定转矩把转子拖拽锁定到 0 电角度位置。