PID代码及注释

/****************************所谓PID即为P(比例)+I(积分)+D(微分**************************/
**(1)P控制(比例控制):    e(t) = SP - y(t);        SP--设定值   e(t)--误差值(设定的值和当前的误差) y(t)--反馈值(当前值)
**适用于滞后性不大的系统   u(t) = e(t) * P;        u(t)--输出值(需要输出的) P--比例系数
**
**(2)PI控制(比例+积分):  u(t) = Kp*e(t) + Ki∑e(t) + u0
**可使系统进入稳态无稳态误差u(t)--输出 Kp--比例放大系数 ki--积分放大系数 e(t)--误差 u0--控制量基准值(基础偏差)
**
**(3)PD控制(微分控制):     
**微分项解决响应速度问题   积分项解决稳定性
**(4)PID控制(比例积分微分控制):
**微分项解决响应速度问题   u(t) = Kp*e(t) + Ki∑e(t)+ Kd[e(t) – e(t-1)] + u0            
**采样周期(即反馈值的采样周期)
**控制周期(就是每隔多长时间进行一次PID运算,并将结果输出)
****************************小结:P(比例)--即时性 I(积分)--响应速度 D(微分)--稳定性************************************
*/
#include<stdio.h>
#include<string.h>
#include"StandardPID.h"
//#include<stdib.h>

//对变量的声明
typedef struct PID{
    double SetPoint;            //设定值
    double Kp;                  //比例系数
    double Ki;                  //积分系数
    double Kd;                  //微分系数
    double LastError;           //最后一次误差数Er[-1]
    double PrevError;           //最后第二次误差数er[-2]
    double SumError;            //误差积分  
}PID;

/*
**PID计算部分
*/
double PIDCalc(PID *pp, double NextPoint)   
{
    double dError,                              //当前微分
           Error;                               //偏差
    Error = pp->SetPoint - NextPoint;           //偏差值=设定值-输入值(当前值)
    pp->SumError += Error;                      //积分=积分+偏差  --偏差的累加
    dError = pp->LastError - pp->PrevError;     //当前微分 = 最后误差 - 之前误差
    pp->PrevError = pp->LastError;              //更新“之前误差”
    pp->LastError = Error;                      //更新“最后误差”
    return (pp->Kp * Error                      //比例项 = 比例常数 * 偏差
        +   pp->Ki *  pp->SumError              //积分项 = 积分常数 * 误差积分
        +   pp->Kd * dError                     //微分项 = 微分常数 * 当前微分
        );
}
//为PID变量申请内存,范围指向pp的指针
void PIDInit (PID *pp)   
{
                                //memset是计算机中C / C++语言函数。将s所指向的某一块内存中的前n个
    memset(pp, 0, sizeof(PID)); //字节的内容全部设置为ch指定的ASCII值,块的大小由第三个参数指定,
}                               //这个函数通常为新申请的内存做初始化工作, 其返回值为指向s的指针。

double sensor(void)                 //输入
{   
    double shuru;
    scanf("%lf", &shuru);
    return shuru;
}

void actuator(double rDelta)       //输出
{
    printf("%lf\n", rDelta);
}

int main()
{
    PID sPID;                       //PID结构体
    double rOut;                    //输出变量
    double rIn;                     //输入变量
    PIDInit(&sPID);                 //初始化结构体
    sPID.Kp = 0.5;
    sPID.Ki = 0.5;                  
    sPID.Kd = 0.5;
    sPID.SetPoint = 100.0;

    for (;;){
        rIn = sensor();             //取输入值
        rOut = PIDCalc(&sPID, rIn); //PID运算
        actuator(rOut);             //输出
    }
}
#define __StandardPID_H

double PIDCalc(PID *pp, double NextPoint);
void PIDInit (PID *pp);
double sensor(void);
void actuator(double rDelta);

#endif 
当涉及到模糊化 PID 控制器的 C 代码时,需要了解 PID 控制器的原理和基本结构。PID 控制器是一种经典的反馈控制器,用于调节系统的输出以接近期望的目标值。 以下是一个简单的模糊化 PID 控制器的 C 代码示例,以及相关的注释: ```c #include <stdio.h> // 定义 PID 控制器参数 double Kp = 1.0; // 比例系数 double Ki = 0.5; // 积分系数 double Kd = 0.2; // 微分系数 // 定义 PID 控制器状态变量 double error = 0.0; // 当前误差 double prev_error = 0.0; // 上一次误差 double integral = 0.0; // 积分项 double derivative = 0.0; // 微分项 // 模糊化函数 double fuzzy(double input) { // 在这里实现模糊化逻辑 // 根据输入值来计算模糊化后的输出值 // 返回模糊化后的值 } // 更新 PID 控制器状态 void update_pid(double setpoint, double input) { // 计算当前误差 error = setpoint - input; // 计算积分项 integral += error; // 计算微分项 derivative = error - prev_error; // 更新上一次误差 prev_error = error; // 计算 PID 控制器输出 double output = (Kp * error) + (Ki * integral) + (Kd * derivative); // 模糊化 PID 控制器输出 double fuzzy_output = fuzzy(output); // 在这里执行 PID 控制器输出 // ... } int main() { double setpoint = 10.0; // 目标设定点 double input = 0.0; // 当前输入值 // 模拟系统运行过程 for (int i = 0; i < 100; i++) { // 在这里获取当前输入值 // ... // 更新 PID 控制器状态 update_pid(setpoint, input); // 在这里执行 PID 控制器输出并将结果应用于系统 // ... } return 0; } ``` 请注意,这只是一个简单的示例,实际的模糊化逻辑需要根据具体的应用场景进行实现。模糊化函数和执行 PID 控制器输出的部分需要根据你的具体需求进行相应的实现。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值