位置环(九)

📅 2026/7/12 19:11:18
位置环(九)
第 9 篇位置环——精确控制电机角度速度环让电机稳定转起来了。再加一个最外环——位置环就能实现精确的角度定位。这在机械臂、云台、伺服系统里是刚需。1. 三环级联结构θ_ref ──→ [P_位置] ──→ ω_ref ──→ [PI_速度] ──→ iq_ref ──→ [PI_电流] ──→ 电机 ↑ ↑ │ └── θ_fb ←── 霍尔 ────┘ │ └── ω_fb ←── 速度计算 ←─────────────────────────────┘位置环输出是速度指令速度环输出是电流指令——每一层只关心自己那一层的事。2. 位置环只用 P 就够了typedefstruct{floatkp;// 位置环比例系数floatangle_ref;// 目标机械角度 (rad)floatangle_fb;// 当前机械角度floatspeed_ref;// 输出给速度环的指令floatspeed_max;// 最大速度限制}position_loop_t;voidposition_loop_update(position_loop_t*pl){pl-angle_fbhall.theta_elec/MOTOR_POLE_PAIRS;// 电角度转机械角度// 角度误差处理 0~2π 的跳变floaterrorpl-angle_ref-pl-angle_fb;if(errorM_PI)error-2.0f*M_PI;if(error-M_PI)error2.0f*M_PI;// P 控制角度误差 → 速度指令pl-speed_refpl-kp*error;// 限速if(pl-speed_refpl-speed_max)pl-speed_refpl-speed_max;if(pl-speed_ref-pl-speed_max)pl-speed_ref-pl-speed_max;}为什么只用 P位置环不需要积分——角度误差本身就是积分量位置 ∫速度。加 I 反而容易过冲振荡。3. 梯形速度曲线规划直接给定一个阶跃目标角度会让位置环输出很大的速度指令导致电机猛冲然后过冲。更好的做法是规划一条平滑的轨迹。typedefstruct{floatcurrent_pos;floattarget_pos;floatmax_speed;floataccel;floatcurrent_speed;}trajectory_planner_t;floattrajectory_update(trajectory_planner_t*tp,floatdt){floatdistancetp-target_pos-tp-current_pos;floatdir(distance0)?1.0f:-1.0f;// 计算减速距离v² / (2a)floatdecel_dist(tp-current_speed*tp-current_speed)/(2.0f*tp-accel);if(fabsf(distance)decel_dist){// 减速阶段tp-current_speed-tp-accel*dt*dir;if(fabsf(tp-current_speed)0.1f)tp-current_speed0;}elseif(fabsf(tp-current_speed)tp-max_speed){// 加速阶段tp-current_speedtp-accel*dt*dir;}tp-current_postp-current_speed*dt;returntp-current_pos;}使用梯形速度规划后位置响应不再过冲电机运行平稳很多。4. 定位精度测试// 测试从 0° 定位到 90°重复 10 次统计误差for(inti0;i10;i){position_loop.angle_ref1.5708f;// 90°delay_ms(500);// 等待定位完成floaterrorfabsf(position_loop.angle_ref-hall.theta_elec/MOTOR_POLE_PAIRS);printf(定位误差: %.3f rad (%.1f°)\n,error,error*57.3f);}使用霍尔传感器 良好调参定位精度可达到 ±2° 以内霍尔方案的本征分辨率约 60°/极对数。5. 小结三环级联位置 → 速度 → 电流位置环只用 P 控制不需要 I梯形速度规划显著减少过冲定位精度取决于霍尔安装精度 机械间隙如需更高精度可考虑无感观测器辅助下一篇开环启动与闭环切入——电机平稳起步的秘诀下一篇开环启动与闭环切入——电机平稳起步的秘诀