图二、电路图
5
4 软件设计
在该温度控制系统中,温度信号要经过周期采样、数字滤波、PID运算、输
出等过程 周期采样程序
在计算机内部,执行算法时,需要将外部信号经行离散化处理,需要对外部模拟信号进行周期采样。从理论上讲,采样频率越高,失真频率越小,但从控制器本身而言,大都依靠偏差信号E(K)进行调节器计算。当采样周期T太小时,偏差信号也会过小,此时计算机将会失去调节作用,而采用周期过长又会引起误差,因此采样周期必须综合考虑,一般而言采样周期根据外部信号变化快慢而定,如在该温度控制系统中,水箱温度变化比较缓慢,因此采样时间应该适应大一些。 PID程序
PID调节由比例、积分调节、微分调节三者组成,是技术最成熟、应用最广泛的一种调节方式。PID调节的实质就是根据输入的偏差值,按比例、积分、微分的函数关系进行运算,运算结果用于控制输出。在实际应用中,根据被控对象的特征和控制要求,可灵活的改变PID的结构,取其中一部分环节构成控制规律,如比例调节、比例积分调节、比例积分微分调节等。
6
5 课程设计内容及过程:
5.1 18B20安装过程:
这个安装比较重要,因为这个正反极安反后果就是立马烧掉,不注意的话在后面烧水刚开始时很可能就烧掉了这个元件。并且要讲引脚全部都用胶带缠上,因为安装18B20的管子不是严格密封的,所以必须保证它进水之后不短路。安装这个还是要小心的。
5.2 电路板焊接与调试过程:
这个考验人的焊接技术与信心程度,因为一个点焊错了,电路板都不可能工作。而且要看各个元器件的引脚是否正确。我在焊接电路板的时候犯了一个严重的错误,就是把7805和BAT06两个器件搞混了,自然焊出来没效果,这是在上电之前就发现的。这个拆的过程很辛苦,没有吸锡器,而且拆下来的时候很容易把焊盘弄掉。我就吃了这个亏,所以,做什么事还是要用心,三思而后行。特别是不能嬉笑着去工作(这个错误就是和旁边的同学一边聊天一边焊接出现的),这给我们同以后工作提个醒,否则出了什么生产事故可是要负责的。当然这个焊接下来还是没什么问题的。但是在调试板子的时候就出现问题了。首先是上电之后指示灯不亮。仔细分析下电源电路后发现7805那部分有问题,用万用表测完发现电就没供上来。所以肯定是引脚那里有问题。后来发现是虚焊了第一脚。接上之后,指示灯算是亮了。下来调试LCD液晶显示。调了变阻器后竟然没显示,以为测试程序没少进去,再次烧了一边后还是没显示,还以为是液晶坏了,拔下来插另外板子上能亮。没办法,再查下其他器件引脚电平情况,+5v与接地(开始之前已经查了一边,正常),还是在别人的帮助下找到问题。根源还是在7805----另外一个引脚也虚焊。这个还是浪费了很长时间,在这之后,板子基本正常工作了。但由于7805那里经常出问题,所以每次烧水的时候都是把板子垫起来的。
7
6 程序调试过程:
首先,对测试程序进行了测试,由于是纯比例控制,所以超调很大,震荡很剧烈,印证了所学的知识。刚开始都是一个熟悉调试的过程。一个好的温度控制系统应该和加的水的多少没有关系,但是毕竟对自己几斤几两还是有那么一点认识的,所以自己弄得肯定和加水的多少有关系,因此就刚开始加少量水,再加多量水比较,发现关掉加热后,靠热惯性水的温度还是会上升,并且水少水多温度上升大概是7到10度。而且占空比0.25是可以保证温度缓速增长的,在温度高于设定值的时候,为了不至于温度降得太快,可以用0.05的占空比保持一下。这些值都是在经过很多次试验后得到的比较理想的值。而且其动态的性还是基本满足要求的。当然这只是试验,毕竟是要控制算法的。
在这过程中,查过很多资料,比如积分分离PID,串级PID史密斯预估器,专家控制,模糊控制等,书到用时方恨少啊,发现自己知识还真是匮乏。当然课本上也有这方面的知识,比如过程控制书,是很好的参考资料。当然也有经典的PID,形式如下:
当然由于此次为温度采样,必须进行离散化,积分写成和的形式,微分写成差分形式。虽然经典PID现在在很多领域都有很大用处,但参数也不是那么好调,所以大家选择更好效果的积分分离PID:
积分分离即是在高于某个设定值时才加入积分,之前用常规PID,这样做的好处是上升时间快,稳态误差小等。并且从工程控制书上得知,在加入积分的时刻,适当的减小比例作用,会得到较好的结果。
而由于我之前大量烧水总结的经验,并且自己开始用的也不是经典PID,所以,就分了两个模式,水多和水少,因为热惯性使其上升温度不一样,所以分水多水少模式,通过占空比的改变就可以基本上控制。当前值与设定值差值在10度以外全速加热,十度以内改变占空比,水少的时候占空比0.25就可以保证其上升到设定值,水多的时候把十度又分文两个阶段,误差2到10度,占空比0.55,误差0到2度,占空比5,这样可以保证水温一定能上升上去。超过设定值占空比改为0.05保持。这些占空比的改变都是建立在多次的试验上面的。 6.1 程序清单 控制程序如下:
int PIDCalc1(int NextPoint) { int i; Error = SetPoint - NextPoint; if(Error>100) i=1; else if(Error<0) i=2;
8
else if(20 // 偏差 switch(i) { case 1: return 20; break; case 2: return 1; break; case 3: return 11; break; case 4: return 5; break; } } int PIDCalc2(int NextPoint) { int i; Error = SetPoint - NextPoint; if(Error>100) i=1; else if(Error<0) i=2; else if(0 { case 1: return 20; break; case 2: return 1; break; case 3: return 5; break; } } 这样上电后通过键盘来切换模式: while(1) { num=keyscan(); fl=num; if(fl>0) break; } 按下相应的键,切换成相应的模式烧水。效果基本满足要求。这是第一个。 第二个是个积分分离的程序: int PIDCalc(int NextPoint) 9