MIT关节电机相序校准
UVW三相相序判断
电机相序校正是确保多关节控制系统正常运行的重要步骤。在实际应用中,每个电机定子的三相线(W、U、V)的连接顺序可能存在差异,这是由于制造过程中的随机接线所致。不过,通过简单的校正方法,可以确保系统的正常运行。
测试步骤
给电机q轴施加正向电流指令,观察编码器反馈值的变化趋势:
当编码器值呈现单调递增时,表明相序连接正确
当编码器值呈现单调递减时,表明相序需要调整
void order_phases(EncoderStruct *encoder, ControllerStruct *controller, CalStruct * cal, int loop_count){
/* 相序校验函数:确保Q轴正电流产生与位置传感器正方向一致的转矩
* 参数:
* encoder - 编码器数据结构体指针
* controller - 控制器参数结构体指针
* cal - 校准参数结构体指针
* loop_count - 当前循环计数 */
PHASE_ORDER = 0; // 初始化相位顺序标志
if(!cal->started){
/* 校准初始化阶段 */
printf("Checking phase sign, pole pairs\r\n"); // 打印调试信息
cal->started = 1; // 设置校准启动标志
cal->start_count = loop_count; // 记录起始循环计数
}
cal->time = (float)(loop_count - cal->start_count)*DT; // 计算当前校准时间(基于时间步长DT)
if(cal->time < T1){ // 第一阶段:电压角度置零等待转子稳定
// 设置电压角度为0(电角度对齐阶段)
cal->theta_ref = 0; // 参考角度置零(原始代码注释被修改)
cal->cal_position.elec_angle = cal->theta_ref; // 写入电气角度
cal->cal_position.elec_velocity = 0; // 电气速度置零
// 设置直轴电流给定值,q轴电流置零(磁链对齐)
controller->i_d_des = I_CAL; // 注入预设校准电流(直轴)
controller->i_q_des = 0.0f; // q轴电流保持零(避免产生转矩)
commutate(controller, &cal->cal_position); // 执行换相操作
cal->theta_start = encoder->angle_multiturn[0]; // 记录初始机械角度
return; // 退出当前循环
}
针对第一个阶段,T1的值=1,也就是在1s内实现转子和定子磁场对齐;
else if(cal->time < T1+2.0f*PI_F/W_CAL){ // 第二阶段:电压矢量旋转
/* 旋转电压矢量完成一个完整电气周期(2π)*/
cal->theta_ref = W_CAL*(cal->time-T1); // 计算动态参考角度(按预设角速度旋转)
cal->cal_position.elec_angle = cal->theta_ref; // 更新电气角度
commutate(controller, &cal->cal_position); // 执行换相
return; // 保持当前状态直到完成旋转
}
第二个阶段用到了W_CAL,这个值是角速度,10rad/s,也就是过了1秒以后,旋转2PI电弧度,
2.0f*PI_F/W_CAL代表经过的周期次数,
此部分没有这两个值,延续上面的值
-
controller->i_d_des = I_CAL
-
controller->i_q_des = 0.0f
通过固定i_q_des=0
,避免电机产生转矩,同时通过i_d_des=I_CAL
注入直轴电流以稳定磁场,确保电压矢量旋转时电机仅响应相位变化,从而通过编码器反馈判断相序方向
通常情况下,给一个较大的电压到d轴上,缓慢的让角度递增,转子会在磁场力的作用下,随着旋转矢量的方向缓慢转动。此时,判断编码器的值是递增还是递减,如果递增,则一切正常。如果是递减,则在程序里,调换V相和W相的输出。
/* 第三阶段:校验结果处理 */
reset_foc(controller); // 重置磁场定向控制器参数
// 计算最终机械角度差
float theta_end = encoder->angle_multiturn[0]; // 获取结束时刻机械角度
cal->ppairs = round(2.0f*PI_F/fabsf(theta_end-cal->theta_start)); // 计算极对数(机械角度→电气角度转换)
2PI除以弧度差
// 判断相位顺序方向
if(cal->theta_start < theta_end){
cal->phase_order = 0; // 相位顺序正确
printf("Phase order correct\r\n");
}
else{
cal->phase_order = 1; // 需要交换相位顺序
printf("Swapping phase sign\r\n");
}
// 输出校准结果
printf("Pole Pairs: %d\r\n", cal->ppairs);
printf("Start: %.3f End: %.3f\r\n", cal->theta_start, theta_end);
// 写入全局参数
PHASE_ORDER = cal->phase_order; // 更新系统相位顺序标志
PPAIRS = (float)cal->ppairs; // 更新系统极对数参数
// 重置校准状态
cal->started = 0; // 清除启动标志
cal->done_ordering = 1; // 设置校准完成标志
}
关键注释说明:
- 阶段划分:通过时间条件划分三个校准阶段(对齐→旋转→校验),符合电机控制系统的典型校准流程
7
- 电流控制:保持q轴电流为零避免转矩干扰,通过直轴电流对齐转子位置
8
- 角度计算:
cal->ppairs
的计算公式实现了机械角度到电气角度的转换(2π对应一个电气周期) - 安全措施:使用
fabsf()
保证角度差绝对值计算,round()
确保极对数取整正确3
- 调试输出:包含完整的调试信息打印,符合嵌入式调试规范
建议结合系统文档补充以下宏定义的说明:
I_CAL
(校准电流值)=0.125
W_CAL
(校准角速度)=10rad/s
T1
(对齐阶段持续时间)=1S
等参数的具体数值和物理意义