当前位置:首页 > 工业控制 > 工业控制
[导读]关节电机不是“给个目标角度让电机转过去”就完事。机器人臂对轨迹跟踪的要求是:到位准、换向不抖、负载变也不飘。工业做法都是三环级联——电流环(内)→速度环(中)→位置环(外),位置环只决定“去哪”,速度环管“跑多稳”,电流环管“出多大劲”。 协同的核心不在单环增益高,而在外环别拖垮内环、前馈把大部分误差提前消掉。


关节电机不是“给个目标角度让电机转过去”就完事。机器人臂对轨迹跟踪的要求是:到位准、换向不抖、负载变也不飘。工业做法都是三环级联——电流环(内)→速度环(中)→位置环(外),位置环只决定“去哪”,速度环管“跑多稳”,电流环管“出多大劲”。 协同的核心不在单环增益高,而在外环别拖垮内环、前馈把大部分误差提前消掉。

一、三环分工与周期层级

典型周期配置:

电流环:10~20kHz(50~100μs),FOC算Iq/Id

速度环:1~3kHz,PI输出Iq指令

位置环:500Hz~1kHz,纯P或PD输出速度指令

内环带宽必须高于外环,否则外环一变内环还没跟上,系统直接振荡。 调试顺序固定“先电流→再速度→最后位置”,反过来必震。

二、反馈来源:关节端+电机端

单编码器方案容易栽在减速器回差上:

位置环反馈 → 关节端绝对编码器(末端实际角度)

速度环反馈 → 电机端编码器差分转速,或关节角度微分

高端方案双编码器:位置精度靠关节端,动态阻尼靠电机端

绝对编码器上电免回零,多圈靠磁编SSI/SPI或电池备ABZ计数。

三、位置环:纯P+前馈,别加I

位置环加积分是常见误区——到位后会过冲来回摆。工程做法:

typedef struct {

   float kp;          // 位置比例

   float kff_v;       // 速度前馈系数

   float v_max;       // 输出速度限幅

   float pos_fb;

} pos_loop_t;


float pos_loop_step(pos_loop_t*p, float pos_ref, float vel_ref){

   float e = pos_ref - p->pos_fb;

   float v_cmd = p->kp * e + p->kff_v * vel_ref;   // P+前馈

   if(v_cmd >  p->v_max) v_cmd =  p->v_max;

   if(v_cmd < -p->v_max) v_cmd = -p->v_max;

   return v_cmd;       // 交给速度环

}

vel_ref不是自己差分出来的,是轨迹规划器直接给的——多项式/S曲线规划同时出位置、速度、加速度,事后差分必带噪。

四、速度环:PI+抗饱和

速度环输出Iq指令进FOC电流环:

typedef struct {

   float kp, ki;

   float integ;

   float iq_max;

   float v_fb;

} vel_loop_t;


float vel_loop_step(vel_loop_t*v, float v_cmd, float v_fb){

   float e = v_cmd - v_fb;

   v->integ += e;

   /* 抗饱和:限幅前先钳积分 */

   float iq = v->kp*e + v->ki*v->integ;

   if(iq > v->iq_max){

       iq = v->iq_max;

       v->integ -= e;        // 回退本次积分

   }else if(iq < -v->iq_max){

       iq = -v->iq_max;

       v->integ -= e;

   }

   return iq;

}

抗饱和必须做,否则位置环给个大额速度指令、速度环饱和几秒,积分项堆满,退出饱和时电机猛冲一下。

五、主调度:三层周期解耦

void motor_1ms_task(void){          // 位置环

   float pos = joint_abs_pos();

   float vref = traj_vel();

   float vcmd = pos_loop_step(&pl, traj_pos(), vref);

   set_vel_cmd(vcmd);

}


void motor_250us_isr(void){         // 速度环

   float vfb = enc_motor_speed();

   float iq_ref = vel_loop_step(&vl, get_vel_cmd(), vfb);

   set_iq_ref(iq_ref);

}


void foc_current_isr(void){         // 电流环

   foc_step();        // Clark/Park -> PI -> SVPWM

}

位置环写映像变量vel_cmd,速度环读;速度环写iq_ref,电流环读。中断层级别解耦,别在位置环里直接算Iq。

六、前馈进阶:加速度/重力补偿

垂直关节要扛重力,纯反馈P会留稳态误差。加速度前馈叠加:

iq_ff = Kt * (J*acc_ref + T_grav(theta) + T_fric(vfb));

iq_cmd = vel_loop_step(...) + iq_ff;

重力项按关节角查表,摩擦项库仑+粘滞。前馈走并联加法、最后一起限幅,别单独限幅前馈。

七、换向回差处理

减速器有背隙时,位置环用关节反馈会在过零点看到误差跳变。做法:

位置环反馈用关节端(保证终点准)

速度环反馈用电机端(保证阻尼稳)

前馈承担主要跟踪,反馈P不用调太高

回差大就换零背隙谐波/RV,别全靠增益硬压

八、安全兜底

软件限位角+硬件限位开关双重

垂直轴断电抱闸,使能前先松闸

位置误差超阈值→触发急停零力矩

编码器失效/CRC错→切安全态

速度指令做加速度限幅,别一步给满

过流FAULT进中断,立刻清Iq输出

九、落坑清单

位置环加I→定位过冲摆动

先调位置环再调电流环→低频振荡

速度反馈靠位置硬差分→噪声放大

前馈单独限幅→补偿被砍歪

抗饱和不做→退出饱和猛冲

单编码器走电机反馈→回差消不掉

vel_ref自己差分→轨迹抖

外环周期等于内环→带宽打架失稳

垂直轴不加重力前馈→稳态下垂

抱闸时序错→上电掉臂

十、落地顺序

FOC电流环先跑稳,Iq阶跃几百微秒跟住

速度环禁位置环,阶跃速度调PI+抗饱和

位置环纯P,Kp从小加,观察超调

轨迹规划器输出pos/vel/acc三段

速度前馈接上,Kp可适当收小

垂直轴加重力/摩擦前馈

关节端位置+电机端速度双反馈

限位/抱闸/FAULT兜底

关节电机高精度定位的本质是“外环下指令、内环快执行、前馈扛大头”。位置环别碰积分,速度环必做抗饱和,前馈从轨迹规划拿而不是差分出来,反馈源按“位置看关节、速度看电机”分开——这四件事做对,协作臂重复定位到±0.05mm级是水到渠成的事。剩下就是机械回差和编码器分辨率,那是硬件底线,软件增益救不回来。



本站声明: 本文章由作者或相关机构授权发布,目的在于传递更多信息,并不代表本站赞同其观点,本站亦不保证或承诺内容真实性等。需要转载请联系该专栏作者,如若文章内容侵犯您的权益,请及时联系本站删除( 邮箱:macysun@21ic.com )。
关闭