基于单片机的电加热炉智能温度与液位PID控制系统设计

1、基于单片机的电加热炉智能温度与液位PID控制系统设计

点击链接下载protues仿真设计资料:https://download.csdn.net/download/m0_51061483/91939253

2、系统总体概述

2.1 设计背景与工程意义

电加热炉(尤其是导热油电加热炉)在化工、食品、医药、塑料成型、实验室恒温设备以及小型工业加热系统中被广泛使用。导热油作为传热介质,具有可在较高温度下稳定运行、系统压力较低、温度控制范围广等优点,常用于对反应釜、换热器、管道加热等场景。相比蒸汽加热,导热油系统具有温控精度高、热效率高、运行稳定等优势,但同时也存在安全风险:

(1)导热油温度过高会导致油品裂解、结焦甚至引发火灾;

(2)液位过低会导致加热管干烧,造成加热器损坏、系统温度失控;

(3)流量不足会导致局部过热,影响传热效果与设备寿命;

(4)阀门异常或传感器故障可能引起系统工况失稳,带来安全隐患。

因此,基于单片机的智能控制系统能够在低成本条件下实现实时温度、液位和流量采集,并结合PID控制算法对电加热器通断时间(或功率)以及进油阀、出油阀进行闭环控制,实现导热油温度与液位的精确调节,同时通过多重保护与报警机制确保系统安全。

本设计以单片机为核心,构建"温度---液位---流量"多变量监测系统,重点实现:

  • 导热油温度闭环PID控制(以加热器通断或PWM调功实现)
  • 液位闭环控制(进油阀/出油阀控制,带保护逻辑)
  • 流量监测与联锁保护(低流量报警并切断加热)
  • 实时参数显示与报警提示(便于操作与维护)
  • 多重安全保护(过温、低液位、超液位、低流量、传感器异常等)
    从工程角度,该方案可作为小型工业电加热炉控制器原型,亦可用于课程设计、毕业设计或实验平台开发。

2.2 系统功能需求分析

根据题目要求,本系统需要满足以下功能:

(1)采用单片机作为主控芯片,实时接收温度传感器、流量传感器及液位传感器采集信号并进行智能数据处理。

(2)根据传感器反馈,自动控制进油阀与出油阀的开启关闭,并控制电加热器的通断时间,实现导热油温度精准调节。

(3)支持实时参数显示,能够显示导热油温度、液位、流量等关键指标。

(4)具备多重安全保护与报警机制,异常时自动报警并切断电加热炉工作。

(5)控制逻辑合理,在各种工况下稳定高效运行,提高寿命与能源利用率。

从控制对象角度可将系统划分为三个核心闭环与一个安全联锁:

  • 温度闭环:加热器 → 导热油温度(PID)
  • 液位闭环:进油阀/出油阀 → 液位(PID或阈值+比例控制)
  • 流量监测:流量不足 → 联锁切断加热
  • 安全联锁:门限保护、故障检测 → 报警与停机

2.3 系统总体结构与工作流程

系统总体结构包括:

(1)传感器采集模块:温度、液位、流量。

(2)单片机控制核心模块:数据采集、滤波、PID计算、状态机、安全判断。

(3)执行机构驱动模块:进油阀驱动、出油阀驱动、电加热器驱动(继电器/SSR/可控硅)。

(4)人机交互与显示模块:LCD/数码管显示温度/液位/流量与设定值;按键用于参数设定(可扩展);蜂鸣器/报警灯提示异常。

(5)电源与隔离保护模块:为弱电与强电提供稳定电源与隔离,保障可靠性与安全。

系统典型运行流程可概括为:

  • 上电自检 → 读取传感器 → 判断液位、流量是否满足启动条件
  • 若满足:进入运行模式,执行温度PID控制加热器,液位控制进出油阀
  • 实时显示关键参数
  • 任意时刻若出现异常(过温/低液位/低流量/传感器故障):立即停机并报警
  • 故障解除并复位后恢复运行或进入待机

3、系统功能设计详解

3.1 温度采集与温度PID控制功能

3.1.1 温度传感器选型与测量特点

导热油温度一般范围从常温到200℃甚至更高,因此温度传感器需要具备:

  • 高温测量能力
  • 良好稳定性与抗干扰能力
  • 安装可靠性(油路或油箱测温点)

常用方案包括:

(1)K型热电偶 + 放大/冷端补偿(例如MAX6675/MAX31855):量程大(可到1000℃),响应快,适合高温场景。

(2)PT100铂电阻 + 恒流源测量 + 运放/ADC:精度高,线性好,工业常用。

(3)DS18B20:成本低、接口简单,但最高125℃,不适合高温导热油系统。

工程上推荐使用PT100或热电偶方案。若系统目标温度≤120℃可选DS18B20,但题目强调"导热油"且强调安全与工业运行,建议采用PT100或热电偶。

3.1.2 温度数据处理与滤波

工业现场干扰强,温度采样会有噪声和突变,因此需要滤波处理:

  • 滑动平均滤波:连续采样N次取平均,抑制随机噪声。
  • 一阶低通滤波:T_f = αT_new + (1-α)T_old,响应平滑。
  • 异常值剔除:若出现跳变超过阈值(例如5℃/采样周期),可暂时忽略并报警或重新采样。

滤波的目的不是让显示更好看,而是保证PID输入稳定,避免因噪声导致控制抖动、继电器频繁动作。

3.1.3 PID控制目标与控制输出方式

温度控制目标:

  • 使导热油温度稳定在设定值T_set,稳态误差小,超调小,响应快。

控制输出方式常见两类:

(1)继电器/接触器通断控制:通过"时间比例控制"(Time Proportioning Control, TPC)实现类似PWM的调功,适合电加热器。

(2)SSR/可控硅相位调功:可连续调节功率,控制更平滑,但硬件成本与电磁兼容要求更高。

题目强调"控制电加热器的通断时间",因此更符合方式(1):用PID计算出0~100%加热占空比,再在固定控制周期内按占空比通断加热器。例如控制周期为2秒,若占空比为30%,则加热器通电0.6秒、断电1.4秒。

3.1.4 温度PID算法设计要点

PID控制基本公式:

u(t)=K_p e(t)+K_i \\int e(t),dt+K_d \\frac{de(t)}{dt}

其中:

  • e(t) = T_set - T_meas
  • u(t)为控制输出(加热占空比或功率百分比)

在单片机中常用离散PID:

  • e(k) = set - meas
  • 积分项累加:I += e(k)
  • 微分项:D = e(k) - e(k-1)
  • 输出:u = Kpe + KiI + Kd*D

设计关键点:

(1)积分限幅(Anti-windup):防止系统启动或故障时积分项累积过大导致严重超调。

(2)输出限幅:加热占空比必须在0~100%范围。

(3)采样周期固定:PID计算周期必须稳定(例如500ms或1s)。

(4)微分项滤波:微分对噪声敏感,可对温度变化进行低通滤波或采用增量式PID减少抖动。

3.2 液位采集与液位控制功能

3.2.1 液位控制意义

导热油系统液位是安全运行关键指标:

  • 液位过低:加热器可能干烧,造成加热管烧毁甚至火灾。
  • 液位过高:可能溢出或进入不该进入的管路,影响循环和安全。
    因此液位控制不仅仅是保证工艺要求,也是安全联锁条件。

3.2.2 液位传感器选型

常用液位传感器方案:

(1)浮球开关:输出开关量,可设低液位/高液位两个点,简单可靠。

(2)电容式液位传感器:可输出模拟量,适合连续测量。

(3)超声波液位:非接触,适合腐蚀介质,但导热油蒸汽与温度可能影响测量。

(4)差压液位计:工业常用,精度高。

若系统需要PID控制液位,通常需要连续液位信号(模拟量或数字量连续输出)。若仅需安全保护与基本控制,可用高低液位开关实现"阈值控制"。题目要求"液位PID控制系统",因此建议采用电容式或差压式液位传感器输出05V或420mA,再通过ADC采样得到液位百分比。

3.2.3 进油阀与出油阀控制策略

液位控制对象:油箱/循环系统液位。控制手段:

  • 进油阀打开:液位上升
  • 出油阀打开:液位下降

液位PID输出可以解释为"调节阀开度"或"调节阀门占空比"。在低成本系统中,阀门多为电磁阀(开/关型),无法连续调节开度,因此可采用"脉冲宽度控制"实现近似比例调节:

  • 在固定控制周期内按输出占空比开阀一定时间
  • 输出为正:开进油阀
  • 输出为负:开出油阀
  • 输出接近0:两阀关闭

例如液位误差较大时进油阀开得更久,误差小则开得更短,从而实现较平滑的液位调节。若使用电动调节阀(010V或420mA控制),则PID可直接输出阀门开度,更符合工业控制,但成本更高。

3.2.4 液位控制与温度控制的耦合关系

在导热油系统中,液位与温度存在耦合:

  • 温度升高会导致油体积膨胀,液位上升
  • 温度降低液位下降
    因此液位控制需考虑温度变化引起的液位波动,避免"温度变化导致液位控制过度动作"。解决方法:
    (1)液位PID调节周期设置较长(例如2~5秒更新一次),避免跟随短期波动。
    (2)对液位信号做滤波并设置死区(±1%不调整),减少阀门频繁动作。
    (3)在加热快速升温阶段可降低液位控制增益或进入"稳态液位控制模式"。

3.3 流量采集与联锁保护功能

3.3.1 流量监测必要性

导热油循环系统必须保证足够流量,否则会出现:

  • 导热油在加热器附近滞留,局部温度迅速升高导致结焦
  • 传热效率下降,系统温度控制失稳
  • 加热器或管路损坏
    因此流量不足应作为强制联锁条件:流量低于阈值必须停止加热,必要时报警停机。

3.3.2 流量传感器选型与信号处理

流量传感器常用:

(1)霍尔脉冲式流量计:输出脉冲频率与流量成比例,单片机通过计数测量。

(2)涡轮流量计:类似脉冲输出,适合液体。

(3)差压式流量:输出模拟量。

对于单片机系统,脉冲式流量计最常用:

  • 采用外部中断计数或定时器计数
  • 每1秒统计脉冲数并换算为流量(L/min)
    并通过滑动平均滤波减少波动。

3.3.3 流量联锁策略

设定最小流量阈值F_min:

  • 若F < F_min持续超过一定时间(例如3秒),则判定低流量故障:

    • 立即关闭加热器
    • 关闭进/出油阀(或进入安全液位模式)
    • 发出报警信号
    • 系统进入故障状态,需要人工复位或故障解除后自动恢复(按设计需求)

同时可增加"流量传感器故障检测":

  • 若流量长时间为0且系统认为泵在运行,可能传感器断线或卡死,应报警。

3.4 实时参数显示功能

3.4.1 显示内容与优先级

操作人员需要实时了解系统关键参数以判断运行状态:

  • 温度:当前温度T_meas、设定温度T_set
  • 液位:当前液位L_meas、设定液位L_set(或上/下限)
  • 流量:当前流量F_meas、低流量阈值F_min
  • 系统状态:运行/加热/进油/出油/报警/故障

显示方式可采用:

  • LCD1602/12864(字符显示直观)
  • OLED(显示清晰,信息量大)
  • 数码管(成本低但信息量有限)
    由于需要同时显示多个参数,推荐LCD或OLED。LCD1602可分页显示:第一页显示温度与设定值;第二页显示液位与流量;第三页显示状态与报警信息。

3.4.2 参数设定方式(可扩展)

题目未要求参数设定,但工程系统通常需要设定:

  • 目标温度T_set
  • 目标液位L_set或液位上下限
  • 最小流量阈值F_min
    可通过按键进入设置模式,或通过旋钮/编码器调整。参数可存储到EEPROM以实现掉电保存,增强实际可用性。

3.5 多重安全保护与报警机制

3.5.1 保护类型与触发条件

系统应至少包含以下保护:

(1)过温保护:温度超过T_high(例如T_set + 10℃或固定上限),立即切断加热并报警。

(2)低液位保护:液位低于L_low(例如20%),禁止加热并报警。

(3)高液位保护:液位高于L_high(例如95%),禁止进油并报警,必要时打开出油阀。

(4)低流量保护:流量低于F_min,切断加热并报警。

(5)传感器故障保护:温度/液位/流量信号异常(断线、超量程、长时间不变、跳变过大)。

(6)执行器异常:阀门开关后液位无变化、加热开启后温度不升(加热器损坏)、加热关闭后温度持续升高(继电器粘连)。

3.5.2 报警输出方式

报警可通过:

  • 蜂鸣器
  • 报警灯
  • 继电器输出到上位机
  • 串口通信输出故障码(扩展)

报警策略建议分级:

  • 轻微报警:提示但不立即停机(例如温度接近上限)
  • 严重报警:立即停机(过温、低液位、低流量)
    并在显示屏上提示具体故障原因,便于快速排查。

3.5.3 安全停机策略

当发生严重故障时,系统应执行"安全停机":

  • 立即断开加热器(优先级最高)
  • 关闭进油阀
  • 根据液位情况决定是否开启出油阀(防溢)
  • 保持循环泵运行(若存在)以降低局部温度(视系统结构)
  • 声光报警
  • 记录故障代码
  • 等待人工复位或故障解除后恢复

安全停机逻辑必须"可预测、可重复",避免在故障状态下反复开关阀门造成更大风险。

4、系统电路设计

4.1 电路总体设计原则

本系统既包含弱电控制与信号采集,也包含强电加热与阀门驱动,因此电路设计必须满足:

(1)强弱电隔离:加热器与阀门驱动必须与单片机隔离(继电器、光耦、SSR)。

(2)抗干扰:继电器、阀门线圈、电加热器产生干扰,必须通过滤波、吸收、去耦抑制。

(3)可靠性:传感器信号要稳定,采样电路要有滤波与保护。

(4)安全性:保险丝、漏电保护、温控熔断器、过流保护不可缺少。

4.2 单片机最小系统模块

4.2.1 单片机选型与资源需求

可选51、AVR、STM32等。若使用:

  • PT100/热电偶模拟采样
  • 液位模拟采样
    则需要ADC资源或外置ADC(如ADC0832、ADS1115等)。
    若采用K型热电偶模块MAX6675,则可通过SPI读取温度,减轻ADC需求。
    流量脉冲信号可通过外部中断计数。

4.2.2 时钟、复位与去耦

  • 晶振电路稳定,保证采样计时与控制周期准确
  • 复位电路保证上电进入安全状态(加热器默认关闭)
  • 去耦电容减少电源波动引起的误复位

4.3 温度采集电路模块

4.3.1 PT100采集电路

PT100需恒流源激励并测量电压:

  • 恒流源(例如1mA)使PT100产生电压
  • 运放放大到ADC可测范围
  • 加入低通滤波抑制噪声
    若采用专用PT100变送器(输出4~20mA),则测量更简单:用采样电阻转换为电压再ADC采样,抗干扰强,适合工业现场。

4.3.2 热电偶采集电路

热电偶输出毫伏级,需要:

  • 放大
  • 冷端补偿
    工程上常用MAX6675/MAX31855模块直接输出数字温度,单片机SPI读取,硬件实现方便可靠。

4.4 液位采集电路模块

若液位传感器输出:

  • 0~5V电压:直接进入ADC并加RC滤波
  • 420mA电流:通过250Ω电阻转换为15V,再ADC采样
    输入端可加TVS二极管与限流电阻防止浪涌损坏。

4.5 流量采集电路模块

脉冲流量计输出一般为开集电极或方波信号,需要:

  • 上拉电阻
  • 施密特触发整形(可选)
  • 输入限幅保护
    并接入单片机外部中断或计数器输入,提高测量精度。

4.6 进油阀与出油阀驱动模块

电磁阀驱动通常为12V/24V直流:

  • 单片机IO → 光耦 → MOSFET/三极管 → 电磁阀
  • 阀线圈并联续流二极管(抑制反向电动势)
    若使用交流阀,则需继电器/SSR驱动并加RC吸收与压敏电阻。

控制电路要考虑:

  • 阀门开关频率不宜过高,避免机械磨损与发热
  • 使用PWM脉冲控制时周期要合理(例如2~5秒周期),保证阀门寿命

4.7 电加热器控制与隔离模块

电加热器一般为交流负载,控制方式:

(1)继电器/接触器:适合开关控制与时间比例调功。

(2)SSR固态继电器:适合频繁通断,寿命长,电磁干扰小。

(3)可控硅调功:可实现更精细功率控制,但EMI处理复杂。

题目强调"通断时间控制",推荐SSR:

  • 单片机输出控制SSR输入端
  • SSR输出端串联加热器电源
  • 加入保险丝、漏电保护、温度熔断器等安全件
    并注意散热:SSR工作会发热,需要散热片。

4.8 显示与人机交互模块

显示模块可采用LCD1602:

  • 4位数据模式节省IO
  • 显示温度、液位、流量与状态
    按键模块可用于参数设定:
  • SET进入设置
  • UP/DOWN调整参数
  • OK确认保存
    蜂鸣器与报警灯可由GPIO驱动,蜂鸣器建议有源蜂鸣器,控制简单。

4.9 电源模块与整体安全保护

系统电源通常包括:

  • 220VAC → 开关电源模块 → 12V/24V(阀与继电器)
  • 12V/24V → 降压 → 5V/3.3V(单片机与传感器)
    必须具备:
  • 输入保险丝
  • 电源滤波(共模电感、电容)
  • 接地与隔离符合规范
  • 关键传感器与单片机供电加入稳压与过压保护
    保证长期稳定运行。

5、程序设计

5.1 软件总体架构与任务划分

软件建议采用"分层+状态机+周期任务调度"结构:

(1)驱动层:ADC采样、SPI/单总线、GPIO控制、显示驱动。

(2)设备层:温度读取、液位读取、流量计算、阀门控制、加热器控制。

(3)控制层:温度PID、液位PID、联锁保护、安全停机。

(4)应用层:运行状态机、显示页面管理、报警管理。

周期任务建议:

  • 10ms:按键扫描、蜂鸣器控制、阀门脉冲控制调度
  • 100ms:液位采样与滤波、液位控制计算
  • 500ms或1s:温度采样与温度PID计算、流量统计计算
  • 200ms:显示刷新(LCD可更慢)

5.2 温度PID控制模块程序设计

5.2.1 时间比例控制输出

设置一个控制周期Tp(例如2000ms),PID输出u为0~100%。

  • on_time = u/100 * Tp
  • off_time = Tp - on_time
    控制周期到来时根据on_time控制加热器通断。

必须考虑:

  • 加热器和SSR允许较高频率开关,但也不宜过高,一般1~5秒周期合适
  • PID输出变化过快可能导致加热不稳定,可对输出做限速
  • 过温保护时强制关闭加热器(优先级高于PID输出)

5.2.2 PID参数整定建议

温度系统通常具有大惯性与滞后,PID整定建议:

  • Kp:决定响应速度,过大易振荡
  • Ki:消除稳态误差,但过大易超调
  • Kd:抑制快速变化,降低超调,但对噪声敏感
    工业上常用PI控制即可,Kd可设置较小或为0。若系统噪声大,建议采用PI并增加滤波。

5.3 液位PID控制模块程序设计

液位控制可以使用位置式PID或增量式PID,输出为阀门脉冲占空比。策略:

  • error = L_set - L_meas
  • u = PID(error)
  • 若u > deadband:进油阀开(u比例时间)
  • 若u < -deadband:出油阀开(|u|比例时间)
  • 否则两阀关闭

注意:液位控制不应过快,否则阀门频繁动作。建议液位PID周期≥1s,并设置最小开阀时间(例如100ms)与最大开阀时间(例如1s),避免阀门颤振。

5.4 流量测量与低流量联锁模块程序设计

流量脉冲计数:

  • 外部中断每来一个脉冲count++
  • 每1秒读取count并清零
  • flow = count / K(K为每升脉冲数换算系数)
    加入滤波:flow_f = (flow_f*3 + flow)/4,平滑显示和判断。

联锁判断:

  • 若flow_f < F_min持续3秒,则进入故障停机,关闭加热器并报警。
  • 故障解除后可人工复位恢复运行。

5.5 显示与报警模块程序设计

显示模块周期刷新:

  • 显示温度当前值与设定值
  • 显示液位百分比与设定值
  • 显示流量与阈值
  • 显示状态:RUN/HEAT/VALVE_IN/VALVE_OUT/ALARM
    报警模块根据故障代码控制蜂鸣器与报警灯,并在LCD上显示具体故障信息,如:
  • "ERR: OVER TEMP"
  • "ERR: LOW LEVEL"
  • "ERR: LOW FLOW"

5.6 安全保护与故障管理模块程序设计

故障管理建议采用"故障码 + 故障锁存":

  • 一旦触发严重故障,系统进入FAULT状态并锁存故障码
  • 必须人工复位或满足条件后解除锁存
    这样可避免故障条件瞬间消失导致系统反复启停,保证安全。

故障类型可定义为:

  • FAULT_NONE
  • FAULT_OVER_TEMP
  • FAULT_LOW_LEVEL
  • FAULT_HIGH_LEVEL
  • FAULT_LOW_FLOW
  • FAULT_SENSOR_FAIL
  • FAULT_HEATER_STUCK
    等。

6、程序示例代码(C语言,单片机通用框架)

说明:以下代码为逻辑框架示例,重点展示温度PID+时间比例控制、液位PID+阀门脉冲控制、流量计数与安全联锁、显示与故障管理。底层硬件接口函数需根据具体单片机与传感器实现。

6.1 关键结构体与全局变量

c 复制代码
#include <stdint.h>
#include <stdbool.h>

typedef struct {
    float Kp;
    float Ki;
    float Kd;
    float integral;
    float last_error;
    float out_min;
    float out_max;
} PID_t;

typedef enum {
    FAULT_NONE = 0,
    FAULT_OVER_TEMP,
    FAULT_LOW_LEVEL,
    FAULT_HIGH_LEVEL,
    FAULT_LOW_FLOW,
    FAULT_SENSOR_FAIL
} Fault_t;

typedef enum {
    MODE_STOP = 0,
    MODE_RUN,
    MODE_FAULT
} SysMode_t;

static volatile SysMode_t g_mode = MODE_STOP;
static volatile Fault_t   g_fault = FAULT_NONE;

// 采样值
static volatile float g_temp = 25.0f;  // ℃
static volatile float g_level = 50.0f; // %
static volatile float g_flow = 0.0f;   // L/min

// 设定值
static volatile float g_temp_set = 120.0f;
static volatile float g_level_set = 70.0f;
static volatile float g_flow_min = 2.0f;

// PID控制器
static PID_t pid_temp;
static PID_t pid_level;

// 输出控制量
static volatile float u_heat = 0.0f;   // 0~100% 占空比
static volatile float u_level = 0.0f;  // -100~+100% 阀门动作强度

6.2 PID计算函数(位置式PID+积分限幅)

c 复制代码
static float PID_Update(PID_t *pid, float set, float meas)
{
    float error = set - meas;

    pid->integral += error;
    // 积分限幅(避免windup)
    if(pid->integral > 10000) pid->integral = 10000;
    if(pid->integral < -10000) pid->integral = -10000;

    float derivative = error - pid->last_error;
    pid->last_error = error;

    float out = pid->Kp * error + pid->Ki * pid->integral + pid->Kd * derivative;

    if(out > pid->out_max) out = pid->out_max;
    if(out < pid->out_min) out = pid->out_min;

    return out;
}

6.3 硬件接口函数(需根据硬件实现)

c 复制代码
// ===== 传感器读取 =====
float ReadTempC(void);
float ReadLevelPercent(void);
float ReadFlowLpm(void);

// ===== 执行器控制 =====
void Heater_Set(bool on);
void Valve_In_Set(bool on);
void Valve_Out_Set(bool on);

// ===== 报警与显示 =====
void Alarm_Buzzer(bool on);
void Alarm_Lamp(bool on);
void LCD_ShowMain(float t, float l, float f, SysMode_t mode, Fault_t fault);

6.4 温度控制:时间比例控制器(2秒周期示例)

c 复制代码
#define HEAT_PERIOD_MS 2000

static uint32_t heat_timer_ms = 0;
static uint32_t heat_on_ms = 0;

static void Heater_TimeProportion_Task_10ms(void)
{
    // 每10ms调用一次
    heat_timer_ms += 10;

    // 计算本周期需要通电多久
    heat_on_ms = (uint32_t)(u_heat * HEAT_PERIOD_MS / 100.0f);

    if(heat_timer_ms <= heat_on_ms) {
        Heater_Set(true);
    } else {
        Heater_Set(false);
    }

    if(heat_timer_ms >= HEAT_PERIOD_MS) {
        heat_timer_ms = 0;
    }
}

6.5 液位控制:阀门脉冲调节(3秒周期示例)

c 复制代码
#define LEVEL_PERIOD_MS 3000
#define LEVEL_DEADBAND  1.0f   // ±1%不动作
#define VALVE_MIN_ON_MS 100
#define VALVE_MAX_ON_MS 1500

static uint32_t level_timer_ms = 0;
static uint32_t valve_on_ms = 0;
static bool valve_in_active = false;
static bool valve_out_active = false;

static void Level_ValvePulse_Task_10ms(void)
{
    level_timer_ms += 10;

    // 每周期开始重新决定阀门动作
    if(level_timer_ms == 10) {
        valve_in_active = false;
        valve_out_active = false;
        valve_on_ms = 0;

        if(u_level > LEVEL_DEADBAND) {
            // 需要进油
            valve_in_active = true;
            valve_on_ms = (uint32_t)(u_level * LEVEL_PERIOD_MS / 100.0f);
        } else if(u_level < -LEVEL_DEADBAND) {
            // 需要出油
            valve_out_active = true;
            valve_on_ms = (uint32_t)((-u_level) * LEVEL_PERIOD_MS / 100.0f);
        }

        if(valve_on_ms < VALVE_MIN_ON_MS && valve_on_ms > 0) valve_on_ms = VALVE_MIN_ON_MS;
        if(valve_on_ms > VALVE_MAX_ON_MS) valve_on_ms = VALVE_MAX_ON_MS;
    }

    // 执行阀门动作
    if(valve_in_active && level_timer_ms <= valve_on_ms) {
        Valve_In_Set(true);
    } else {
        Valve_In_Set(false);
    }

    if(valve_out_active && level_timer_ms <= valve_on_ms) {
        Valve_Out_Set(true);
    } else {
        Valve_Out_Set(false);
    }

    if(level_timer_ms >= LEVEL_PERIOD_MS) {
        level_timer_ms = 0;
    }
}

6.6 安全保护与故障锁存

c 复制代码
#define TEMP_HIGH_LIMIT   200.0f
#define TEMP_OVER_MARGIN  10.0f
#define LEVEL_LOW_LIMIT   20.0f
#define LEVEL_HIGH_LIMIT  95.0f
#define FLOW_LOW_DELAY_MS 3000

static uint32_t low_flow_ms = 0;

static void Safety_Check(void)
{
    if(g_fault != FAULT_NONE) return; // 故障锁存

    // 过温保护:超过设定值+10℃或硬上限
    if(g_temp > (g_temp_set + TEMP_OVER_MARGIN) || g_temp > TEMP_HIGH_LIMIT) {
        g_fault = FAULT_OVER_TEMP;
    }

    // 低液位保护
    if(g_level < LEVEL_LOW_LIMIT) {
        g_fault = FAULT_LOW_LEVEL;
    }

    // 高液位保护
    if(g_level > LEVEL_HIGH_LIMIT) {
        g_fault = FAULT_HIGH_LEVEL;
    }

    // 低流量保护(延时判定)
    if(g_flow < g_flow_min) {
        low_flow_ms += 100; // 假设此函数每100ms调用
        if(low_flow_ms >= FLOW_LOW_DELAY_MS) {
            g_fault = FAULT_LOW_FLOW;
        }
    } else {
        low_flow_ms = 0;
    }

    // 传感器异常检测(示例:范围判断)
    if(g_temp < -50.0f || g_temp > 300.0f) {
        g_fault = FAULT_SENSOR_FAIL;
    }
}

6.7 主控制任务与主循环

c 复制代码
static void Control_Task_100ms(void)
{
    // 采样
    g_temp  = ReadTempC();
    g_level = ReadLevelPercent();
    g_flow  = ReadFlowLpm();

    // 安全检查
    Safety_Check();

    if(g_fault != FAULT_NONE) {
        g_mode = MODE_FAULT;
    }

    if(g_mode == MODE_RUN) {
        // 温度PID:输出0~100%
        u_heat = PID_Update(&pid_temp, g_temp_set, g_temp);

        // 液位PID:输出-100~+100%
        u_level = PID_Update(&pid_level, g_level_set, g_level);

        // 联锁:低液位或低流量时强制关闭加热
        if(g_level < LEVEL_LOW_LIMIT || g_flow < g_flow_min) {
            u_heat = 0;
        }
    } else if(g_mode == MODE_FAULT) {
        u_heat = 0;
        u_level = 0;
        Heater_Set(false);
        Valve_In_Set(false);
        Valve_Out_Set(false);
        Alarm_Buzzer(true);
        Alarm_Lamp(true);
    } else {
        // STOP
        u_heat = 0;
        u_level = 0;
        Heater_Set(false);
        Valve_In_Set(false);
        Valve_Out_Set(false);
        Alarm_Buzzer(false);
        Alarm_Lamp(false);
    }

    // 显示
    LCD_ShowMain(g_temp, g_level, g_flow, g_mode, g_fault);
}

void System_Init(void)
{
    pid_temp.Kp = 2.0f;
    pid_temp.Ki = 0.05f;
    pid_temp.Kd = 0.0f;
    pid_temp.integral = 0;
    pid_temp.last_error = 0;
    pid_temp.out_min = 0;
    pid_temp.out_max = 100;

    pid_level.Kp = 1.5f;
    pid_level.Ki = 0.02f;
    pid_level.Kd = 0.0f;
    pid_level.integral = 0;
    pid_level.last_error = 0;
    pid_level.out_min = -100;
    pid_level.out_max = 100;

    g_mode = MODE_RUN;
    g_fault = FAULT_NONE;
}

int main(void)
{
    System_Init();

    // 假设存在10ms与100ms调度器(由定时器中断设置标志)
    while(1) {
        // 10ms任务:执行加热时间比例、阀门脉冲
        if(g_mode == MODE_RUN) {
            Heater_TimeProportion_Task_10ms();
            Level_ValvePulse_Task_10ms();
        }

        // 100ms任务:采样、PID、显示、安全检查
        Control_Task_100ms();
    }
    return 0;
}

7、系统运行稳定性与能效优化设计

7.1 温度控制的稳定与节能

导热油系统具有大惯性和滞后,控制策略应避免频繁大幅波动:

  • 使用时间比例控制周期2~5秒,使加热器开关频率适中,减少继电器/SSR发热与损耗。
  • 使用PI控制即可满足大多数温控场景,降低微分噪声影响。
  • 增加"软启动":启动阶段限制最大加热占空比,避免过冲。
  • 在接近设定温度时降低输出变化速度,使温度平稳收敛,减少超调。

7.2 液位控制的稳定与阀门寿命

液位控制避免高频动作:

  • 设置死区与最小开阀时间
  • 控制周期加长,减少阀门机械冲击
  • 加入"液位变化率判断":如果液位变化过慢,可能阀门堵塞或系统泄漏,可报警。

7.3 流量与温度联锁提高寿命

在流量不足时切断加热是保护加热器与导热油的关键措施:

  • 避免局部过热结焦
  • 延长加热管寿命
  • 提升油品使用寿命与系统热效率
    同时可建议保持循环泵运行散热,提高安全性。

7.4 故障诊断与维护便利性

系统应尽可能提供清晰故障码与提示:

  • 过温:检查温控回路、SSR是否粘连、油泵是否运行
  • 低液位:检查漏油、补油系统、液位传感器
  • 低流量:检查循环泵、过滤器堵塞、流量计故障
  • 传感器故障:检查线路与传感器供电
    完善的诊断信息能够显著减少停机时间,提升设备可维护性。

8、总结

本设计提出了一套基于单片机的电加热炉智能温度与液位PID控制系统方案,通过温度传感器、液位传感器与流量传感器实现导热油关键参数的实时采集与智能处理。系统采用温度PID结合时间比例控制方式精确调节电加热器通断时间,实现温度稳定控制;采用液位PID结合阀门脉冲调节方式控制进油阀与出油阀,实现液位稳定调节;同时对流量进行实时监测并作为安全联锁条件,在低流量、低液位、过温等异常状态下立即切断加热并报警,确保设备与人员安全。系统支持实时参数显示与故障提示,控制逻辑合理,具有良好的稳定性、能效与可扩展性,可作为导热油电加热炉的智能控制器原型或工业控制课程设计参考方案。

相关推荐
列御寇9 小时前
MongoDB分片集概述
数据库·mongodb
一路往蓝-Anbo9 小时前
第五篇:硬件接口的生死劫 —— GPIO 唤醒与测量陷阱
c语言·驱动开发·stm32·单片机·嵌入式硬件
逑之10 小时前
C语言笔记16:文件操作
c语言·笔记·单片机
+VX:Fegn089510 小时前
计算机毕业设计|基于springboot + vue物流配送中心信息化管理系统(源码+数据库+文档)
数据库·vue.js·spring boot·后端·小程序·课程设计
qq_124987075310 小时前
基于微信小程序的宠物交易平台的设计与实现(源码+论文+部署+安装)
java·spring boot·后端·微信小程序·小程序·毕业设计·计算机毕业设计
列御寇11 小时前
MongoDB分片集群——集群组件概述
数据库·mongodb
2401_8633261111 小时前
基于单片机智能光控路灯设计
单片机·嵌入式硬件
VX:Fegn089511 小时前
计算机毕业设计|基于springboot + vue智慧养老院管理系统(源码+数据库+文档)
数据库·vue.js·spring boot·后端·课程设计
清风66666611 小时前
基于单片机的球类比赛专用计分与暂停管理系统设计
单片机·嵌入式硬件·毕业设计·课程设计