基于FireBeetle ESP32-E设计的加热台
设计概要
本次设计的想法是利用来自DFRobot公司的DFR0654-F FIREBEETLE ESP32-E IOT MICROCONT和DFR0558 GRAVITY DIGITAL HIGH TEMP SENSOR的两个产品来开发一个可视化加热台。
DFR0654-F FIREBEETLE ESP32-E IOT MICROCONT性能描述:
- 工作电压:3.3V
- 输入电压:3.3V~5.5V
- 支持低功耗:10uA
- 支持最大放电电流:600mA@3.3V LDO
- 支持最大充电电流:500mA
- 支持USB充电
- 处理器:Tensilica LX6双核处理器(一核处理高速连接;一核独立应用开发)
- 主频:240MHz
- SRAM:520KB
- Flash:4MB
- Wi-Fi标准:FCC/CE/TELEC/KCC
- Wi-Fi协议:802.11 b/g/n/d/e/i/k/r (802.11n,速度高达150 Mbps),A-MPDU和A-MSDU聚合,支持0.4us防护间隔
- 频率范围:2.4~2.5 GHz
- 蓝牙协议:符合蓝牙v4.2 BR/EDR和BLE标准
- 蓝牙音频:CVSD和SBC音频低功耗:10uA
- 工作电流:80mA(平均)
- 频率范围:2.4~2.5GHz
- 支持Arduino一键下载
- 支持micropython
- 片上时钟:40MHz晶振、32.768KHz晶振
- 数字I/O x10(arduino默认)
- 模拟输入 x5(arduino默认)
- SPI x1(arduino默认)
- I2C x1(arduino默认)
- I2S x1(arduino默认)
- RGB_LED:5/D8
- 接口方式:FireBeetle V2系列兼容
- 工作温度:-40℃~+85℃
- 模块尺寸:25.4 × 60(mm)
- 安装孔尺寸:M2安装孔 孔径2.0mm
DFR0558 GRAVITY DIGITAL HIGH TEMP SENSOR数字K型高温传感器由信号放大转换模块和铠装K型热电偶探头组成,当K型热电偶探头置于高温热源时,探头两端由于热电效应产生一个与温度呈正比的微弱电压,信号放大转换模块采用MAX31855K专用芯片将这个微弱的电压信号进行放大、模数转换与相应补偿,最终通过Gravity I2C接口向主控器发送探头的测量温度。信号放大转换模块最大可测量极宽的温度范围-270℃~1372℃,在-200℃~700℃误差不超过±2℃,700℃~1350℃误差不超过±4℃,配套的铠装K型热电偶探头测温可达800℃,在量程范围内误差不大于±2.5℃,能够满足大部分400度以上超高温度的测量场景。
信号放大转换模块
- 输入电压(VCC):3.3V~5.5V
- 适配探头:K型热电偶探头
- 测温范围:-270℃~1372℃
- 测温分辨率:0.25℃
- 测温误差:≤±2℃(-200℃~700℃) ~ ±4℃(700℃~1350℃)
- 通信接口:Gravity I2C (逻辑电平0-3.3V)
- 产品尺寸:44.0mm*22.0mm
铠装K型热电偶探头
- 测温范围:0℃ ~ 800℃
- 测温误差:≤±2.5℃
- 线长:1.5m(金属屏蔽线)
- 探头长度:50mm
- 探头直径:Φ4mm
- 特性:防水、耐腐蚀(耐弱酸弱碱,防锈)、耐高温
硬件设计
硬件设计部分,我们主要分成四部分:
人机交互部分采用一个240X320的触摸屏进行显示和输入,可以设定温度和显示温度曲线等信息。
主控部分是ESP32,可以通过串口与触摸屏进行信息交互,并根据传感器(I2C)返回温度结果计算,在D12控制端口输出合适的控制量。
温度反馈部分由信号放大转换模块和铠装K型热电偶探头组成,通过I2C反馈温度到主控部分。
执行加热部分由发热片驱动(MOS管+继电器)和PTC发热片组成。
目前加热台概念版由这四部分构成,后续可以添加机械结构来提高作品的完成度。
硬件设计框图如下:
软件设计
软件包括控制核心程序和人机交互程序。控制核心程序位于ESP32中执行;人机交互程序在串口屏幕的GD32这个MCU里执行。
控制核心的程序:
void setup()
{
Serial.begin(115200);
Serial2.begin(115200);
max31855.begin();
pinMode(D12,OUTPUT);
pinMode(D4, INPUT_PULLUP);
}
初始化部分包含了对串口、I2C、GPIO的初始化。Serial2是屏幕串口,波特率115200。max31855.begin()是铠装K型热电偶信号放大转换模块的配置函数。D12是温度控制输出端口。D4是板上的一个按键,用来调整工作模式:set模式可以设置目标温度,run模式实施调温。
void loop()
{
float temp = max31855.readCelsius();
int temp1 = temp/1;
setmenu();
time = millis();
if(ms_c <= (time-10000))
{
ms_c = time;
setwave(0,temp_set);
setwave(1,temp1);
}
heat(time,temp1,temp_set);
}
·······························以下具体函数编写省略
- setmenu();在set模式下获取设置温度。
- setwave(0,temp_set);在屏幕显示设置的温度和打印温度曲线。
- setwave(1,temp1);在屏幕显示实际的温度和打印温度曲线。
- heat(time,temp1,temp_set);温度控制函数。
温度控制算法:
采用PI控制time_pwron = Kp*Terr0+Ki*Terr;
- time_pwron是周期内加热时间;
- Kp是比例系数;
- Terr0是温度误差;
- Ki是积分系数;
- Terr是温度误差累积项,并做了限幅,防止饱和。
人机交互程序:
Set界面,包括活动名称、版本信息、提升信息等。“250℃”是ESP32中返回的设置温度。“147”是输入温度,通过中间的滑块或者按钮【-】、【+】进行调节。按下【SET】是将输入温度设置到ESP32的设置温度中。
RUN界面包括温度曲线显示界面、设定温度显示框、实际温度显示框等。
联调测试
联调测试包括串口屏和ESP32控制板通信协议的对齐、温度控制算法参数的调整。
屏幕协议调试的基本思路是用ESP32的系统串口打印业务串口的RX、TX内容,然后判断通信出bug的地方,最终解决问题。
控制算法参数就是按照PID参数整定法,先调P找到等幅度震荡的值,然后取一个比其略小的值作为比例参数;然后不断增大I,找到一个满足静态误差的值作为积分参数即可。
调试结果:人机交互功能已完全实现,调温功能已经实现,可以在5min~10min达到设定温度,温度静态误差小于2℃。
总结与持续改进
总的来说,在Funpack第二季第三期活动中,学习了ESP32在arduino环境下的开发流程,进一步了解ESP32在蓝牙、WIFI等领域的应用方法并进行实践操作(虽然在最终作品中未涉及,但也收获颇丰),同时积累了大迟滞系数控制系统的调试方法。一期活动下来,经历了种种曲折,牺牲了汗水和脑细胞,当看到最终作品的时候感觉一切都是值得的!
如果有对该项目感兴趣的伙伴想做类似作品,我有几点改进建议:
- 可以选用较低规格的温度传感器,我使用的这把牛刀有点大。
- 可以选用最高温度高一点的发热片,目前最高240℃左右只能较好融化低温锡,造成实用价值较小。
最后,感谢Funpack活动的主办方提供了这次让我学习进步的机会,感谢其他一起参加活动的伙伴的经验交流,祝Funpack活动越办越好。
Javion@2022年12月23日