sentry_chassis_hzz/modules/algorithm/controller.h

135 lines
3.1 KiB
C
Raw Normal View History

2022-10-20 17:13:02 +08:00
/**
2022-11-01 22:32:15 +08:00
******************************************************************************
* @file controller.h
* @author Wang Hongxi
* @version V1.1.3
* @date 2021/7/3
* @brief
******************************************************************************
* @attention
*
******************************************************************************
*/
2022-10-20 17:13:02 +08:00
#ifndef _CONTROLLER_H
#define _CONTROLLER_H
#include "main.h"
#include "stdint.h"
#include "string.h"
#include "stdlib.h"
#include "bsp_dwt.h"
#include "arm_math.h"
#include <math.h>
#ifndef abs
#define abs(x) ((x > 0) ? x : -x)
#endif
2022-11-01 22:32:15 +08:00
// PID 优化环节使能标志位
typedef enum
2022-10-20 17:13:02 +08:00
{
2023-01-02 23:20:35 +08:00
PID_IMPROVE_NONE = 0b00000000, // 0000 0000
2022-11-01 22:32:15 +08:00
Integral_Limit = 0b00000001, // 0000 0001
Derivative_On_Measurement = 0b00000010, // 0000 0010
Trapezoid_Intergral = 0b00000100, // 0000 0100
Proportional_On_Measurement = 0b00001000, // 0000 1000
OutputFilter = 0b00010000, // 0001 0000
ChangingIntegrationRate = 0b00100000, // 0010 0000
DerivativeFilter = 0b01000000, // 0100 0000
ErrorHandle = 0b10000000, // 1000 0000
2022-10-20 17:13:02 +08:00
} PID_Improvement_e;
2022-11-01 22:32:15 +08:00
/* PID 报错类型枚举*/
2022-10-20 17:13:02 +08:00
typedef enum errorType_e
{
PID_ERROR_NONE = 0x00U,
Motor_Blocked = 0x01U
} ErrorType_e;
2022-11-01 22:32:15 +08:00
typedef struct
2022-10-20 17:13:02 +08:00
{
uint64_t ERRORCount;
ErrorType_e ERRORType;
} PID_ErrorHandler_t;
2022-11-01 22:32:15 +08:00
/* PID结构体 */
typedef struct
2022-10-20 17:13:02 +08:00
{
2022-11-01 22:32:15 +08:00
//---------------------------------- init config block
2022-10-31 20:20:16 +08:00
// config parameter
2022-10-20 17:13:02 +08:00
float Kp;
float Ki;
float Kd;
2022-10-31 20:20:16 +08:00
float MaxOut;
float IntegralLimit;
float DeadBand;
2022-11-01 22:32:15 +08:00
float CoefA; // For Changing Integral
float CoefB; // ITerm = Err*((A-abs(err)+B)/A) when B<|err|<A+B
2022-10-31 20:20:16 +08:00
float Output_LPF_RC; // RC = 1/omegac
float Derivative_LPF_RC;
2022-11-13 21:46:52 +08:00
PID_Improvement_e Improve;
2022-11-01 22:32:15 +08:00
//-----------------------------------
2022-10-31 20:20:16 +08:00
// for calculating
2022-10-20 17:13:02 +08:00
float Measure;
float Last_Measure;
float Err;
float Last_Err;
float Last_ITerm;
float Pout;
float Iout;
float Dout;
float ITerm;
float Output;
float Last_Output;
float Last_Dout;
2022-10-31 20:20:16 +08:00
float Ref;
2022-10-20 17:13:02 +08:00
uint32_t DWT_CNT;
float dt;
PID_ErrorHandler_t ERRORHandler;
} PIDInstance;
2022-10-20 17:13:02 +08:00
2022-10-31 20:20:16 +08:00
/* 用于PID初始化的结构体*/
2022-11-01 22:32:15 +08:00
typedef struct
2022-10-20 17:13:02 +08:00
{
2022-10-31 20:20:16 +08:00
// config parameter
float Kp;
float Ki;
float Kd;
2022-10-20 17:13:02 +08:00
float MaxOut; // 输出限幅
float IntegralLimit; // 积分限幅
float DeadBand; // 死区
2022-11-01 22:32:15 +08:00
float CoefA; // For Changing Integral
float CoefB; // ITerm = Err*((A-abs(err)+B)/A) when B<|err|<A+B
2022-10-31 20:20:16 +08:00
float Output_LPF_RC; // RC = 1/omegac
float Derivative_LPF_RC;
2022-10-20 17:13:02 +08:00
PID_Improvement_e Improve;
2023-01-02 23:20:35 +08:00
} PID_Init_Config_s;
2022-10-20 17:13:02 +08:00
2022-11-01 22:32:15 +08:00
/**
* @brief PID实例
*
* @param pid PID实例指针
* @param config PID初始化配置
*/
2023-01-02 23:20:35 +08:00
void PID_Init(PIDInstance *pid, PID_Init_Config_s *config);
2022-10-20 17:13:02 +08:00
2022-11-01 22:32:15 +08:00
/**
* @brief PID输出
*
* @param pid PID实例指针
* @param measure
* @param ref
* @return float PID计算输出
*/
float PID_Calculate(PIDInstance *pid, float measure, float ref);
2022-10-20 17:13:02 +08:00
2022-11-01 22:32:15 +08:00
#endif