基于PID算法的水箱温度控制系统

2023-05-16

1. 概述
本设计为基于STC89C52单片机的智能水温控制系统,控制对象以500mL陶瓷水箱为容器,并使用PID控制算法来调整水箱中500ml纯净水的温度。水温可以在一定范围内人为设定,并能实现在下限温度到上限温度之间对每个点温度的控制。

主要的功能为:

  • 可以通过键盘自由设定上限温度和下限温度,通过12864液晶显示,显示的最小区分为1度
  • 可以通过DS18B20温度传感器测量水温并通过12864液晶显示水的实际温度,最小区分为0.1度
  • 系统应具有在水温下限到水温上限全量程内的加热功能(当水温低于水温下限时开始加热,水温低于水温上限时自动断电停止加热)
  • 使用PID控制算法,调节温度
  • 存储设定的参数到EEEPROM中,并记录升温曲线(程序中使用DS1302,精确设定时间间隔,使用EEPROM记录升温曲线)
  • 可以记录3组参数以及对应的3组升温曲线(每组250个温度数据)

2.硬件设计
本次设计的硬件电路是由STC89C52 单片机为控制核心,通过DS18B20温度传感器采集的温度,传送给单片机进行PID计算,将结果作为PWM的占空比来驱动加热棒;同时,通过LCD12864显示屏、按键和DS1302时钟芯片,可实现温度值的显示和目标温度的设置。整体硬件框图如图所示:
在这里插入图片描述
(1)12V转5V稳压电路
由于系统的供电电源采用了4节18650锂电池供电,需要使用LM2596-ADJ芯片进行稳压,转换成12V电压,作为加热棒的加热电源,并通过LM7805-5.0稳压芯片转换为5V电压,作为单片机和其他功能电路的工作电压。稳压芯片的电路可根据芯片技术手册中的参考电路来搭建,其电路图如图:
在这里插入图片描述
(2)按键电路
本次设置了4个控制按键,分别为设置键、增加键、减少键和OK键,通过这四个按键,可以根据用户的需求来调整相应的参数。
在这里插入图片描述
(3)DS1302时钟电路
DS1302时钟电路可以为系统提供实时年、月、日、星期、时、分、秒。
在这里插入图片描述
(4)加热控制电路
加热电路主要三极管及功率MOS管搭建而成的,3个三极管为MOS管的提供可靠的控制电平。如图所示,当单片机引脚为高电平时,三极管T3导通,T2导通,T1截止,从而MOS管的G极接地,MOS管截止;相反,当单片机引脚为低电平时,三极管T3截止,T2截止,T1导通,从而MOS管的G极接电源,MOS管导通,加热棒加热。
在这里插入图片描述
其他都相对简单,就不一一解释了。
(5)总体硬件电路图
在这里插入图片描述
3. 软件设计
系统软件所需实现的功能主要为:

  • 按键输入与设置
  • 显示屏界面显示
  • PID算法调节
  • 时钟读取及显示

(1)按键输入与设置

//*按键处理函数 KEY_Scan
uint8 KEY_Scan(uint8 mode)
{
		static uint8 key_up = 1; //按键松开的标志
		Button0 = 1;
		Button1 = 1;
		Button2 = 1;
		Button3 = 1;
		if(mode == 1)
		{
			key_up = 1;
		}
		if(key_up&&(Button0 == 0||Button1 == 0||Button2==0||Button3 == 0)) 		//第一次读取按键的状态
		{
				Delay1ms(3);																//延时10MS,去抖动 
				if(key_up&&(Button0 == 0||Button1 == 0||Button2==0||Button3 == 0))//有按键按下 
				{
					key_up = 0;													//按键按下的标志
					if(Button0 == 0) 			return Button0_value;			//按键0按下
					else if(Button1 == 0)		return Button1_value;			//按键1按下
					else if(Button2 == 0)		return Button2_value;			//按键2按下
					else if(Button3 == 0)		return Button3_value;			//按键2按下
				}
		}
		else if(Button0==1&&Button1==1&&Button2==1&&Button3==1)
		{
				key_up = 1;			//按键松开的标志
		}
		return 0;
}

/*******************************************************************************
* 函 数 名         : Exint0
* 函数功能		   : 外部中断0中断服务函数
* 输    入         : 无
* 输    出         : 无	   
*******************************************************************************/
void Exint0 (void) interrupt 0					//外部中断0中断服务程序
{
	if(KEY_Scan(1) == Button0_value)			//按键0按下
	{
		LCD_cursor++;							//移动光标
	}
	if(LCD_cursor >= 9)
    {
      LCD_cursor = 0;
    }
	if(KEY_Scan(1) == Button1_value)  
	{
		(*Adjustable_Value[LCD_cursor]) ++;		   //光标对应的数++
		//对应数据的限制
		if(Low_temp >= High_temp - 1)	 Low_temp = High_temp-1;
		if(Set_temp>=High_temp)          Set_temp = High_temp;
		if(Read_add>3)					 Read_add =  1;
		if(Write_add>3)					 Write_add = 1;		
	}
	if(KEY_Scan(1) == Button2_value)  
	{
		(*Adjustable_Value[LCD_cursor]) --;		  //光标对应的数--
		//对应数据的限制
		if(High_temp <= Low_temp + 1)	 High_temp = Low_temp+1;
		if(Set_temp<=Low_temp)           Set_temp = Low_temp;
		if(Write_add<1)					 Write_add = 3;
		if(Read_add <1)					 Read_add  = 3;
	}
	if(LCD_cursor == 0)
	{
		if(KEY_Scan(1) == Button3_value)   
		{
			 start_warm_flag = 1;
			 if(temp_save_flag == 1)
			 {
			 	start_time=readtime[12]*10+readtime[13];		//记录开始时间
				start_time = start_time%temp_cycle - 1;
			 }
		}
			
	}
	if(LCD_cursor == 1)
	{
		if(KEY_Scan(1) == Button3_value)   
		{
			 start_warm_flag = 0;
			 temp_save_flag  = 0;
			 
		}	
	}
	if(LCD_cursor == 3)						    //光标指向横坐标所在数据时
	{
		if(KEY_Scan(1) == Button3_value)   
		{
			 temp_read_flag = 0;
		}	
	}
	if(LCD_cursor == 7)						  	//光标指向读数据位置时
	{
		if(KEY_Scan(1) == Button3_value)		//读按键按下
		{
			
			Read_EEPROM_Word(Adjustable_Value,Read_add);
			Read_add = 	Write_add;
			LCD12864_WriteCmd(0x01);			//清屏
			temp_save_flag = 0; 				//温度保存标志 
			temp_read_flag = 1;					//阅读温度的标志
		}	
	}
	else if(LCD_cursor == 8)				  	//光标指向写数据位置时
	{
		if(KEY_Scan(1) == Button3_value)	  	//写按键按下
		{
			time = 0;						  	//温度从零地址开始写
			Write_Word_EEPROM(Adjustable_Value,Write_add);	
			temp_save_flag = 1;	
			temp_read_flag = 0;   							//温度保存标志 
			LCD12864_WriteCmd(0x01);			  			//清屏
		}
		Clear_flag = 1;							  			//清屏标志
	}
	if(LCD_cursor == 0 && Clear_flag == 1)		  			//光标循环一圈时,清屏
	{
		LCD12864_WriteCmd(0x01);
		Clear_flag = 0;	
	}	
}

(2)PID算法调节

int16 Proportion	= 64;	// 比例常数 Proportional Const   
int16 Integral  	= 0;	// 积分常数 Integral Const   
int16 Derivative	= 54;	// 微分常数 Derivative Const   
float LastError;			// Error[-1]   
float PrevError;			// Error[-2]   
float SumError;	  		// Sums of Errors
 
float Now_temp;
float Target_temp;
float Temp_Out;

float PID_Calc(float NextPoint ,float SetPoint)
{
	float D_Error,Error;
	float II;
	Error = SetPoint-NextPoint;			//偏差
	SumError+=Error;					// 积分
	D_Error =LastError-PrevError;		// 当前微分
	PrevError =  LastError;
	LastError =  Error;
	II = Integral*SumError/10000.0;		//积分缩小10000倍
	if(II>30)			 //积分饱和限制
	{
		II=30;	
	}
	return (Proportion*Error+II+Derivative*D_Error);
}

void Control_Temp(void)
{
	Now_temp = Temp_numbe;
	Target_temp =  Set_temp;
	if(Now_temp>High_temp)
	{
		PWM_duty = 0;	
	}
	else
	{
		Temp_Out = PID_Calc(Now_temp,Target_temp);	
		if(Temp_Out >= 100) 	Temp_Out = 100;
		else if(Temp_Out <=0)	Temp_Out = 0;
		//不同的温度设置不同的比例补偿热量损失
		//Temp_Out = Temp_Out+Target_temp/80.0*20; 		
		PWM_duty = (int)Temp_Out;
	}
}

(3)主函数

void main(void)
{
	int16 temp;             //温度缓存值
	System_Init();			//系统初始化
	while (1)
	{
		LED2 = 0;
		Ds1302_time();
		real_time = readtime[12]*10+readtime[13];			//从1302中读取秒值
		real_time = real_time%temp_cycle;	
		Temp_numbe = Temp_collect();   						//采集温度
		if(temp_save_flag == 1 && start_warm_flag == 1)								//按下了存储按键
		{
			if((real_time == start_time)&&(real_time- last_real_time!=0)) //每隔10S记录一次时间
			{
				temp = (int16)(Temp_numbe*100+0.5);			//将温度值增大100倍,保留两位小数
				Write_DATA_EEPROM(temp,Write_add,time);		//将温度写入EEPROM中保存
				time++;
				if(time >= 250)								//最多记录250组的值
				{
					time = 250;
				}
			}
		
		}
		last_real_time = real_time;
		if(start_warm_flag == 1)
		{
			Control_Temp();    								//温度控制函数
		}
		else
		{
			PWM_duty = 0;
		}
		//上限报警
		if(Temp_numbe > High_temp)  LED0 = 0;		
		else LED0 = 1;
		//下限报警
		if(Temp_numbe < Low_temp) LED1 = 0;
		else   LED1 = 1;
		Init_LCD12864_Set();								//LCD12864液晶显示数据的标识
		LCD12864_Show_DATA();							    //LCD12864液晶显示数据
		UART_Send_temp();									//将采集温度并通过串口发送到上位机
		//Uart_Send_time();									//将DS1302的时间发送给电脑
		UART_Send_PWM();									//将控制加热棒的PEM占空比实时发送监控
		UART_SendData('\n');
		
	}			
}

详细完整的程序,可下载源码。

源码+AD原理图 下载:关注公众号,首页回复“PID水温控制”获取资料
在这里插入图片描述

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

基于PID算法的水箱温度控制系统 的相关文章

  • 数模转换器ADC0832使用原理及控制程序

    一 xff0e 简介 数模转换器一般分为两种 xff0c 一种为数字信号转模拟信号 xff0c xff0c 其控制器简称为DAC xff1b 另一种为模拟信号转数字信号 xff0c 其控制器简称为ADC 现在主要介绍一款很常用 入门级的AD
  • GY-30光强传感器模块的应用原理及控制程序

    1 模块介绍 GY 30模块是一款基于IIC通信的16bit的数字型传感器 模块主要是以BH1750数字型光强感应芯片为核心及一些外围驱动电路 模块整体电路如图 xff1a 其中C1 C2 为电源滤波电容 xff0c R1 R3 为 I2C
  • LED数码管结构与工作原理

    一 xff0e 什么是数码管 LED数码管 xff08 LED Segment Displays xff09 是由8个发光二极管构成 xff0c 并按照一定的图形及排列封转在一起的显示器件 其中7个LED构成7笔字形 xff0c 1个LED
  • AD在PCB设计中导入LOGO

    在设计电路板有时需要将个人或公司的LOGO印在电路板上 xff0c 所以Altium Designer软件也提供了一个导入LOGO图案的插件 LOGO CREATOR 1 制作LOGO 因为印在电路板只能印出单色图案 xff0c 所以先得将
  • 详解LCD12864显示屏的使用(并行控制)

    一 xff0e 概述 LCD12864显示屏是所说的点阵液晶显示模块 xff0c 就是由12864个液晶显示点组成的一个128列64行的阵列 xff0c 所以也就叫成了12864 每个显示点都对应着有一位二进制数 xff0c 0表示灭 xf
  • DS18B20温度传感器-51单片机控制程序

    一 xff0e 概述 DS18B20数字温度传感器提供9 Bit到12 Bit的摄氏温度测量精度和一个用户可编程的非易失性且具有过温和低温触发报警的报警功能 DS18B20采用的1 Wire通信即仅采用一个数据线 xff08 以及地 xff
  • 详解数据存储芯片AT24C02的应用及编程

    一 xff0e 芯片简介 AT24C02是一个2K位串行CMOS E2PROM xff0c 内部含有256个8位字节 xff0c 采用先进CMOS技术实质上减少了器件的功耗 AT24C02有一个8字节页写缓冲器 xff0c 该器件通过IIC
  • 谈谈单片机的最小运行环境--最小系统

    单片机的最小系统就是让单片机能正常工作并发挥其功能时所必须的组成部分 xff0c 也可理解为单片机正常运行的最小环境 其主要构成为四部分 xff1a 1 单片机芯片 2 系统电源 3 时钟电路 4 复位电路 这四个部分不可缺少 xff0c
  • 详解温度传感器DS18B20编程与使用

    DS18B20是由DALLAS半导体公司推出的一种的 一线总线 接口的温度传感器 与传统的热敏电阻等测温元件相比 xff0c 它是一种新型的体积小 适用电压宽 与微处理器接口简单的数字化温度传感器 1 测量温度范围 55 43 125 2
  • AD10 如何将焊盘的实心改为十字型覆铜

    焊盘实心覆铜虽然有利于电流的传输 但由于焊盘周围都覆上铜皮 对焊锡有粘附作用 不利于元器件拆除 对往后板卡调试造成不便 所以焊盘在覆铜的时候建议采用十字型覆铜 xff0c 过孔采用实心覆铜 接下来就讲解一下AD10如何设置焊盘十字覆铜 xf
  • 相机参数标定(camera calibration)及标定结果如何使用

    重要更新 xff1a 本文的第二次更新已发布 为了不破坏现有内容的结构 xff0c 故重新开始新的一篇文章 同时本文的一些内容也会涵盖进去 欢迎关注 第二更 xff0c 相机参数标定基础 xff1a 从小孔成像开始到单双目标定 关于实践部分
  • 基于51单片机的LCD1602电子时钟

    摘要 xff1a 51系列单片机是各单片机中最为典型和最有代表性的一种 由RAM ROM CPU构成 xff0c 定时 xff0c 计数和多种接口于一体的微控制器 本次设计的数字电子时钟采用了STC89C52芯片进行控制 xff0c 使用D
  • 基于51单片机的简易密码锁

    一个基于51单片机的简易密码锁 xff0c 废话不多说 xff0c 直接贴图贴代码 1 电路图 电路组成 xff1a 5V电源 43 51单片机最小系统 43 LCD1602显示屏 43 4 4矩阵键盘 2 程序分析 xff08 1 xff
  • 浅谈Android与Linux系统的差异

    最近忙于查找Linux和android平台的资料 xff0c 今天将其整理整理 xff0c 根据本人拙见分享给大家 Android和Linux作为现行主流的操作系统 xff0c 无论在消费类产品还是在工控领域 xff0c 都有广泛的应用 都
  • 基于51单片机的超声波测距

    1 超声波测距原理 超声波是利用反射的原理测量距离的 xff0c 被测距离一端为超声波传感器 xff0c 另一端必须有能反射超声波的物体 测量距离时 xff0c 将超声波传感器对准反射物发射超声波 xff0c 并开始计时 xff0c 超声波
  • 超细!详解AD13:如何从零开始画出一个PCB(电路板)

    在学电子或者单片机的小伙伴们或许有过这种念头 xff0c 就是想把自己的设计的电路或者单片机系统做成一个电路板出来 xff1b 但却不知怎样做出来 今天我就给大家详细讲解如果通过AD13电路设计软件设计出一个电路板 1 首先打开AD13 x
  • 基于51单片机液晶万年历设计

    电子万年历是一种非常广泛日常计时工具 xff0c 给人们的带来了很大的方便 xff0c 在社会上越来越流行 它可以对年 月 日 时 分 秒进行计时 xff0c 采用直观的数字显示 xff0c 可以同时显示年月日时分秒和温度等信息 xff0c
  • 基于51单片机的简易计算器

    1 简介 本计算器是以MCS 51系列AT89C51单片机为核心构成的简易计算器系统 该系统通过单片机控制 xff0c 实现对4 4键盘扫描进行实时的按键检测 xff0c 并由LCD1602显示屏将过程与结果显示出来 2 硬件原理图 硬件主
  • 基于51单片机的红外解码器

    1 简介 本红外解码器是以MCS 51系列AT89C512片机为核心 xff0c 将红外传感器接收的信号解析出来 xff0c LCD1602显示屏将解码数据显示出来 2 总体原理图 硬件组成 单片机最小系统LCD1602显示屏IR红外接收器
  • 基于51单片机的心率脉搏计检测系统

    1 功能原理 脉搏传感器采样脉搏信号 xff0c 采用STC89C51单片机作为控制器 xff0c 脉搏传感器输出方波传入单片机 xff0c 触发单片机进去外部中断函数 xff0c 每接收一个脉冲波形 xff0c 显示屏就计数一次 如果脉搏

随机推荐

  • 基于51单片机的智能调光台灯

    1 功能介绍 智能台灯可分成自动和手动两种模式 在自动模式下 xff0c 台灯能根据环境光的亮暗与人是否被台灯所检测到 xff08 人是否在 xff09 来自动开启台灯 当人被微机检测到 xff0c 环境光又达到某个程度的时候 xff08
  • app元素辅助定位三种方式:Appium-Inspector、uiautomatorviewer、Weditor(uiautomator2)

    xff08 1 xff09 使用Appium Desktop中Appium Inspector辅助进行元素定位 早期版本集成在Appium Desktop中 xff0c 最新版本已分开 下载地址 xff1a Releases appium
  • 俄罗斯方块游戏的算法

    1 原理 这个游戏设计 xff0c 本质上就是用一个线程或者定时器产生重绘事件 用线程和用户输入改变游戏状态 这个游戏也不例外 xff0c 启动游戏后 xff0c 就立即生成一个重绘线程 xff0c 该线程每隔50ms绘制一次屏幕 当然 x
  • 基于51单片机的俄罗斯方块游戏

    俄罗斯方块游戏算法 请参考俄罗斯方块游戏的算法 1 概述 俄罗斯方块是一款风靡全球的益智游戏 它规则简单 xff0c 容易上手 xff0c 且游戏过程变化无穷 xff0c 使用户在游戏中得到乐趣 本设计是采用单片机来实现的智能俄罗斯方块游戏
  • 基于51单片机的智能温控风扇

    1 功能 本设计为一种温控风扇系统 xff0c 具有灵敏的温度感测和显示功能 xff0c 系统选用STC89C52单片机作为控制平台对风扇转速进行控制 可在测得温度值在高低温度之间时打开风扇弱风档 xff0c 当温度升高超过所设定的温度时自
  • 基于51单片机的数字频率计

    1 简介 数字频率计是现代科研生产中不可或缺的测量仪器 xff0c 它以十进制数显示被测频率 xff0c 基本功能是测量正弦信号 xff0c 方波信号 xff0c 及其它各种单位时间内变化的物理量 本系统采用AT89C52单片机智能控制 x
  • 基于51单片机的火灾报警器

    1 系统功能 火灾报警器 xff0c 主要检测温度和烟雾 xff0c 再通过单片机控制相应的报警和驱动负载 通过液晶显示当前的烟雾值和温度值 xff0c 通过按键设定相应的阀值 主要包括以下几项功能 xff1a 1 火情探测功能 xff1a
  • 基于51单片机的指纹密码锁

    1 系统功能概述 本次分享的是一款基于51单片机的指纹识别电子密码锁系统 xff0c 该系统以STC89C52单片机作为模块核心 xff0c 通过串口通信控制指纹模块AS608实现录取指纹并存储指纹数据 xff0c 并通过LCD12864液
  • 基于51单片机的智能电子秤

    1 概述 xff08 1 xff09 系统原理 本电子秤系统利用压力传感器采集因压力变化产生的电压信号 xff0c 经过电压放大电路放大 xff0c 然后再经过模数转换器转换为数字信号 xff0c 最后把数字信号送入单片机 单片机经过相应的
  • 基于51单片机的智能垃圾桶

    1 简介 本次主要是利用单片机设计并制作一套智能垃圾箱 要求以单片机为控制核心 xff0c 通过红外传感器检测是否有人扔垃圾 xff0c 并自动打开垃圾箱盖 xff0c 扔完垃圾后再自动关闭 主要内容包括 xff08 1 xff09 红外对
  • gmake: No rule to make target `C:/ti/controlSUITE2_DMC Rev/device_support/f2803x/v122/DSP2803x_h的解决

    注 xff1a 此方法是在CCS8环境下的使用成功的 在使用controlSUITE的例程编译时 xff0c 工程老出现这种错误 xff0c 排查了很久 xff0c 终于找到了原因 xff0c 造成这种原因主要是CCS在安装时没有按照默认的
  • 基于51单片机的数字气压计

    1 概述 本设计是基于MPX4115的数字气压计 xff0c 硬件处理电路为大气压传感器模拟信号的采集 转换 处理和显示 xff0c 并根据相应的软件需求设计控制程序 2 硬件设计 xff08 1 xff09 硬件总体框图 气压计的硬件主要
  • 一站式开源分布式集群云真机测试平台Sonic——基于Docker方式部署sonic前后端(体验版)

    Sonic xff1a 一站式开源分布式集群云真机测试平台 xff0c 致力服务于中小企业的客户端UI测试 xff0c 永久免费 sonic官网 xff1a Sonic 开源云真机测试平台 开源不易 xff0c 请大家多多支持作者 xff0
  • Policy Gradient Algorithms

    Policy Gradient Algorithms 2019 10 02 17 37 47 This blog is from https lilianweng github io lil log 2018 04 08 policy gr
  • 基于51单片机的多功能八路抢答器

    1 功能介绍 多功能八路抢答器是基于51单片机来设计的 xff0c 除了可以实现最基本功能 8路抢答外 xff0c 还具有自动处理犯规选手 xff0c 抢答时间调整 xff0c 还可以进行答题 xff0c 计分 xff0c 并且可以查询或修
  • 基于51单片机的贪吃蛇游戏

    1 简介 本设计为一款贪吃蛇游戏 xff0c 显示器采用8 8点阵 xff0c 主控制器采用51单片机 xff0c 并通过按键实现对游戏的操作 2 贪吃蛇算法介绍 吃蛇游戏算法的实现 xff0c 即如何通过液晶屏显示蛇的移动 其实蛇看似移动
  • 基于51单片机的便携式输液点滴控制报警器

    1 简介 基于单片机输液点滴控制报警器组成 该系统主要由光电传感器检测电路 键盘 数码管显示 报警提示电路 液滴流速监测电路 电机驱动电路等组成 利用光电感器测量出液滴流速 xff0c 并将将信息返回给单片机 xff0c 单片机对流速信号与
  • PCB加工文件—Gerber文件的导出

    当我们使用软件将一个板卡的PCB图纸设计好后 xff0c 想到PCB厂家制作成电路板 简单的 xff0c 你可以把自己的设置PCB文件 PcbDoc 直接发给厂家加工 xff0c 但是有些PCB厂家会要求你提供Gerber文件 但是这个Ge
  • AD13如何导出坐标文件

    在电子行业加工生产大批量的电路板 xff0c 都是利用贴片机进行生产和制造 xff0c 在生产之前 xff0c 我们需要提供PCB的坐标文件给贴片厂家 xff0c 这样厂家才能确定每个元器件应该贴在PCB板上什么位置 所以下面我们就来讲一下
  • 基于PID算法的水箱温度控制系统

    1 概述 本设计为基于STC89C52单片机的智能水温控制系统 xff0c 控制对象以500mL陶瓷水箱为容器 xff0c 并使用PID控制算法来调整水箱中500ml纯净水的温度 水温可以在一定范围内人为设定 xff0c 并能实现在下限温度