文章目录

  • 1 简介
  • 2 什么是PID
    • 2.1 P:比例
    • 2.2 I:积分
    • 2.3 D:微分
    • 3 PID算法能做什么
  • 4 PID算法实现
    • 4.1 位置式pid算法实现
    • 4.2 增量式PID实现:
    • 4.3 抗积分饱和的PID算法实现
  • 5 最后

1 简介

Hi,大家好,这里是丹成学长,今天向大家讲解经典单片机控制算法:

PID控制算法

大家可用于 课程设计 或 毕业设计

单片机-嵌入式毕设选题大全及项目分享:

https://blog.csdn.net/m0_71572576/article/details/125409052

2 什么是PID

2.1 P:比例

成比例地反映控制系统的偏差信号e(t),偏差一旦产生,控制器立即产生控制作用,以减小偏差。当仅有比例控制时系统输出存在稳态误差(Steady-state error)。
P参数越小比例作用越强,动态响应越快,消除误差的能力越强。通常将P参数由大向小调,以能达到最快响应又无超调(或无大的超调)为最佳参数。

2.2 I:积分

为消除静差,提高系统的无差度。积分作用的强弱取决于积分时间常数T,T越大,积分作用越弱,反之则越强。

2.3 D:微分

反映偏差信号的变化趋势,并能在偏差信号变得太大之前,在系统中引入一个有效的早期修正信号,从而加快系统的动作速度,减少调节时间。在微分控制中,控制器的输出与输入误差信号的微分(即误差的变化率)成正比关系。
D越大,微分作用越强,D越小,微分作用越弱。系统调试时通常把D从小往大调,具体参数由试验决定。

3 PID算法能做什么

既然是一种控制算法,PID理所应当的用于单片机对某种器件的控制, 一般控制对象:

  • 温控(烤箱,冰箱等)
  • 电机转速控制
  • 平衡车控制
  • 飞行器控制
  • 压力、温度、流量、液位控制器

平衡车

PID温控

4 PID算法实现

PID算法不止一种,学长把常用的PID算法实现列举给大家

4.1 位置式pid算法实现

struct _pid{float SetSpeed;            //定义设定值float ActualSpeed;        //定义实际值float err;                //定义偏差值float err_last;            //定义上一个偏差值float Kp,Ki,Kd;            //定义比例、积分、微分系数float voltage;          //定义电压值(控制执行器的变量)float integral;            //定义积分值
}pid;void PID_init(){printf("PID_init begin \n");pid.SetSpeed=0.0;pid.ActualSpeed=0.0;pid.err=0.0;pid.err_last=0.0;pid.voltage=0.0;pid.integral=0.0;pid.Kp=0.2;pid.Ki=0.015;pid.Kd=0.2;printf("PID_init end \n");
}float PID_realize(float speed){pid.SetSpeed=speed;pid.err=pid.SetSpeed-pid.ActualSpeed;pid.integral+=pid.err;//位置式pid是对积分的持续累加,容易造成积分饱和,是系统过调pid.voltage=pid.Kp*pid.err+pid.Ki*pid.integral+pid.Kd*(pid.err-pid.err_last);pid.err_last=pid.err;pid.ActualSpeed=pid.voltage*1.0;return pid.ActualSpeed;
}
int main(){printf("System begin \n");PID_init();int count=0;while(count<1000){float speed=PID_realize(200.0);printf("%f\n",speed);count++;}
return 0;
}

4.2 增量式PID实现:

#include<stdio.h>
#include<stdlib.h>struct _pid{float SetSpeed;            //定义设定值float ActualSpeed;        //定义实际值float err;                //定义偏差值float err_next;            //定义上一个偏差值float err_last;            //定义最上前的偏差值float Kp,Ki,Kd;            //定义比例、积分、微分系数
}pid;void PID_init(){pid.SetSpeed=0.0;pid.ActualSpeed=0.0;pid.err=0.0;pid.err_last=0.0;pid.err_next=0.0;pid.Kp=0.2;pid.Ki=0.015;pid.Kd=0.2;
}float PID_realize(float speed){pid.SetSpeed=speed;pid.err=pid.SetSpeed-pid.ActualSpeed;float incrementSpeed=pid.Kp*(pid.err-pid.err_next)+pid.Ki*pid.err+pid.Kd*(pid.err-2*pid.err_next+pid.err_last);//只和前后三次的误差值有关,也方便计算pid.ActualSpeed+=incrementSpeed;pid.err_last=pid.err_next;pid.err_next=pid.err;return pid.ActualSpeed;
}int main(){PID_init();int count=0;while(count<1000){float speed=PID_realize(200.0);printf("%f\n",speed);count++;}return 0;
}

4.3 抗积分饱和的PID算法实现

float PID_realize(float speed){int index;pid.SetSpeed=speed;pid.err=pid.SetSpeed-pid.ActualSpeed;if(pid.ActualSpeed>pid.umax)  //灰色底色表示抗积分饱和的实现{if(abs(pid.err)>200)      //蓝色标注为积分分离过程{index=0;}else{index=1;if(pid.err<0){//如果超上限要嘛加负值要嘛就不加了,免得进入饱和区pid.integral+=pid.err;          }}}else if(pid.ActualSpeed<pid.umin){if(abs(pid.err)>200)      //积分分离过程{index=0;}else{index=1;if(pid.err>0){//如果超下限要嘛加正值要嘛就不加了免得进入饱和区pid.integral+=pid.err;}}}else{if(abs(pid.err)>200)                    //积分分离过程{index=0;}else{index=1;pid.integral+=pid.err;}}pid.voltage=pid.Kp*pid.err+index*pid.Ki*pid.integral+pid.Kd*(pid.err-pid.err_last);pid.err_last=pid.err;pid.ActualSpeed=pid.voltage*1.0;return pid.ActualSpeed;
}

单片机-嵌入式毕设选题大全及项目分享:

https://blog.csdn.net/m0_71572576/article/details/125409052

5 最后

【毕设教学】 经典单片机控制算法:PID - 嵌入式 物联网相关推荐

  1. 经典单片机控制算法:PID

    文章目录 1 简介 2 什么是PID 2.1 P:比例 2.2 I:积分 2.3 D:微分 3 PID算法能做什么 4 PID算法实现 4.1 位置式pid算法实现 4.2 增量式PID实现: 4.3 ...

  2. 【毕设教学】单片机如何运行SD卡里的程序

    文章目录 1 前言 2 实现方式 3 实现代码 2.1 main.c 2.2 NVM_Flash.h 4 最后 1 前言 这几天有同学在做项目,对步进电机控制原理不理解,来寻求学长解答,这里专门写一篇 ...

  3. 毕业设计 单片机手势识别系统 - 嵌入式 物联网

    文章目录 1 简介 2 实现效果 3 使用场景 4 参数说明 5 注意事项 6 最后 1 简介 Hi,大家好,今天向大家介绍一个学长做的单片机项目 基于单片机的手势识别系统 大家可用于 课程设计 或 ...

  4. 嵌入式物联网开发,linux,单片机32(仅供借鉴,代码不共享 自行编写)

    嵌入式物联网开发,linux,单片机32 一.嵌入式介绍 二.linux系统介绍 1.ubuntu使用安装 以下自行查阅资料学习,内容较多不是一时半会能学完的编程内容,最基本是C语言的熟练掌握 2.s ...

  5. 单片机 电子电路 嵌入式 毕设 课设 私活 代做

    专业承接51.AVR.STM32等单片机.ARM嵌入式.电子电路PCB原理图设计项目的开发和定制,电子DIY实物代做.仿真制作.程序编写.PCB工厂打样等业务.我们具备五六年的制作经验,有一流的技术水 ...

  6. 基于嵌入式物联网技术的智慧病房方案设计

    文章目录 前言 一.系统设计要求 二.系统硬件设计 单片机控制电路 AHT20模块 心率脉搏采集模块 MOBUS通信模块 三.系统功能分析与STM32F103基本配置 基本配置如下 四 主要代码设计 ...

  7. 开源 | 嵌入式物联网应用开发 - 无线收发模块

    上一篇文章讲述了ARM-Linux中控扩展模块的开发设计,上一篇文章的具体内容,请参考以下链接: 开源 | 嵌入式物联网项目开发 - ARM中控扩展模块 为了提高硬件模块的可重用性,对于终端设备模块的 ...

  8. 【嵌入式物联网实战项目】环境监测设备接入涂鸦IoT开发平台

    小熊派物联网开发板接入涂鸦 IoT 开发平台实现植物环境监测 物联网的概念其实十几二十年前就已经有了,随着人工智能,大数据,云计算这些科技的发展,越来越多的物联网项目正式商用落地,比如,共享单车和共享 ...

  9. 记2020年7月5日深圳福田凤凰楼嵌入式/物联网博客-公众号大佬面基聚会

    今年最大的收获就是有机会认识这群在嵌入式方向不断深耕的大佬,这一点我要感谢黄工一直以来对我们的指导,才让我们有这样的机会相聚在一起. strongerHuang-黄工 公众号『strongerHuan ...

  10. 单片机和嵌入式哪个好?单片机会被嵌入式取代吗?

    很多初学者都搞不清楚单片机和嵌入式的区别. 今天就和大家来聊一聊这个话题. 嵌入式和单片机,我喜欢用老爸和儿子的关系来区分它们. 嵌入式开发细分很多方向,而单片机就是其中一个方向. 除了单片机以外,还 ...

最新文章

  1. 二维数组练习--矩阵的加法和乘法
  2. Dos批处理常用命令大全入门
  3. pcDuino 软件更新
  4. mysql 5.7巡检脚本_mysql自动化巡检脚本生成html报告
  5. pycharm中导入包失败,如何设置外部模块的路径
  6. 从一道面试题说起—js隐式转换踩坑合集
  7. 【Python基础知识-pycharm版】第六节-控制语句
  8. Uim的情人节礼物·其之弐(洛谷-P2524)
  9. java基础IO流使用读取一个文件中的文字输出到控制台上
  10. Python接口自动化之接口依赖
  11. 【推荐实践】图片主题模型在推荐系统的应用实践
  12. MySQL 优化策略
  13. 被投毒的管道:研究员探索CI环境中的攻击方法
  14. 【终极】文件夹隐藏方法,彻底隐藏文件夹的方法!显示隐藏的文件也看不到
  15. 开机自动启动QQ和微信,怎样设置取消
  16. MaprRduce v2 在 java 代码中远程提交作业到 Yarn 的配置项
  17. pip源换到国内镜像
  18. tolua++实现分析
  19. 馋猫美食记录本_隐私政策
  20. 计算机组装与维护集体备课,浅谈集体备课

热门文章

  1. originpro 2021 附安装教程
  2. 2020 Fall Berkeley CS61A Hog
  3. HTML 数据可视化模板 echarts实现
  4. AutoCAD 命令定义
  5. 大话MIMO-OFDM联合工作实现过程
  6. Web前端:2022年7大React组件库
  7. ruby 从入门到放弃-第一节-hello world
  8. mac 思科 链路聚合_链路聚合定义/Eth-trunk/思科华为配置实例
  9. OriginPro 中文
  10. 金属摇滚混音教程|录制好吉他后,如何正确处理?(付QNA答疑)|MZD Studios