【毕设教学】 经典单片机控制算法: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 抗积分饱和的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 - 嵌入式 物联网相关推荐
- 经典单片机控制算法: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 ...
- 【毕设教学】单片机如何运行SD卡里的程序
文章目录 1 前言 2 实现方式 3 实现代码 2.1 main.c 2.2 NVM_Flash.h 4 最后 1 前言 这几天有同学在做项目,对步进电机控制原理不理解,来寻求学长解答,这里专门写一篇 ...
- 毕业设计 单片机手势识别系统 - 嵌入式 物联网
文章目录 1 简介 2 实现效果 3 使用场景 4 参数说明 5 注意事项 6 最后 1 简介 Hi,大家好,今天向大家介绍一个学长做的单片机项目 基于单片机的手势识别系统 大家可用于 课程设计 或 ...
- 嵌入式物联网开发,linux,单片机32(仅供借鉴,代码不共享 自行编写)
嵌入式物联网开发,linux,单片机32 一.嵌入式介绍 二.linux系统介绍 1.ubuntu使用安装 以下自行查阅资料学习,内容较多不是一时半会能学完的编程内容,最基本是C语言的熟练掌握 2.s ...
- 单片机 电子电路 嵌入式 毕设 课设 私活 代做
专业承接51.AVR.STM32等单片机.ARM嵌入式.电子电路PCB原理图设计项目的开发和定制,电子DIY实物代做.仿真制作.程序编写.PCB工厂打样等业务.我们具备五六年的制作经验,有一流的技术水 ...
- 基于嵌入式物联网技术的智慧病房方案设计
文章目录 前言 一.系统设计要求 二.系统硬件设计 单片机控制电路 AHT20模块 心率脉搏采集模块 MOBUS通信模块 三.系统功能分析与STM32F103基本配置 基本配置如下 四 主要代码设计 ...
- 开源 | 嵌入式物联网应用开发 - 无线收发模块
上一篇文章讲述了ARM-Linux中控扩展模块的开发设计,上一篇文章的具体内容,请参考以下链接: 开源 | 嵌入式物联网项目开发 - ARM中控扩展模块 为了提高硬件模块的可重用性,对于终端设备模块的 ...
- 【嵌入式物联网实战项目】环境监测设备接入涂鸦IoT开发平台
小熊派物联网开发板接入涂鸦 IoT 开发平台实现植物环境监测 物联网的概念其实十几二十年前就已经有了,随着人工智能,大数据,云计算这些科技的发展,越来越多的物联网项目正式商用落地,比如,共享单车和共享 ...
- 记2020年7月5日深圳福田凤凰楼嵌入式/物联网博客-公众号大佬面基聚会
今年最大的收获就是有机会认识这群在嵌入式方向不断深耕的大佬,这一点我要感谢黄工一直以来对我们的指导,才让我们有这样的机会相聚在一起. strongerHuang-黄工 公众号『strongerHuan ...
- 单片机和嵌入式哪个好?单片机会被嵌入式取代吗?
很多初学者都搞不清楚单片机和嵌入式的区别. 今天就和大家来聊一聊这个话题. 嵌入式和单片机,我喜欢用老爸和儿子的关系来区分它们. 嵌入式开发细分很多方向,而单片机就是其中一个方向. 除了单片机以外,还 ...
最新文章
- 二维数组练习--矩阵的加法和乘法
- Dos批处理常用命令大全入门
- pcDuino 软件更新
- mysql 5.7巡检脚本_mysql自动化巡检脚本生成html报告
- pycharm中导入包失败,如何设置外部模块的路径
- 从一道面试题说起—js隐式转换踩坑合集
- 【Python基础知识-pycharm版】第六节-控制语句
- Uim的情人节礼物·其之弐(洛谷-P2524)
- java基础IO流使用读取一个文件中的文字输出到控制台上
- Python接口自动化之接口依赖
- 【推荐实践】图片主题模型在推荐系统的应用实践
- MySQL 优化策略
- 被投毒的管道:研究员探索CI环境中的攻击方法
- 【终极】文件夹隐藏方法,彻底隐藏文件夹的方法!显示隐藏的文件也看不到
- 开机自动启动QQ和微信,怎样设置取消
- MaprRduce v2 在 java 代码中远程提交作业到 Yarn 的配置项
- pip源换到国内镜像
- tolua++实现分析
- 馋猫美食记录本_隐私政策
- 计算机组装与维护集体备课,浅谈集体备课