原创 MPU6050 介绍及C语言 包含PID抗饱和机制 或者使用更复杂的控制算法ID小车完整代码

2024-2-1 05:12 449 3 3 分类: 物联网 文集: 学习分享
MPU6050是一种集成了3轴陀螺仪和3轴加速度计的微型电子运动传感器,广泛应用于飞行控制系统、游戏控制器的运动检测等领域。它通过I2C接口与微控制器进行通信,可以测量设备在空间中的加速度和角速度。

PID(比例-积分-微分)控制器是一种常用的反馈控制器。它的工作原理是通过比较期望值和实际值之间的误差,然后通过比例、积分和微分三个环节来调整控制量,使系统的实际输出逐渐接近期望输出。

以下是一个简单的C语言实现的PID控制器代码:

//```c
#define Kp 1.0 // 比例系数
#define Ki 0.5 // 积分系数
#define Kd 0.1 // 微分系数
#define OUTPUT_LIMIT 100.0 // 输出限幅
#define INTEGRAL_LIMIT 1000.0 // 积分项限幅

float setpoint, input, error, Pout, Iout, Dout, last_error, output;
int integral = 0;
bool is_saturated = false; // 标志位,表示是否饱和

void PID_update(float setpoint, float input) {
    error = setpoint - input;
    Pout = Kp * error;
    
    // 检查饱和情况,如果输出大于等于上限或小于等于下限,则停止积分
    if (output >= OUTPUT_LIMIT || output <= -OUTPUT_LIMIT) {
        is_saturated = true;
    } else {
        is_saturated = false;
    }
    
    if (!is_saturated) {
        integral += Ki * error;
        // 限制积分项增长
        if (integral > INTEGRAL_LIMIT) {
            integral = INTEGRAL_LIMIT;
        } else if (integral < -INTEGRAL_LIMIT) {
            integral = -INTEGRAL_LIMIT;
        }
    }
    
    Dout = Kd * (error - last_error);
    last_error = error;
    output = Pout + Iout + Dout;
    
    // 应用输出限幅
    if (output > OUTPUT_LIMIT) {
        output = OUTPUT_LIMIT;
    } else if (output < -OUTPUT_LIMIT) {
        output = -OUTPUT_LIMIT;
    }
}
//```

这段代码引入了`OUTPUT_LIMIT`和`INTEGRAL_LIMIT`两个常数来定义输出和积分项的限制。`is_saturated`变量用于标识输出是否处于饱和状态,从而决定是否继续积分。最后,对最终的`output`进行限幅处理,确保其不会超出定义的范围。

作者: 丙丁先生, 来源:面包板社区

链接: https://mbb.eet-china.com/blog/uid-me-3996156.html

版权声明:本文为博主原创,未经本人允许,禁止转载!

PARTNER CONTENT

文章评论0条评论)

登录后参与讨论
EE直播间
更多
我要评论
0
3
关闭 站长推荐上一条 /3 下一条