|
电路原理图如下:
1 整机设计
1.1 设计要求
1.1.1设计任务
以实验室的过程对象为控制对象,设计控制系统,完成单容液位的定值控制。要求能够显示当前液位。
1.1.2性能指标要求
(1)设计制作系统硬件电路
(2)实现控制、信号检测(显示)及调节器控制规律;
(3)参数整定,使系统能够快速克服扰动作用;
(4)其他功能。
1.2 整机实现的基本原理及框图
1.2.1基本原理
测量变送器为压力式液位变送器,输出信号为0~10V电压,执行器采用电动调节阀,接收0~10V信号。设计调节器(模拟或数字式),能够根据用户设定,将液位控制在要求值(采用双位控制,PID或PI控制规律)。
具体请下载观看吧,有说明。
单片机源程序如下:
- #include "stc15.h"
- #include<TM1638.h>
- #include<delay.h>
- #include<KeyPro.h>
- #include<STC15_AD.h>
- #include<STC15_pca_pwm.h>
- //定时器初始化
- void T0_init(void)
- {
- TMOD=0x01;
- TH0=(0-1000)/256;
- TL0=(0-1000)%256;
- TR0=1;
- ET0=1;
- EA=1;
- }
- unsigned char u;
- unsigned char BI_POSCTR(void) //双位控制
- {
- if(Para_V[1]<Para_V[2]-2) //当前值<设定值-2
- {
- u = 200; //开200,最大可到255
- }
- else if(Para_V[1]>Para_V[2]+2)
- {
- u = 0;
- }
- else
- u=100; //保持开度为100
- return u;
- }
- float kp,ki,kd;
- int ek,ek_1,ek_2;
- int uk,uk_1;
- unsigned char PID(void)
- {
- kp=(float)Para_V[3]/10;
- ki=(float)Para_V[4]/10;
- kd=(float)Para_V[5]/10;
- ek_2=ek_1;
- ek_1=ek;
- ek=(int)Para_V[2]-(int)Para_V[1];
- uk_1=uk;
- uk=uk_1+kp*(ek-ek_1)+ki*ek+kd*(ek-2*ek_1-ek_2); //增量型PID公式
- if(uk>255) uk=255; //限制溢出
- if(uk<0) uk=0;
- return (unsigned char)uk;
- }
- unsigned int OneusCNT=0;
- unsigned int Ones=0;
- unsigned char x=1;
- unsigned char s=1;
- unsigned char key_value;
- float H=0;
- float num=0;
- void main()
- {
- P2M0=0;
- P2M1=0;
- PWM_Init();
- InitADC();
- T0_init();
- delay_ms(10);
- delay(10);
- while(1)
- {
- key_value=Read_key();
- if(key_value!=0)
- {
- KeyPro(key_value-1);
- Cur_V[0]=Para_V[2]; //显示区域读取设定值
- while(key_value==Read_key()); //按一次限制只执行一次
- }
- if(Para_V[0]==0&&x) //对象为0且采样时间到,运行
- {
- SetPWM0(0);
- x=0; //初始化时间
- Para_V[1]=Cur_V[2]=GetADCResult(0);//读取adc
- switch(Para_V[6]) //控制方式选择
- {
- case 0:
- SetPWM1(Para_V[7]);
- break;
- case 1:
- BI_POSCTR();
- SetPWM1(u);
- break;
- case 2:
- PID();
- SetPWM1(uk);
- break;
- default: break;
- }
- }
- if(Para_V[0]==1&&s) //同上
- {
- SetPWM1(0);
- s=0;
- num=(float)GetADCResult(6);//获取adc
- H=1314*num-428; //转化成测量值,
- Para_V[1]=Cur_V[1]=(unsigned int)(H*10);
- switch(Para_V[6])
- {
- case 0:
- SetPWM0((unsigned char)Para_V[7]);
- break;
- case 1:
- BI_POSCTR();
- SetPWM0(u);
- break;
- case 2:
- PID();
- SetPWM0(uk);
- break;
- }
- }
- if(Setting) //显示
- Display(ptPra,Para_V[ptPra],11,SetV);
- else
- Display(ptPra,Para_V[ptPra],ptCur,Cur_V[ptCur]);
- }
- }
- void T0_IRQ() interrupt 1//采样时间
- {
- TH0=(0-1000)/256;
- TL0=(0-1000)%256;
- OneusCNT++;
- Ones++;
- if(OneusCNT>=50)
- {
- x=1;
- OneusCNT=0;
- }
- if(Ones>=300)
- {
- s=1;
- Ones=0;
- }
- }
复制代码
所有资料51hei提供下载:
水位控制双位+PID.7z
(1.17 MB, 下载次数: 67)
|
评分
-
查看全部评分
|