㈠ 单片机PID控制问题
首先弄清楚PID是一种控制算法!!!
1,“如果用单片机恒温可以使温度到达预定值就停止加热,低了就加热,用一个温度传感器反馈,这样算是一个自动控制吗”你这是控制系统,但是效果会非常差,尤其是对于温度控制这种大惯性系统,达到预定值就停止加热,但是由于惯性,温度肯定会继续上升,电炉烧水的时候,水开了,断电之后水还要沸腾一定时间的(沸腾是很消耗能量的,由此可见如果是加热的话温度上升更严重,你也可以自己用温度计试试看);“低了就加热”是同样的道理。如果系统对控制精度有要求,你这样做肯定达不到要求。PID是一种控制算法,相对于其他控制算法来说算是最简单的了。PID能够做到在温度快要达到设定值的时候降低加热功率,让温度上升速度变慢,最终稳定在设定值。如果用你的直接控制,温度会在设定值上下振荡,永远不会停在设定值。
2,一般的控制系统都需要加反馈,以构成闭环控制系统,相对的还有开环控制系统。开环控制系统,举个例子,就是你加热的时候事先计算好大约需要多少热量,然后考虑一下环境影响,计算出加热时间,然后控制加热系统按照你这个时间加热。你觉得这样的系统能够稳定工作吗?环境稍稍有变动就挂了!开环控制系统的特点就是很容易受到环境的影响;闭环控制系统就稳定很多,你用1L水可用,2L水也行,500W电能用,1000W电炉也能用,这就是闭环的优点。
因此,大多数的控制系统都是闭环的,开环很少单独使用,即使用到了也是有闭环的。开环其实也是有优点的,开环在控制系统里面叫做前馈(跟反馈对应的),比如你的系统里面电源电压上升了,加热速度肯定会变快,如果你对电源电压采样,将采样的结果输入到闭环里面,对闭环做一个轻微的修正,控制的精度会更好,这就是开环的优势,它是超前的,能够预知结果(根据地源电压提高就能知道需要降低输出功率了)。
说完这些,你应该明白了,反馈是必需的(前馈也可以要,但是不是必需的),PID不能被取代(除非你用其它更复杂的控制算法)。
㈡ 单片机如何写PID程序
具体如下:
1、如果加入D抖动的特别厉害,试试只用PI控制。
2、还有PID参数都是一步一步调出来的,我建议你做个上位机,就是个简单的VB串口程序,用来设置PID参数
3、然后在单片机这边弄个串口接收程序,这里就是个简单的串口程序,人人都会,把接收到的PID存储在缓冲区里。
4、然后单片机程序直接调用。单片机带EEPROM的话,当接收到改变的PID参数时,存储这些参数。去STC官网下你的单片机资料,上面有EEPROM测试程序,直接套用。
㈢ 单片机C语言PID自整定算法
就是一般的排序算法,与查找算法一样,这个的都不会吗floata[3],max=0;for(i=0;i<=2;i++){printf("Pleaseenterthemark:");scanf("%f",&a[i]);if(maxintsort(intnum[5]);voidmain(){intnumm[5],i,a;for(i=0;i<5;i++)scanf("%d",&numm[i]);sort(numm);//调用排序for(i=0;i<5;i++)printf("%d",numm[i]);}intsort(intnum[5]){intm,n,t;for(m=0;m<4;m++)for(n=m+1;n<5;n++)//冒泡排序{if(num[m]
㈣ pic单片机pid控制算法参数整定
我这有51的
#include <stdlib.h>
#include "global_varible.h"
/****************************************************************************
* 模块名: PID
* 描述: PID调节子程序
* 采用PID-PD算法。在偏差绝对值大于△e时,用PD算法,以改善动态品质。
* 当偏差绝对值小于△e时,用PID算法,提高稳定精度。
* PIDout=kp*e(t)+ki*[e(t)+e(t-1)+...+e(1)]+kd*[e(t)-e(t-1)]
*============================================================================
* 入口: 无
* 出口: 无
* 改变: PID_T_Run=加热时间控制
*****************************************************************************/
void PID_Math(void)
{
signed long ee1; //偏差一阶
//signed long ee2; //偏差二阶
signed long d_out; //积分输出
if(!Flag_PID_T_OK)
return;
Flag_PID_T_OK=0;
Temp_Set=3700; //温度控制设定值37.00度
PID_e0 = Temp_Set-Temp_Now; //本次偏差
ee1 = PID_e0-PID_e1; //计算一阶偏差
//ee2 = PID_e0-2*PID_e1+PID_e2; //计算二阶偏差
if(ee1 > 500) //一阶偏差的限制范围
ee1 = 500;
if(ee1 < -500)
ee1 = -500;
PID_e_SUM += PID_e0; //偏差之和
if(PID_e_SUM > 200) //积分最多累计的温差
PID_e_SUM = 200;
if(PID_e_SUM < -200)
PID_e_SUM = -200;
PID_Out = PID_kp*PID_e0+PID_kd*ee1; //计算PID比例和微分输出
if(abs(PID_e0) < 200) //如果温度相差小于1.5度则计入PID积分输出
{
if(abs(PID_e0) > 100) //如果温度相差大于1度时积分累计限制
{
if(PID_e_SUM > 100)
PID_e_SUM = 100;
if(PID_e_SUM < -100)
PID_e_SUM = -100;
}
d_out = PID_ki*PID_e_SUM; //积分输出
if(PID_e0 < -5) //当前温度高于设定温度0.5度时积分累计限制
{
if(PID_e_SUM > 150)
PID_e_SUM = 150;
if(PID_e_SUM > 0) //当前温度高于设定温度0.5度时削弱积分正输出
d_out >>= 1;
}
PID_Out += d_out; //PID比例,积分和微分输出
}
else
PID_e_SUM=0;
PID_Out/=100; //恢复被PID_Out系数放大的倍数
if(PID_Out > 200)
PID_Out=200;
if(PID_Out<0)
PID_Out=0;
if(PID_e0 > 300) //当前温度比设定温度低3度则全速加热
PID_Out=200;
if(PID_e0 < -20) //当前温度高于设定温度0.2度则关闭加热
PID_Out=0;
Hot_T_Run=PID_Out; //加热时间控制输出
PID_e2 = PID_e1; //保存上次偏差
PID_e1 = PID_e0; //保存当前偏差
}
////////////////////////////////////////////////////////////void PID_Math() end.
㈤ 用单片机做PID算法控制问题
1.可以直接套用PID公式,无论增量还是绝对的。PID算法是根据误差来控制的算法,不依赖系统的模型,故不用算系统的传递函数。有的书提到传递函数,一般是用于理论建模仿真,从而直接用Matlab一类的仿真软件进行PID参数调试。得到的参数可以为实际应用提供一定参考价值。
2.PID参数整定有一套原则。首先要了解各个参数的作用。具体的整定方法,随便找本自控原理的书都会提到,我不太记得了,大致是有一个倍数关系。但实际操作,一般不会是用这个数,是需要根据系统的反应,改变各个参数来试的。尽信书不如无书啊~
另外,不同系统的参数肯定不一样。就算同一个系统,稍微有一些改变,可能最好的那组参数就会变化。因此衍生了很多先进PID算法,如神经PID、专家PID、模糊PID等等。