找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 3610|回复: 1
打印 上一主题 下一主题
收起左侧

单片机水位控制双位+PID源程序+电路图

[复制链接]
跳转到指定楼层
楼主
电路原理图如下:



1  整机设计
1.1 设计要求
1.1.1设计任务
以实验室的过程对象为控制对象,设计控制系统,完成单容液位的定值控制。要求能够显示当前液位。
1.1.2性能指标要求
(1)设计制作系统硬件电路                                                                          
(2)实现控制、信号检测(显示)及调节器控制规律;                                 
(3)参数整定,使系统能够快速克服扰动作用;                                            
(4)其他功能。                     
1.2 整机实现的基本原理及框图
1.2.1基本原理
测量变送器为压力式液位变送器,输出信号为0~10V电压,执行器采用电动调节阀,接收0~10V信号。设计调节器(模拟或数字式),能够根据用户设定,将液位控制在要求值(采用双位控制,PID或PI控制规律)。

具体请下载观看吧,有说明。

单片机源程序如下:
  1. #include "stc15.h"
  2. #include<TM1638.h>
  3. #include<delay.h>
  4. #include<KeyPro.h>
  5. #include<STC15_AD.h>
  6. #include<STC15_pca_pwm.h>

  7. //定时器初始化
  8. void T0_init(void)                  
  9. {
  10.         TMOD=0x01;
  11.         TH0=(0-1000)/256;
  12.         TL0=(0-1000)%256;
  13.         TR0=1;
  14.         ET0=1;
  15.         EA=1;
  16. }
  17. unsigned char u;
  18. unsigned char BI_POSCTR(void)  //双位控制
  19. {
  20.         if(Para_V[1]<Para_V[2]-2) //当前值<设定值-2
  21.           {
  22.            u = 200;                 //开200,最大可到255
  23.           }
  24.         else if(Para_V[1]>Para_V[2]+2)
  25.           {
  26.            u = 0;
  27.           }
  28.          else
  29.                  u=100;                        //保持开度为100
  30.          return u;
  31. }

  32. float kp,ki,kd;
  33. int ek,ek_1,ek_2;
  34. int uk,uk_1;
  35. unsigned char PID(void)
  36. {
  37.    kp=(float)Para_V[3]/10;
  38.    ki=(float)Para_V[4]/10;
  39.    kd=(float)Para_V[5]/10;
  40.    ek_2=ek_1;
  41.    ek_1=ek;
  42.    ek=(int)Para_V[2]-(int)Para_V[1];
  43.    uk_1=uk;
  44.    uk=uk_1+kp*(ek-ek_1)+ki*ek+kd*(ek-2*ek_1-ek_2);        //增量型PID公式
  45.         if(uk>255) uk=255;        //限制溢出
  46.         if(uk<0) uk=0;
  47.    return (unsigned char)uk;
  48. }

  49. unsigned int OneusCNT=0;
  50. unsigned int Ones=0;
  51. unsigned char x=1;
  52. unsigned char s=1;
  53. unsigned char key_value;
  54. float H=0;
  55. float num=0;
  56. void main()
  57. {       
  58.         P2M0=0;
  59.         P2M1=0;       
  60.         PWM_Init();
  61.         InitADC();
  62.         T0_init();
  63.         delay_ms(10);
  64.         delay(10);
  65.    while(1)
  66.    {
  67.         key_value=Read_key();
  68.         if(key_value!=0)
  69.         {
  70.         KeyPro(key_value-1);
  71.         Cur_V[0]=Para_V[2];                 //显示区域读取设定值
  72.         while(key_value==Read_key()); //按一次限制只执行一次
  73.         }

  74.            if(Para_V[0]==0&&x)          //对象为0且采样时间到,运行
  75.         {
  76.           SetPWM0(0);
  77.           x=0;           //初始化时间
  78.       Para_V[1]=Cur_V[2]=GetADCResult(0);//读取adc

  79.           switch(Para_V[6])                //控制方式选择
  80.           {
  81.                   case 0:
  82.                           SetPWM1(Para_V[7]);
  83.                          break;
  84.                 case 1:
  85.                          BI_POSCTR();
  86.                          SetPWM1(u);
  87.                          break;                                  
  88.                 case 2:
  89.                         PID();
  90.                         SetPWM1(uk);
  91.                         break;

  92.                 default:  break;
  93.           }
  94.         }
  95.         if(Para_V[0]==1&&s)         //同上
  96.         {
  97.           SetPWM1(0);
  98.           s=0;
  99.           num=(float)GetADCResult(6);//获取adc
  100.                 H=1314*num-428; //转化成测量值,
  101.       Para_V[1]=Cur_V[1]=(unsigned int)(H*10);
  102.           switch(Para_V[6])
  103.           {
  104.                   case 0:
  105.                           SetPWM0((unsigned char)Para_V[7]);
  106.                          break;
  107.                 case 1:
  108.                          BI_POSCTR();
  109.                          SetPWM0(u);
  110.                          break;                                  
  111.                 case 2:
  112.                         PID();
  113.                         SetPWM0(uk);
  114.                         break;
  115.           }
  116.         }
  117.         if(Setting)           //显示
  118.                 Display(ptPra,Para_V[ptPra],11,SetV);
  119.         else
  120.                 Display(ptPra,Para_V[ptPra],ptCur,Cur_V[ptCur]);
  121.    }
  122. }

  123. void T0_IRQ() interrupt 1//采样时间
  124. {
  125.         TH0=(0-1000)/256;
  126.         TL0=(0-1000)%256;
  127.         OneusCNT++;
  128.         Ones++;

  129.         if(OneusCNT>=50)
  130.         {
  131.          x=1;
  132.          OneusCNT=0;       
  133.         }
  134.         if(Ones>=300)
  135.         {
  136.          s=1;
  137.          Ones=0;       
  138.         }
  139. }
复制代码

所有资料51hei提供下载:
水位控制双位+PID.7z (1.17 MB, 下载次数: 64)

评分

参与人数 1黑币 +50 收起 理由
admin + 50 共享资料的黑币奖励!

查看全部评分

分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏1 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:668361 发表于 2021-1-20 12:39 | 只看该作者
请问一下前辈,有整套PCB吗
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表