Files
FDR-Core/Core/Inc/ladrc.h

69 lines
1.5 KiB
C
Raw Normal View History

2026-03-08 18:17:14 +08:00
#ifndef __LADRC_H
#define __LADRC_H
#include <stdint.h>
2026-03-28 13:48:31 +08:00
#include "motor.h"
2026-03-08 18:17:14 +08:00
typedef struct {
2026-03-28 13:48:31 +08:00
/* 外部命令与内部参考 */
float v_cmd; /* 上层下发的目标 RPM */
float v; /* 内部斜坡后的参考 RPM */
float y; /* 实际速度 RPM */
2026-03-08 18:17:14 +08:00
2026-03-28 13:48:31 +08:00
/* LESO 状态 */
float z1;
float z2;
2026-03-08 18:17:14 +08:00
2026-03-28 13:48:31 +08:00
/* 核心参数 */
float wc;
float wo;
float b0;
2026-03-08 18:17:14 +08:00
2026-03-28 13:48:31 +08:00
/* LESO 增益 */
float beta1;
float beta2;
2026-03-08 18:17:14 +08:00
2026-03-28 13:48:31 +08:00
/* 采样与限幅 */
float h;
float out_max;
/* 控制输出 */
float u;
/* Tustin 离散矩阵 */
float Ad11;
float Ad12;
float Ad21;
float Ad22;
float Bdu1;
float Bdu2;
float Bdy1;
float Bdy2;
/* Anti-windup: 作为 z2_dot 的额外输入,并离散到同一套 Tustin 模型 */
float kaw;
float eu_prev;
float Bdaw1;
float Bdaw2;
2026-03-08 18:17:14 +08:00
} LADRC_TypeDef;
void LADRC_Init(LADRC_TypeDef *ladrc, float wc, float wo, float b0, float h, float max);
float LADRC_Calc(LADRC_TypeDef *ladrc, float actual_val);
2026-03-14 17:17:17 +08:00
extern LADRC_TypeDef ladrc_motors[4];
2026-03-08 18:17:14 +08:00
void FourWheel_LADRC_Init(void);
void FourWheel_Set_Target_RPM(float fl_rpm, float rl_rpm, float fr_rpm, float rr_rpm);
2026-03-18 22:03:16 +08:00
void FourWheel_LADRC_ResetAll(void);
2026-03-08 18:17:14 +08:00
void FourWheel_LADRC_Control_Loop(void);
2026-03-28 13:48:31 +08:00
/* 命令目标与内部参考分开暴露,便于调试 */
float FourWheel_Get_Target_RPM(Motor_ID_t id); /* 返回 v_cmd */
float FourWheel_Get_Ref_RPM(Motor_ID_t id); /* 返回 v */
2026-03-14 17:17:17 +08:00
float FourWheel_Get_Control_Output(Motor_ID_t id);
2026-03-28 13:48:31 +08:00
#endif /* __LADRC_H */