adrc实现增量式pid输出功能代码
时间: 2024-01-07 08:04:42 浏览: 152
ADRC(Active Disturbance Rejection Control)算法是一种新型的控制算法,它在不需要精确模型的前提下,实现了对系统扰动的主动抑制,具有较强的鲁棒性和适应性。下面是一个增量式PID输出功能的ADRC代码示例:
```c
typedef struct
{
float r; // 设定值
float y; // 实际值
float e; // 误差
float u; // 控制量
float y1; // 一阶滞后
float y2; // 二阶滞后
float u0; // 等效控制量
float u1; // 一阶滞后
float u2; // 二阶滞后
float a1; // 参数 a1
float b0; // 参数 b0
float b1; // 参数 b1
float h; // 步长
}ADRC;
void ADRC_Init(ADRC *adrc, float r, float y, float h)
{
adrc->r = r;
adrc->y = y;
adrc->e = 0;
adrc->u = 0;
adrc->y1 = 0;
adrc->y2 = 0;
adrc->u0 = 0;
adrc->u1 = 0;
adrc->u2 = 0;
adrc->a1 = 0;
adrc->b0 = 0;
adrc->b1 = 0;
adrc->h = h;
}
void ADRC_Calculate(ADRC *adrc)
{
adrc->e = adrc->r - adrc->y;
adrc->a1 = 2.0 * exp(-adrc->h / adrc->T) * adrc->b1 - exp(-2.0 * adrc->h / adrc->T);
adrc->b0 = (adrc->Kp + adrc->Ki * adrc->h + adrc->Kd / adrc->h) / adrc->a1;
adrc->b1 = (adrc->Kp + 2.0 * adrc->Kd / adrc->h) / adrc->a1;
adrc->u0 = adrc->b0 * adrc->e + adrc->b1 * adrc->y1 - adrc->a1 * adrc->u1;
adrc->u = adrc->u0 + adrc->u1;
adrc->y2 = adrc->y1;
adrc->y1 = adrc->y;
adrc->u2 = adrc->u1;
adrc->u1 = adrc->u;
adrc->y = adrc->u;
}
void ADRC_Control(ADRC *adrc, float input)
{
adrc->r = input; // 设定值为输入值
ADRC_Calculate(adrc);
}
```
在这个代码中,我们定义了一个ADRC结构体,结构体中包含了控制器所需的变量。`ADRC_Init` 函数用于初始化这些变量,`ADRC_Control` 函数用于执行控制器计算,得到控制量 `u`,然后将其输出。这是一个简单的增量式PID输出功能的ADRC代码示例,可以根据实际需求进行进一步优化和改进。
阅读全文