用C/C++实现A(s)/B(s)=(1.151s+0.1774)/(s^3+0.739s^2+0.921s)的P、PD、PI、PID、积分器饱和PID、不完全微分PID、微分先行 PID控制
时间: 2024-03-17 17:45:36 浏览: 60
好的,让我来给出C/C++实现的代码。
首先,我们需要将传递函数进行离散化处理,得到一个差分方程,然后再根据不同的控制器进行代码实现。这里我们采用Tustin离散化方法,得到差分方程为:
y(k) = -0.8682*y(k-1) - 0.8081*y(k-2) - 0.01*y(k-3) + 0.001151*u(k-1) + 0.0001774*u(k-2)
其中,y(k)表示系统的输出,u(k)表示系统的输入。
下面分别给出不同控制器的C/C++代码实现:
1. P控制器
```c++
double P_controller(double e, double Kp)
{
double u;
u = Kp * e;
return u;
}
```
2. PD控制器
```c++
double PD_controller(double e, double de, double Kp, double Kd)
{
double u;
u = Kp * e + Kd * de;
return u;
}
```
3. PI控制器
```c++
double PI_controller(double e, double ie, double Kp, double Ki)
{
double u;
ie += e;
u = Kp * e + Ki * ie;
return u;
}
```
4. PID控制器
```c++
double PID_controller(double e, double de, double ie, double Kp, double Ki, double Kd)
{
double u;
ie += e;
u = Kp * e + Ki * ie + Kd * de;
return u;
}
```
5. 积分器饱和PID控制器
```c++
double Integral_Sat_PID_controller(double e, double de, double ie, double Kp, double Ki, double Kd, double sat)
{
double u;
ie += e;
if (ie > sat) ie = sat;
else if (ie < -sat) ie = -sat;
u = Kp * e + Ki * ie + Kd * de;
return u;
}
```
6. 不完全微分PID控制器
```c++
double Incomplete_Differential_PID_controller(double e, double de, double ie, double Kp, double Ki, double Kd, double theta)
{
double u;
ie += e;
u = Kp * e + Ki * ie + Kd * (de + theta * e);
return u;
}
```
7. 微分先行PID控制器
```c++
double Differential_Feedforward_PID_controller(double e, double de, double ie, double Kp, double Ki, double Kd, double Td)
{
static double y1 = 0.0; // y(k-1)
static double y2 = 0.0; // y(k-2)
double u;
ie += e;
u = Kp * e + Ki * ie + Kd * (de - 2 * y1 + y2) / Td;
y2 = y1;
y1 = de;
return u;
}
```
以上是对于不同控制器的C/C++代码实现,可以根据实际需要进行修改。需要注意的是,控制器的参数需要根据具体系统进行调整,以达到最优的控制效果。
阅读全文