【嵌入式八股15】:控制算法

在嵌入式系统中,控制算法是确保系统精确、稳定运行的核心技术之一。它们用于处理和调整系统状态,保证输出达到预定目标。本文将深入探讨几种常见的控制算法,包括 PID控制串级PID控制,以及 卡尔曼滤波(KF、EKF、UKF),并详细分析其应用和实现细节。

1. PID 控制算法

PID 控制(Proportional-Integral-Derivative Control)是工业控制系统中最基础、最常用的控制算法之一。PID控制通过计算误差的比例、积分和微分部分来调节系统的输出,使系统能够快速、准确地达到预定目标。

PID 控制的三大核心部分

  1. 比例控制(P):根据当前的误差值进行调节。误差越大,输出值也越大。其计算方式为:

    其中, 是比例增益,error 为目标值与当前值的差异。

  2. 积分控制(I):对误差进行积分,累计过去的误差,通常用于消除长期的稳态误差。其计算公式为:

    是积分增益,积分过程可以使系统保持较小的长期误差。

  3. 微分控制(D):依据误差变化的速率进行调节,用于防止系统过冲和抑制震荡。公式为:

    其中, 是微分增益,反映误差变化的速度。

PID 控制器的实现

以下是一个典型的 PID 控制器结构的实现代码:

typedef struct {
    uint8_t mode;              // 控制模式
    float Kp, Ki, Kd;         // PID 参数
    float max_out, max_iout;   // 输出限幅
    float set, fdb;            // 目标值与反馈值
    float out, Pout, Iout, Dout;
    float Dbuf[3];             // 微分项
    float error[3];            // 误差项
} PID_t;

float PID_Calc(PID_t *pid, float fdb, float set) {
    if (pid == NULL) {
        return 0.0f;
    }

    // 更新误差历史数据
    pid->error[2] = pid->error[1];
    pid->error[1] = pid->error[0];
    pid->set = set;
    pid->fdb = fdb;
    pid->error[0] = set - fdb;

    // 计算位置环 PID
    if (pid->mode == PID_POSITION) {
        pid->Pout = pid->Kp * pid->error[0];
        pid->Iout += pid->Ki * pid->error[0];
        pid->Dbuf[2] = pid->Dbuf[1];
        pid->Dbuf[1] = pid->Dbuf[0];
        pid->Dbuf[0] = pid->error[0] - pid->error[1];
        pid->Dout = pid->Kd * pid->Dbuf[0];

        // 限制积分输出
        LimitMax(pid->Iout, pid->max_iout);

        pid->out = pid->Pout + pid->Iout + pid->Dout;
        LimitMax(pid->out, pid->max_out);
    }
    // 计算变化量环 PID
    else if (pid->mode == PID_DELTA) {
        pid->Pou

剩余60%内容,订阅专栏后可继续查看/也可单篇购买

嵌入式八股/模拟面试拷打 文章被收录于专栏

一些八股模拟拷打Point,万一有点用呢

全部评论
串级PID适合什么场景
点赞 回复 分享
发布于 03-06 20:01 山东
框架理得不错
点赞 回复 分享
发布于 03-04 07:58 广东
卡尔曼滤波如何调参
点赞 回复 分享
发布于 02-28 16:14 陕西

相关推荐

08-11 15:46
门头沟学院 C++
叶舒华的一条鱼:我记得malloc底层是两种系统调用,第一种就是brk,然后移动堆顶向高地址移动,另外一种就是mmap,在虚拟内存空间中的共享文件映射段分配一块虚拟内存,然后他想问的应该就是第二种吧
点赞 评论 收藏
分享
青源计划,单片机方向,一面面经(已过)1.学过什么语言:c,java,py,c++面试官说主要用c2.讲讲c语言关键字,有什么用(说几个):我直接答的static,volatile,externed三个,结合嵌入式写程序里面的用法去说的3.数组和指针的区别4.指针存放在什么位置:我不太清楚,我答的放在堆区吧,面试官好像说是对的?后面想想指针是全局变量确实应该放在堆区5.指针的值能直接改吗:改🔨,=修改那不就是改变指向的地方吗6.了解哪些通信协议:uart,i2c,spi7.uart的工作方式8.uart怎么确保通信正确9.uart出现问题会是哪些地方出问题,你会怎么排查10.I2c和uart的不同:先介绍的i2c,再说不同11.中断了解吗?使用中断有什么注意事项:快进快出,避免超时,不delay12.如果我想要在中断里用长时间的延时函数有什么办法。比如我想在中断里点个2秒亮2秒灭的灯要怎么做13.挖项目:你做了哪些东西,你有什么收获之类的。这一项我写的项目都是我自己手搓的所以我基本就是口吐莲花了14.期望薪资待遇:我tm找实习的,你官网也没写实习生会开多少,你们薪酬体系我一个外人压根不知道我怎么答?15.反问环节16.怎么看待加班:懂得都懂17.手撕一道代码题(没错,我都以为要结束了,结果突然让我手撕!!!):写一个程序,找出指定字符串中最后一个只出现一次的字符,如果全部字符都有重复就找出最后一个重复次数最多的字符,用c写。char findlastchar(const char* string)估计是leetcode上的,具体哪题我没刷到不过也写出来了。先写的遍历然后从后往前找,没时间写优化方法了,只讲了思路
查看13道真题和解析
点赞 评论 收藏
分享
评论
7
20
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务