标题:
单片机水位控制双位+PID源程序+电路图
[打印本页]
作者:
luxuana
时间:
2019-7-12 16:09
标题:
单片机水位控制双位+PID源程序+电路图
电路原理图如下:
0.png
(62.11 KB, 下载次数: 62)
下载附件
2019-7-14 01:19 上传
0.png
(282.35 KB, 下载次数: 70)
下载附件
2019-7-14 01:20 上传
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)
2019-7-12 16:06 上传
点击文件名下载附件
程序+硬件+报告
下载积分: 黑币 -5
作者:
制裁
时间:
2021-1-20 12:39
请问一下前辈,有整套PCB吗
欢迎光临 (http://www.51hei.com/bbs/)
Powered by Discuz! X3.1