- 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
《微机化仪器综合设计与实践》
实验指导书
李扬 周琦
广东工业大学机电工程学院
2015 6月印刷
目录
实验六 基于PID算法的可控硅水温自动调节系统设计
一、实验目的和要求
1.掌握虚拟仪器高级语言Lab VIEW 或Lab Windows/CVI 的流程图和软仪器
面板的编程设计方法,熟悉数据处理模块、信号分析模块、仪器控制模
块等各种软件模块的应用。
2.掌握数据采集硬件的低层驱动程序(C 语言/汇编语言)设计、调试及
嵌入Lab VIEW 的技术。
3.学习基于PID的比例积分微分程序编写方法。
4.了解可控硅的的温度控制特点和原理。
5.熟悉CB-68LP接线端子板各接口,利用CB-68LP端子板和PCI-6023E数据采集卡进行模拟量和数字量的转换及相关数据采集。
二、实验主要仪器设备和材料
(1)装有lab windows/CVI 软件PC 一台
(2)PC-DAQ/PCI 卡
(3)CB-68LP端子板
(4)变送器(型号 SBWZ-2460)
(5)可控硅
(6)热电偶
三、实验内容和要求
1、实验内容
1)、对水温进行数据采样:先把水温加热至某个温度值(100℃左右,利用万能表测试相应引脚的输出电压,温度每下降1 摄氏度,就马上记录输出电压值。
2)、对采样数据进行处理:通过观察可知,电压与温度不成线性关系,
是一条曲线,因此,本设计采用分段直线拟合。得出电压与温度的对应
关系。
3)、用户界面设计:用Lab windows/CVI 软件进行用户界面开发,并进行
编程。具体程序见后面。
4)、进行调试:把PC 和其他设备连接好,测试程序,设置PID 参数,观
察控制效果,确立PID 参数。
5)、重新对数据采样:开始采样时,因为温度和电压值都不断发生变化,
而温度计显示变化相对于电压变化有一定的滞后,造成微机上温度显示
数值比温度计发生一定量的偏移,造成较大误差。因此,此次采样利用
刚开发的程序控制炉温恒定,观察电压变化范围,记录多个电压值,求
其平均值。但只需要对部分温度采样就可以了,因为这里采用线段拟合
成曲线,只需要线段的端点数据就可。
6)、重新调试程序,并完善用户界面。
2、程序如下:
#include ansi_c.h
#include easyio.h
#include analysis.h
#include cvirte.h
#include userint.h
#include PID.h
Static int panelHandle;
Static double Wave [1024];
Static double Temp [1024];
Static double A;
Static double F;
Static double Ph, VOL, GG;
Static double AM;
Static double PGAIN;
Static double IGAIN;
Static double DGAIN;
Static double LASTERR;
Static double TEMP;
Static double integral, TEMPUP, PIDPWM;
Static double TE=0;
Static unsigned long AOtaskID;
Static double ERR, FERROR, PT;
PID_PWM() // PID 算法定义
{Double ERR;
Double PT, DT, RESULT, FERROR;
ERR=TEMP-AM;
If (abs (ERR)0.01)
{FERROR=ERR;
PT=PGAIN * FERROR;
If (PT100||PT-100)
{Integral=0.0;
}
Else
{Integral+=IGAIN*FERROR;
If (integral100.00)
{Integral=100.0;
}
Else if (integral0.0)
{Integral=0.0 ;}
}
DT= (ERR-LASTERR)*DGAIN;
RESULT=PT+integral+DT;
}
Else RESULT=integral=PGAIN+IGAIN;
LASTERR=ERR;
Return (RESULT);
}
int main (int argc, char *argv[])
{ if (InitCVIRTE (0, argv, 0) == 0)
return -1; /* out of memory */
if ((panelHandle = LoadPanel (0, PID.uir, PANEL)) 0)
return -1;
DisplayPanel (
文档评论(0)