温控算法的实现:四

时至今日,我终于算是大体上完成了温控的算法,现在就将具体的实现总结如下。

一:matlab的仿真。

matlab可以用来实现离散PID的模拟仿真,从而用来整定最后的参数。

(1)matlab温升曲线的拟合

当满功率加热时,温度上升拟合的曲线如下所示:

所以由拟合结果可知,K=141.1 B=38 C=60.04

但是实际上温度的起点约为20℃,而温度的终点差不多为210℃,所以我们可以大体上以传递方程

200/38*s+1作为拟合的方程。

(2)临界比例法整定PID参数

在闭环控制系统里,将调节器置于纯比例作用下,从小到大逐渐改变调节器的比例系数,得到等幅振荡的过渡过程。此时的比例系数称为临界比例系数,相邻两个波峰间的时间间隔,称为临界振荡周期Tu。
临界比例度法步骤:
1、将调节器的积分时间置于最大(Ti = ∞),微分时间置零(Td = 0),比例系数适当,平衡操作一段时间,把系统投入自动运行。
2、将比例系数逐渐增大,得到等幅振荡过程,记下临界比例系数Ku和临界振荡周期Tu值。
3、根据和值,采用经验公式,计算出调节器各个参数,即Ti和Td的值。
经验公式为:

Ts = 0.14 * Tu Kp = 0.63 * Ku  Ti = 0.49 * Tu  Td = 0.14 * Tu

(3)matlab得到Ku和Tu

function PID_1(M)
% M为输出图形的横坐标最大值;
ts=0.05;%采样时间 50ms
G=tf(200,[38,1])
Gd=c2d(G,ts,‘z‘) %Z变换
[num,den]=tfdata(Gd,‘v‘)
c_1=0;
y_1=0;
e_1=0;e_2=0;
kp=7.6;Ti=inf;Td=0;
ki=kp*ts/Ti;
kd=kp*Td/ts;
A=kp*(1+ts/Ti+Td/ts);
B=-kp*(1+2*Td/ts);
C=kp*Td/ts;
for k=1:1:M*20
t(k)=k*ts;

r(k)=1;
y(k) = -den(2)*y_1 + num(2)*c_1 ;
e(k) = r(k) - y(k);
c(k) = (A*e(k) + B*e_1 + C*e_2);

c(k) = c_1 + c(k);
c_1 = c(k);
y_1 = y(k);
e_2 = e_1;
e_1 = e(k);
end
plot(t,y,‘r‘,t,r,‘b‘)

grid on;

得到等幅震荡

所以可知Tu = 100ms   Ku = 7.6 。

(4)确定Kp ,Ti ,Tu。

由经验公式可知,Ts = 0.14 * Tu = 14ms , Kp = 0.63 * 7.6 = 4.788 , Ti = 0.49 * Tu =  49ms

Td = 0.14 * Tu = 14ms

所以仿真

function PID_1(M)
%a选则输入信号,M为输出图形的横坐标最大值;
ts=0.014;%采样时间 50ms
G=tf(200,[38,1])
Gd=c2d(G,ts,‘z‘) %Z变换
[num,den]=tfdata(Gd,‘v‘)
c_1=0;
y_1=0;
e_1=0;e_2=0;
kp=4.788;Ti=0.049;Td=0.014;
ki=kp*ts/Ti;
kd=kp*Td/ts;
A=kp*(1+ts/Ti+Td/ts);
B=-kp*(1+2*Td/ts);
C=kp*Td/ts;
for k=1:1:M*71
t(k)=k*ts;

r(k)=100;
y(k) = -den(2)*y_1 + num(2)*c_1 ;
e(k) = r(k) - y(k);
c(k) = (A*e(k) + B*e_1 + C*e_2);

c(k) = c_1 + c(k);
c_1 = c(k);
y_1 = y(k);
e_2 = e_1;
e_1 = e(k);
end
plot(t,y,‘r‘,t,r,‘b‘)

plot(t,c,‘r‘)

grid on;

仿真结果为

     

右图为变量c的仿真结果,在实际中对应着PWM波的占空比,由图中可以知道,这个数值远大于1,所以需要归一化。

那么可以在程序中设置一个幅值为200的阶跃信号,得到的c曲线为:

c_max < 2500, 所以可以设置系数为 0.0004。

最后再经过调整,可以将Ti设置为8s , Td设置为14ms , Kp设置为4.788 。此时仿真结果为

r(k) = 100

r(k) = 150

所以Kp= 4.788   Ki = Kp * Ts / Ti = 0.00839  Kd = Kp * Td / Ts = 4.788

二: 实际验证

将以上参数写入单片机中,采集温度数据,观测温升曲线,调试,将Kp,Kd修正为15,Ki修正为0.2635。比例因子为0.00025 。

(1)温度设置为100℃时:

(2)温度设置为150℃时

时间: 2024-12-06 19:11:08

温控算法的实现:四的相关文章

图像旋转算法的实现

上一篇转载的文章(http://blog.csdn.net/carson2005/article/details/36900161)介绍了图像旋转的原理,这里给出代码实现,具体原理请参考上面的链接: 实现代码: void ImgRotate(cv::Mat imgIn, float theta, cv::Mat& imgOut) { int oldWidth = imgIn.cols; int oldHeight = imgIn.rows; // 源图四个角的坐标(以图像中心为坐标系原点) fl

Canny边缘检测算法的实现

Canny原理 Canny的原理就不细说了,冈萨雷斯的<数字图像处理>(第三版)P463~465讲解的比较清楚,主要就四个步骤: 1. 对图像进行高斯滤波 2. 计算梯度大小和梯度方向 3. 对梯度幅值图像进行非极大抑制 4. 双阈值处理和连接性分析(通常这一步与非极大抑制并行,详见下面的代码) 下面重点说一下非极大抑制. 非极大抑制 对一幅图像计算梯度大小和梯度方向后,需要进行非极大抑制,一般都是通过计算梯度方向,沿着梯度方向,判断该像素点的梯度大小是否是极大值.这里主要说一下方向的判断.

Python学习(三) 八大排序算法的实现(下)

本文Python实现了插入排序.基数排序.希尔排序.冒泡排序.高速排序.直接选择排序.堆排序.归并排序的后面四种. 上篇:Python学习(三) 八大排序算法的实现(上) 1.高速排序 描写叙述 通过一趟排序将要排序的数据切割成独立的两部分,当中一部分的全部数据都比另外一部分的全部数据都要小,然后再按此方法对这两部分数据分别进行高速排序,整个排序过程能够递归进行,以此达到整个数据变成有序序列. 1.先从数列中取出一个数作为基准数. 2.分区过程,将比这个数大的数全放到它的右边,小于或等于它的数全

通用固定长度编码格式的字符串查找算法的实现

通用固定长度编码格式的字符串查找算法的实现 字符串的查找是数据库应用中必不可少的操作,而且每种数据库产品(ORACLE.DB2.SYBASE.MS SQL SERVER.MYSQL等等)也都提供了对应的字符串处理函数,比如DB2的LOCATE函数. 但在实际的工作中,还是会遇到一些特殊情况的处理,这使得直接使用字符串查找函数,得到的结果可能是错误的,比如本文中提到的固定长度编码格式的字符串的查找.值得注意的是,本文提出的算法可以稍加修改即移植到其它关系数据库系统或者前端开发工具中. 在实际数据库

基于思岚A1激光雷达+OpenGL+VS2017的Ramer-Douglas-Peucker算法的实现

时隔两年 又借到了之前的那个激光雷达,最老版本的思岚A1,甚至不支持新的固件,并且转接板也不见了,看了下淘宝店卖¥80,但是官方提供了一个基于STM32的实现方式,于是我估摸着这个转接板只是一个普通的USB-TTL转接板,那我就用340搭一个试试吧 根据官方的datasheet,电机可以5V供电,核心也是5V,电机使能是VMOTO电压,即5V,因此将三个接口焊到一起,两个地焊到一起,然后剩下一组TXRX,因此七个接口变成四个接口了,正好能接上340,于是插上电试了试,当然...没有那么顺利,报错

万年历算法的实现(C语言--gcc编译)

/** cal.c * * 现行的格里历是从儒略历演化而来的.儒略历每4年一个润年,润年366天,平年365天.* 如果从公元1年算的话,那么凡是能够被4整除的都是润年.从天文角度看,儒略历这种 * 历法是有误差的,到16世纪误差已经达到了10天.1582年,罗马教皇对儒略历进行了 * 一次校定,该年的10-5到10-14这10天被抹掉,并规定凡不能被400整除的世纪年不再 * 算为润年,校定之后的儒略历即为现行的格里历. * * 但是英国直到1752年才开始使用格里历,此时时间误差已经达到了1

搜索引擎--范例:中英文混杂分词算法的实现--正向最大匹配算法的原理和实现

纯中文和中英文混杂的唯一区别是,分词的时候你如何辨别一个字符是英文字符还是孩子字符, 人眼很容易区分,但是对于计算机来说就没那么容易了,只要能辨别出中文字符和英文的字符,分词本身就不是一个难题 1:文本的编码问题: utf8:windows下,以utf8格式保存的文本是一个3个字节(以16进制)的BOM的,并且你不知道一个汉字是否是用3位表示,但是英文适合ascii编码一样的 ascii:英文一位,中文两位,并且中文的第一个字节的值是大于128和,不会和英文混淆,推荐 unicode:中文基本是

探讨排序算法的实现

排序算法是我们工作中使用最普遍的算法,常见的语言库中基本都会有排序算法的实现,比如c标准库的qsort,stl的sort函数等.本文首先介绍直接插入排序,归并排序,堆排序,快速排序和基数排序等比较排序算法,然后介绍计数排序,基数排序等具有线性时间的排序算法.本文主要讨论算法的实现方法,并不会过多介绍基本理论. 评价一个排序算法优劣适用与否,一般需要从三个方面来分析 时间复杂度.用比较操作和移动操作数的最高次项表示,由于在实际应用中最在乎的是运行时间的上限,所以一般取输入最坏情况的下的运行时间作为

Bug2算法的实现(RobotBASIC环境中仿真)

移动机器人智能的一个重要标志就是自主导航,而实现机器人自主导航有个基本要求--避障.之前简单介绍过Bug避障算法,但仅仅了解大致理论而不亲自动手实现一遍很难有深刻的印象,只能说似懂非懂.我不是天才,不能看几遍就理解理论中的奥妙,只能在别人大谈XX理论XX算法的时候,自己一个人苦逼的面对错误的程序问为什么... 下面开始动手来实现一下简单的Bug2避障算法.由于算法中涉及到机器人与外界环境的交互,因此需要选择一个仿真软件.常用的移动机器人仿真软件主要有Gazebo.V-rep.Webots.MRD