- 云台(ROBOT_TYPE_GIMBAL)与底盘(ROBOT_TYPE_CHASSIS)完整固件源码 - 新增根级 .gitignore,排除 Keil MDK-ARM 构建产物(.o/.d/.crf/.axf/.lnp/.map/.htm/.sct/.dep/.iex/.lst 等) 与 *.uvguix.* / DebugConfig/(与机器绑定的 UI 布局) - core.autocrlf=false,避免固件源码在检出时被改动换行符
67 lines
2.2 KiB
C
67 lines
2.2 KiB
C
#ifndef PID_H
|
|
#define PID_H
|
|
|
|
/* 位置式/增量式 PID,自 legacy 工程 Control/PID 原样移植 */
|
|
|
|
typedef struct
|
|
{
|
|
float Need_Value; // 预期值
|
|
float Now_Value; // 当前值
|
|
|
|
float Ek; // 本次误差
|
|
float Ek_1; // 上一次误差
|
|
float Sum_Ek; // 误差积分
|
|
float Del_Ek; // 误差差分
|
|
float Ek_low; // 误差为0阈值下限
|
|
float Ek_up; // 误差为0阈值上限
|
|
|
|
float Kp; // Kp
|
|
float Ki; // Ki
|
|
float Kd; // Kd
|
|
|
|
float P_OUT; // 比例输出
|
|
float I_OUT; // 积分输出
|
|
float D_OUT; // 微分输出
|
|
float OUT; // 总输出
|
|
float OUT_low; // 输出限幅下限
|
|
float OUT_up; // 输出限幅上限
|
|
} PID_PositionTypeDef; // 位置式PID参数结构体
|
|
|
|
typedef struct
|
|
{
|
|
float Need_Value; // 预期值
|
|
float Now_Value; // 当前值
|
|
|
|
float Ek; // 本次误差
|
|
float Ek_1; // 上一次误差
|
|
float Ek_2; // 上两次误差
|
|
float Ek_low; // 误差为0阈值下限
|
|
float Ek_up; // 误差为0阈值上限
|
|
|
|
float Kp; // Kp
|
|
float Ki; // Ki
|
|
float Kd; // Kd
|
|
|
|
float P_OUT; // 比例输出
|
|
float I_OUT; // 积分输出
|
|
float D_OUT; // 微分输出
|
|
float OUT; // 总输出
|
|
float OUT_low; // 输出限幅下限
|
|
float OUT_up; // 输出限幅上限
|
|
} PID_IncrementalTypeDef; // 增量式PID参数结构体
|
|
|
|
void PID_PositionStructureInit(PID_PositionTypeDef * pid, float need_value);
|
|
void PID_PositionSetParameter(PID_PositionTypeDef * pid, float kp, float ki, float kd);
|
|
void PID_PositionSetEkRange(PID_PositionTypeDef * pid, float ek_low, float ek_up);
|
|
void PID_PositionSetOUTRange(PID_PositionTypeDef * pid, float out_low, float out_up);
|
|
void PID_PositionClean(PID_PositionTypeDef * pid);
|
|
void PID_PositionCalc(PID_PositionTypeDef * pid, float now_value);
|
|
|
|
void PID_IncrementalStructureInit(PID_IncrementalTypeDef * pid, float need_value);
|
|
void PID_IncrementalSetParameter(PID_IncrementalTypeDef * pid, float kp, float ki, float kd);
|
|
void PID_IncrementalSetEkRange(PID_IncrementalTypeDef * pid, float ek_low, float ek_up);
|
|
void PID_IncrementalSetOUTRange(PID_IncrementalTypeDef * pid, float out_low, float out_up);
|
|
void PID_IncrementalCalc(PID_IncrementalTypeDef * pid, float now_value);
|
|
|
|
#endif
|