电流环控制,并实现简单的补偿控制,还差参数具体化。

This commit is contained in:
lyf
2026-10-16 00:54:52 +08:00
parent 67eea77789
commit 370d4519b5
20 changed files with 477 additions and 163 deletions
+20 -8
View File
@@ -4,13 +4,13 @@
/* 云台双轴控制(串级 PID)
* Yaw (2026-09 重写):双环都以陀螺仪为反馈——
* 位置环:QEKF 多圈 yaw(°) -> 目标角速度(°/s)
* 速度环:陀螺 z 轴角速度(°/s) -> GM6020 电压
* 速度环:陀螺 z 轴角速度(°/s) -> GM6020 电流
* 装配符号由上电自检自动测定(gimbal_detect_yaw_sign),
* 两环共用同一符号,不可能再出现"两传感器符号打架"
* Pitch:位置环用 QEKF 的 Roll(安装方向所致,勿改),速度环转子转速
* 电机: Yaw=GM6020 CAN2 0x205(电压,0x1FF CAN2 槽1)
* Pitch=GM6020 CAN1 0x206(电压,与拨弹共帧 0x1FF CAN1 槽2/3,legacy 方案)
* 摩擦轮 M3508 0x201/0x202 与拨弹 M2006 0x207 的实例也在此初始化 */
* 电机: Yaw=GM6020 CAN2 0x205(电流,0x1FE CAN2 槽1)
* Pitch=GM6020 CAN1 0x206(电流,0x1FE CAN1 槽2)
* 摩擦轮 M3508 0x201/0x202(CAN1) 与拨弹 M2006 0x201(CAN2) 的实例也在此初始化 */
#include "dji_motor.h"
@@ -19,12 +19,15 @@ extern dji_motor_t motor_yaw_gimbal; // Yaw GM6020,CAN2 0x205
extern dji_motor_t motor_pitch_gimbal; // Pitch GM6020,CAN1 0x206
extern dji_motor_t motor_friction_l; // 左摩擦轮 M3508,CAN1 0x201
extern dji_motor_t motor_friction_r; // 右摩擦轮 M3508,CAN1 0x202
extern dji_motor_t motor_rammer; // 拨弹 M2006,CAN1 0x207
extern dji_motor_t motor_rammer; // 拨弹 M2006,CAN2 0x201
extern float pitch_pid; // Pitch PID 输出分量(仅速度环反馈计算)
extern float pitch_g; // Pitch 重力拟合前馈分量
extern float pitch_current; // Pitch GM6020 最终电流控制输出(pitch_pid + pitch_g, ±16384)
/* 初始化电机实例与 PID(can_start 之后调用) */
extern void gimbal_motor_init(void);
/* Yaw 装配符号自检:给 Yaw 电机正向小电压脉冲,按陀螺 z 轴响应方向
/* Yaw 装配符号自检:给 Yaw 电机正向小电流脉冲,按陀螺 z 轴响应方向
* 测定符号。阻塞约 200ms(HAL_Delay),检测期间云台会轻转几度。
* 返回 1-成功(gimbal_yaw_sign() 可用) 0-失败(被按住/电机离线/无响应) */
extern uint8_t gimbal_detect_yaw_sign(void);
@@ -36,13 +39,22 @@ extern float gimbal_yaw_sign(void);
* 0=尚未自检。随 0x1A9 flags bit1 下发,供底盘跟随符号自动综合 */
extern int8_t gimbal_encoder_ccw(void);
/* 云台轴控制:根据 cmd 增量更新目标角并计算电压输出(2ms 调用)
* 内部发送 CAN2 0x1FF(Yaw)与 CAN1 0x1FF(Pitch+拨弹) */
/* 云台轴控制:根据 cmd 增量更新目标角并计算电流输出(2ms 调用)
* 内部发送 CAN2 0x1FE(Yaw)与 CAN1 0x1FE(Pitch) */
extern void gimbal_control(float yaw_delta, float pitch_delta, uint8_t reset_flag);
/* 云台任一电机掉线返回 1 */
extern uint8_t gimbal_motor_offline(void);
/* ===== 2026-10-15 台架调参临时接口(已停用,保留备查) =====
* 启用时把 #if 0 改 #if 1,并同步启用 gimbal.c / gimbal_task.c / robot_param.h
* / debug_task.c 里的同名停用块 */
#if 0
extern float gimbal_bench_pitch_offset; // 位置环设定值附加偏置(°),台架方波发生器写入
extern float gimbal_pitch_setpoint_deg(void); // 位置环实际设定值(°),供调参遥测读取
extern float gimbal_pitch_speed_ref(void); // 位置环输出=速度环目标(°/s),判断内环是否限幅
#endif
/* 云台输出清零(停车) */
extern void gimbal_output_zero(void);