1. 用PID算法实现温度控制
第一步:把器件等各种实物连上...
第二步:开环,对PWM的控温信号加阶跃(改变PWM的占空比),由输入输出的结果大致得出加热器的数学模型
第三部:由理论公式整定出PID参数
第四部:根据实际结果调节PID以达到你想要的指标
2. PID算法,做恒温箱使用,菜鸟不太懂,求教各位高手指导,谢谢
这个其实就是你怎样计算目标值的问题,将你的保温曲线画出来,然后确定你需要多少个温度点,以及每个温度点的时间,然后在适当的时间改变PID程序的目标值即可,如常温加热到100℃保温10分钟,在加热到200℃保温20分钟,那么将PID的目标值设置到100℃,运行PID,当测量值到达100℃时开始计时,计时10分钟后将PID的目标值改为200℃,当温度到达200℃是再开始计时,计时20分钟后进行下一段的运行或停机即可,复杂的保温曲线也是同样的道理,就是计算起来麻烦一些
3. 懂pid温度控制的请进!!!!
我刚做的PID温度控制的实验,稳定后控制精度达到0.1度,多找找PID的资料,好好看看吧,我弄这个东西走了很多弯路,温度控制选用“位置式”PID算法,不要用增量式的。
就你提出的问题:
1,此程序我看不懂,但是其返回必定是UK也就是输出比例UK(加热力度),一般单位是%,也有‰甚至更高的分辨率,(我的就是‰),比如你用0-10V电压去加热,那么输出UK=100时表示10V*100%=10V,输出50就是10*50%=5V,就是你下一时刻要加热的“力度”(增量式算法输出的是UK的变化量,就是上一时刻的UK加或减这个变化量来确定下一时刻的UK)
2,Kp比例系数,不是什么量的比例,作用最后公式中讲解
3,参数的确定是PID中最费时间的东西,要慢慢的通过实验来确定,就是PID参数整定的过程,不是像你说的30到60就可以算出来的,这个你可以搜一下PID整定,网上介绍方法一搜一大把。不过可以肯定的是,很费时的过程。
最后公式:位置式:Uk=Kp*ek+Ki*(e1+e2+...+ek)+Kd*(ek-e(k-1))
e:差值,比如加热中的设定-当前
ek:当前差值
e1,e2...:第1,2。。次差值
e(k-1):上一次差值
一般PID三个参数整定时首先会让ID都=0,那么Uk=Kp*ek
就是输出等于Kp*当前差值,可以看出,随着温度的升高,ek逐渐减小,UK就逐渐减小,两者成正比,Kp就是比例系数,还记得数学里的y=2x,2就是比例系数,那么KP越大,同样的ek时,UK越大,UK越大,加热越快,加热越快,控制越不稳定,波动大,反之,波动小,但加热慢。选择一个波动幅度能忍受的,加热速度也可以的KP值就是你整定参数KP的过程
有问题继续提出
4. 熟悉PID算法的请进
在过程控制中,按偏差的比例(P)、积分(I)和微分(D)进行控制的PID控制器(亦称PID调节器)是应用最为广泛的一种自动控制器。 具有原理简单,易于实现,适用面广,控制参数相互独立,参数的选定比较简单等优点;而且在理论上可以证明,对于过程控制的典型对象——“一阶滞后+纯滞后”与“二阶滞后+纯滞后”的控制对象,PID控制器是一种最优控制。PID调节规律是连续系统动态品质校正的一种有效方法,它的参数整定方式简便,结构改变灵活(PI、PD、…)。
PID参数整定:
(1) 比例系数Kc对系统性能的影响:
比例系数加大,使系统的动作灵敏,速度加快,稳态误差减小。Kc偏大,振荡次数加多,调节时间加长。Kc太大时,系统会趋于不稳定。Kc太小,又会使系统的动作缓慢。Kc可以选负数,这主要是由执行机构、传感器以控制对象的特性决定的。如果Kc的符号选择不当对象状态(pv值)就会离控制目标的状态(sv值)越来越远,如果出现这样的情况Kc的符号就一定要取反。
(2) 积分控制Ti对系统性能的影响:
积分作用使系统的稳定性下降,Ti小(积分作用强)会使系统不稳定,但能消除稳态误差,提高系统的控制精度。
(3) 微分控制Td对系统性能的影响:
微分作用可以改善动态特性,Td偏大时,超调量较大,调节时间较短。Td偏小时,超调量也较大,调节时间也较长。只有Td合适,才能使超调量较小,减短调节时间。
5. 什么是“PID算法”
pid是工业控制上的一种控制算法,其中p表示比例,i表示积分,d表示微分。以温度控制的pid程序为例:
p(比例)表示在温度设定值上下多少度的范围内做比例动作,当温度越高,功率越小,温度越低,功率就越大,功率到底为多大,就看温度偏差值和比例区间的大小按反比关系计算。
i(积分)也是一种比例,是温度偏差值的累积值与设定的一个值之间的反比关系,但要注意何时将温度偏差值的累积值清零。积分就好像当温度比设定值低很多而你有觉得温度升的慢的时候就使劲的加大功率一样。
d(微分)是温度变化快慢跟功率的比值,即当你觉得温度上升的太快时,就降低功率,一阻止温度上升过快,反之当温度下降太快时,就加大功率以阻止温度下降太快一样。
给我邮箱我可以给你发一份pid温度控制程序。
6. 请教单片机PWM控制加热器用增量式PID,三个参数的选择
uint ZKB; //定义占空比初始值
float zkc;
int kkk;
uint kp=4; //定义PID初始值
float ki=0.17;
uint kd=16;
uint uc=5000;
float ek;
float u_k;
float uk;
float uk1=0;
float ek1=0;
float ek2=0;
uchar click=0; //中断次数计数器变量
uint zhouqi=0;
void deal(uint t) //加热控制函数
{ TR0=1;
if(zhouqi==1) //进行PID算法,求新的占空比
{
zhouqi=0;
ek=wen_c-t; //计算偏差
u_k=kp*(ek-ek1)+ki*ek+kd*(ek-2*ek1+ek2); //计算增量
uk=uk1+u_k;
zkc=100*uk/uc;
if (zkc>=95)
zkc=95;
kkk=(int)zkc ;
}
if(t>=wen_c) //大于设定值
shuchu=0; //输出高电平
else //小于设定值
{
ZKB=(int)zkc; //调整新的脉宽定时,即新的占空比
if (click<=ZKB) // 判断脉宽定时周期是否到?当小于占空比值时输出高电平,高于时是低电平,从而实现占空比的调整
shuchu=1;
else
shuchu=0 ;
}
}
7. 单片机是怎么用PID控制算法实现对电加热
那要看你计算出来的是什么了,如果直接是一个电流,那么直接用它来驱动加热炉就行,如果是一个误差值(理想值与真实值之差),那么就要先计算出要是电炉达到理想温度的电流值是多少,再用计算出的电流来驱动。希望能对你有帮助。
8. 水温控制的PID算法中怎样控制加热装置
将PID输出的信号转换成脉宽信号就可以了。用脉宽信号驱动固态继电器就可以了(电加热)。如果是用蒸汽加热可以用电磁阀
9. PID算法控制温度加热系统,室温(为防止分数流失,做成追加100分以上)
刚好前不久搞过PID,部分程序如下,仅供参考
/*==============================================================================
在使用单片机作为控制cpu时,请稍作简化,具体的PID参数必须由具体对象通过实验确定。
由于单片机的处理速度和ram资源的限制,一般不采用浮点数运算,而将所有参数全部用整数,
运算到最后再除以一个2的N次方数据(相当于移位),作类似定点数运算,可大大提高运算速度,
根据控制精度的不同要求,当精度要求很高时,注意保留移位引起的“余数”,做好余数补偿。
这个程序只是一般常用pid算法的基本架构,没有包含输入输出处理部分。
==============================================================================*/
#include <string.h>
#include <stdio.h>
/*===============================================================================
PID Function
The PID function is used in mainly
control applications. PID Calc performs one iteration of the PID
algorithm.
While the PID function works, main is just a mmy program showing
a typical usage.
PID功能
在PID功能主要用于控制应用。 PID 计算器执行一个PID的迭代算法。虽然PID功能的工程,
主要只是一个虚拟程序显示一个典型的使用。
================================================================================*/
typedef struct PID {
double SetPoint; // 设定目标 Desired Value
double Proportion; // 比例常数 Proportional Const
double Integral; // 积分常数 Integral Const
double Derivative; // 微分常数 Derivative Const
double LastError; // Error[-1]
double PrevError; // Error[-2]
double SumError; // Sums of Errors
} PID;
/*================================ PID计算部分===============================*/
double PIDCalc( PID *pp, double NextPoint )
{
double dError, Error;
Error = pp->SetPoint - NextPoint; // 偏差
pp->SumError += Error; // 积分
dError = pp->LastError - pp->PrevError; // 当前微分
pp->PrevError = pp->LastError;
pp->LastError = Error;
return (pp->Proportion * Error // 比例项
+ pp->Integral * pp->SumError // 积分项
+ pp->Derivative * dError // 微分项
);
}
/*======================= 初始化的PID结构 Initialize PID Structure===========================*/
void PIDInit (PID *pp)
{
memset ( pp,0,sizeof(PID));
}
/*======================= 主程序 Main Program=======================================*/
double sensor (void) // 虚拟传感器功能 Dummy Sensor Function{ return 100.0;}
void actuator(double rDelta) // 虚拟驱动器功能 Dummy Actuator Function{}
void main(void)
{
PID sPID; // PID控制结构 PID Control Structure
double rOut; // PID响应(输出) PID Response (Output)
double rIn; // PID反馈(输入) PID Feedback (Input)
PIDInit ( &sPID ); // 初始化结构 Initialize Structure
sPID.Proportion = 0.5; // 设置PID系数 Set PID Coefficients
sPID.Integral = 0.5;
sPID.Derivative = 0.0;
sPID.SetPoint = 100.0; // 设置PID设定 Set PID Setpoint
for (;;)
{ // 模拟最多的PID处理 Mock Up of PID Processing
rIn = sensor (); // 读取输入 Read Input
rOut = PIDCalc ( &sPID,rIn ); // 执行的PID迭代 Perform PID Interation
actuator ( rOut ); // 所需的更改的影响 Effect Needed Changes
}
10. 刚接触PID指令,现在有一程序通过PID指令控制固态继电器实现加热过程,程序这步看不懂,为什么要用
这是一个转换程序,将PID的输出值转换为加热时间。其原理是在设置的时间段内(k2000),当PIDl输出值>计数值时,输出加热。不同的PID输出值对应不同的加热时间与不加热的时间。当PID输出为0时,不加热。50%时加热与停止各一半的时间。这个数值的确定要根据系统的热惯性来确定。并且要根据全部的程序才能准确的分析。