lizengmao 发表于 2023-2-10 16:17:16

T12焊台的制作(ESP32+2.4吋TFT+CS1237)

本帖最后由 lizengmao 于 2023-2-10 16:16 编辑


构思
当前公司的936难用的一逼,:拆个编码器都费力.拆开看里面的火牛缩水,漏磁大,放颗螺丝在底部都可以被火牛吸起来.
后来买了一个T12烙铁.是半桶水设计的,用起来一言难尽.
编码器引脚没有对地电容,导致设置的温度经常被自动更改.
OLED仅有1.3吋,对于我这种老年人不友好.
加热控制部分回温太慢,比936好但是并未达到我想象中的好.
因此有自行设计T12烙铁的想法.电源不再使用火牛,改为使用外置的24V,3A的开关电源.以便可以利用笔记本电脑的电源供电.
由于本人是硬件不是软件,因此预计从Arduino入手.手头有2.4吋TFT,ESP32-WROOM-32U,ISL1208,DIO54335这些适用的零件,因此将用这些零件构建.

零件选择

零件
型号
备注
成本(粗估价格,不准确)

主控
ESP32-WROOM-32U模组,4MB Flash
32U板载IPEX天线接口,32D板载PCB天线
15

编码器
EC11
输出脉冲数:15~24点/360°,柄长15mm,半月柄或滚花柄均可
2.5

RTC
ISL1208

2.5

ADC
CS1237

2.5

OP Amplifier
GS8552
需低失调电压的OPA,建议选仪表放大OP
2

T12手柄

航空头/座+手柄+支架+T12发热芯+1米硅胶5芯线+震动开关
35

TFT
2.4吋,驱动IC:ST7789V,240x320Pixels,装配方式:焊接.不带触摸
视角当前为12 Clock,由于是横放,建议选9或3 Clock
15

32.768kHz晶振
CM200S,CITIZEN,12.5pF
供RTX用,可使用其它型号代替
2.5

DC-DC Step Down
DIO54335,DIOO
可用其他输入电压>30V的DC-DC代替
2.5


软件编译环境
Arduino 1.8.16
ESP32 Package 1.0.6

ESP32的GPIO定义


外设
需要引脚数
对GPIO需求
备注

编码器
3
A,B相及按键
无,GPIO即可


TFT
6
SPI:CS,SCK,DATA
RS(命令/数据选择)
Reset(复位)
Backlight(背光)
SPI使用ESP32的VSPI界面
CS:   GPIO5
SCK:GPIO18
MOSI: GPIO23
Backlight: 需PWM输出
通过SPI界面驱动TFT
使用不同Duty的PWM经V-I转换电路后,驱动TFT的背光.以便用户更改背光亮度.

RTC(ISL1208)
2
2-Wire(I2C)界面
I2C使用ESP32的Wire界面
SCL:GPIO22
SDA:GPIO21


NTC
1
需ADC,
获取环境温度,以便得到正确的T12温度

T12控制
1
需PWM
使用不同Duty的PWM驱动MOSFET,控制T12的温度

T12 位置传感器
1
GPIO
获取T12手柄内水银开关的状态,识别使用是否在使用T12手柄

DC Detect
1
需ADC
获取DC输入的电压值

T12温度读取
2
GPIO
T12的温度经OP放大后送入CS1237,ESP32读取CS1237 ADC值.


FW使用的Library:

Library
功能
备注

TFT_Espi
TFT驱动,绘制点/线/字符等等


LCDMenuLib2
TFT菜单


NTC_Thermistor
从NTC中获取温度


KickSort
使用”快速排序”对读取的T12 ADC值进行排序
将丢弃最高最低的ADC值(约为采样数的1/4)再进行平均

ISL1208-RTC-Library
对ISL1208进行读写


Arduino-PID-Library
使用PID控制T12的温度



FW思路:
控制T12发热:ESP32通过PWM控制T12发热,并定期关闭PWM,然后通过CS1237获取T12的温度.按T12实际温度与设定温度决定PWM的Duty.
检测T12是否在使用:检测手柄内部的震动开关High/Low.如果长期没有变化视为没有操作T12,将自动休眠/关机.
读取RTC:通过2-Wire(I2CBus)读写ISL1208.
用户界面: 编码器旋转为上/下/减小/加大;编码器短按为确定,长按为退出.

其他:
输入电压可达到24V,因此使用DC-DC转换为3.3V供ESP32使用.
TFT背光的驱动,使用PWM输出经RC低通滤波后,经DIO3581构成的V-I转换电路驱动TFT背光.优点是PWMDuty与背光电流成比例.
RTC使用ISL1208.当读到RTCF=1时,视为ISL1208没有正常工作,将用预设的时间设定ISL1208.
懒得找如何设定ESP32的定时器以便每隔5ms扫一次编码器,直接使用ESP32的另一个核专门用于扫编码器.
LCDMenuLib2最好用Excel设定好脚本方便建立菜单.
按键长短按处理是自己写.应该有现成的库,懒得找了.
CS1237的驱动是在AMOBBS招的.拿来测试了一下,改了一些地方.CS1237是24bit,对于当前的应用,16-bit已经绰绰有余.因此把ADC结果右移8位,仅使用16-bit.每次开机把CS1237设定为内部短路,记录此时的ADC值.后续读取的T12温度的ADC值要减去这个内短的ADC值.
有一些设定需要存起来,例如设定的温度,休眠时间等等.用ESP32内部的FLASH模拟.需要包含”EEPROM.h”这个文件.
编码器的扫描应该有现成的库,懒得找,自己写.
汉字的显示是网上找的.但是TFT_eSPI应该可以添加自己的汉字字库,然后TFT_eSPI的方法直接绘制汉字到TFT.
LCDMenuLib2自己在TFT右边加入了滚动条,以指示菜单是否已经到底.
加入了自己画的Logo图片,开机时显示2秒.及显示版本号2秒.
RTC的显示,在关机时使用FONT7数码管字体,正常/待机页面使用FONT4字体.这样关机时可以更加清楚的看时间.
NTC的摄氏度保留到小数点后1位.
输入DC 电压保留到小数点后1位.需要校准后才能比较准确.当前是在9V,24各校正一次.在菜单内分别输入对应的电压和ADC值即可.然并卵,ESP32的ADC仍然不能得到满意的结果.将就用吧.
mFunc_DispHeader()用于在菜单的上方显示当前菜单的父阶名称.
T12的温度需要校准.方法如下:
进入校正T12温度的菜单
1.设定NTC的温度为当前TFT显示的环境温度.
2.退出菜单,调整设定温度为250℃左右,用KAKKO191量T12实际温度.3.进入菜单,在’校正点1温度”按下编码器,并设为T12实际的温度.”校正点1ADC”的值将在按下编码器的时候自动更新.4.设定T12温度为350度左右, 用KAKKO 191量T12实际温度.
5.进入菜单,在’校正点2温度”按下编码器,并设为T12实际的温度.”校正点2ADC”的值将在按下编码器的时候自动更新.2~5步反复2次即可得到满意的温度校准结果.
菜单中可以自定义文本颜色和背景色,并被保存.
所有自定义的参数,将在退出菜单1分钟后保存.如果退出菜单后1分钟内断电,将不会保存到FLASH中.
使用两个PWM通道用于驱动TFT背光和T12.PWM解析度设定为10 bit.PWM频率设定为350Hz.
T12温度闭环控制,设为两个阶段.T12温度与设置温度差异超过20度,使用激进的PID,反之使用保守的PID.
T12温度检测时间:激进:1秒检测一次;保守:200ms检测一次.
T12温度读取时,先停止T12加热(PWM设为0),延迟25ms后连续读取64次.并丢弃1/8最大的ADC值和1/8最小的ADC值,剩下的ADC值做平均.
T12温度的计算是把T12温度与ADC值视为线性关系.用校准温度和ADC值进行计算得到.
mFunc_SwitchPage()用于切换菜单页面,正常加热页面,休眠页面,关机页面.按MenuPageIndex跳转.
mFunc_SysTimer()用于检测1秒/1分钟的时间.用于自动退出菜单/自动休眠/自动关机/自动存用户参数等.
开机后显示Logo,FW版本后直接进入关机状态.原因是老是有人用我的T12不断电.每次上班一通电就自动加热.索性改为开机后直接进入关机状态.晃动手柄或者旋转编码器或者按下编码器均可退出关机并进入正常加热状态.
目测在24V供电时,T12温升速度约25℃/秒.因此,升温到350度约需15秒.
蜂鸣器有留位置但是FW没有写入,懒.
ESP32的烧录:
使用USB转UART板接入PCBA上预留的Uart排针,PCBA通电后,按住Boot0按键,再按下Reset按键,释放Reset按键,释放Boot0按键,即使得ESP32进入烧录状态.
烧录软件:flash_download_tool_3.9.3_0
烧录bin的地址如下:
0x1000       bootloader.bin
0xe000       boot_app0.bin
0x8000       partitions.bin
0x10000      T12_ESP32_PID_CS1237.ino.bin
烧录的选项如下:
ChipType:ESP32
SPIMode:DIOSPISpeed:80MHz/40MHzUart的波特率可选961200以便获得最快的烧录速度.

遇到的一些坑:
ESP32 GPIO有一些脚不能接太大的电容及用太小的Pull-Up电阻.将导致无法烧录ESP32!!!浪费我1天时间查无法烧录ESP32的原因.
最好写一段GPIO测试函数,以确认ESP32模组用到的GPIO都可正确的输出High/Low,验证模组的焊接是否有问题.由于模组虚焊我浪费了半天时间查驱动是否有问题.
T12加热控制的当前使用PWM频率=350Hz.注意低于20kHz的PWM频率有可能导致MLCC/LED震动导致有可听到的噪音.
如果PWM使用使用更高的频率,注意硬件一定要改为三极管推挽驱动,避免烧功率MOSFET.
如果使用更改的频率驱动T12的输出,Pin输出的电阻应该要改为电容,以避免ESP32出现异常导致GPIO一直输出High,导致T12无法关闭,烙铁有烧红甚至发生火灾的危险!!!
T12内部热电偶输出电压很低,需要OPA进行放大.建议选择低失调电压,低温漂的OPA.试过DIO2032,LM358,NJM4558均不可靠.当前选择GS8552 (30uV失调电压).
ESP32自带的ADC性能不佳.当前用在读取NTC,DC电压上.ADC 输入范围150mV~2.5V.且线性度极差,用于ADC按键使没有问题,用于传感器就呵呵.
试过ESP32自带的ADC读取T12温度,需在OPA输入增加10mV左右的直流,以便避开ESP32的150mVADC死区.但不同的ESP32模组,ADC读取的值相差很大.即ESP32 ADC的批次性不佳.改为使用CS1237读取T12的温度.
由于NTC和DC输入电压仍用ESP32自带的ADC监测,因此,将有较大的误差.NTC误差约2度,DC输入电压误差约0.2V.
NTC_Thermistor库的adcResolution要改为4096以便与ESP32ADC对应.
LCDMenuLib2的控制方式自己添加了一种自定义的编码器输入.因为自带的编码器输入方式不好用.需要注意的是LCDMenuLib2自带的编码器输入的左转是往下,自定义的改为了左转对应往上.
LCDMenuLib2在调整菜单时默认会刷新整个屏幕.改为了只有跨页面或转至新一阶菜单时才会刷新整个屏幕.
TFT_eSPI我设定SPI频率=80MHz,使用FillSceen(TFT_BLACK)擦除整个屏幕用时约16ms.
有尝试改为STM32G070试图省去外部的ADC,但SPI频率只有32MHz,且TFT_eSPI库未对STM32G070优化.实测FillSceen(TFT_BLACK)擦除整个屏幕用时约180ms.刷新率太低.尝试改为160*80的0.96吋TFT,实测FillSceen(TFT_BLACK)擦除整个屏幕用时约55ms.但是TFT尺寸太小,放弃.
CS1237理论上要用差分模式,但是似乎PGA=1的时候,单端输入用起来也可以.
由于外置的开关电源内部Y电容的存在,将会导致PCBA,烙铁头有几十V的感应交流电压,因此需要把PCBA,烙铁头接地!!!使用质量好的大牌厂商的笔记本电源将会大大降低Y电容的漏电.

后记:
本人并非职业选手,一边做一遍学,可能会有有很多错误.
只是做来自己用.没有成品.

参考照片:
























honami520 发表于 2023-2-10 16:39:13

不错不错,支持开源

akey3000 发表于 2023-2-10 16:45:58

串口屏么,esp应该不能驱动其他接口的屏

yuyu87 发表于 2023-2-10 16:48:24

弱弱的问一下,像CS1237这种电子称芯片,输入电压如果在AIN-N附近会有问题么?不用偏置到VCC/2附近么?如果不用运放可以么?CS1237不是最高可以到128倍么?

yuyu87 发表于 2023-2-10 16:52:22

akey3000 发表于 2023-2-10 16:45
串口屏么,esp应该不能驱动其他接口的屏
(引用自3楼)

这个是SPI屏,ESP32是有专用的接口驱动屏的,不过IO太少,一般人不用并口驱动。

ronic 发表于 2023-2-10 16:59:04

支持一下,?

lizengmao 发表于 2023-2-10 20:42:34

yuyu87 发表于 2023-2-10 16:48
弱弱的问一下,像CS1237这种电子称芯片,输入电压如果在AIN-N附近会有问题么?不用偏置到VCC/2附近么?如果 ...
(引用自4楼)

按CS1237规格书,共模电压与PGA有关。前两个PGA可以到GND-0.1V~VREF +0.1V。不过据坛友说如果当作单端输入时线性度会较差。由于我只是用到16-bit,因此将就用就算了。

yuyu87 发表于 2023-2-11 08:49:55

lizengmao 发表于 2023-2-10 20:42
按CS1237规格书,共模电压与PGA有关。前两个PGA可以到GND-0.1V~VREF +0.1V。不过据坛友说如果当作单端输 ...
(引用自7楼)

谢谢,刚看了手册,确实是这样,PGA在1和2倍时,可以低于GND,当在8,64,128时,就需要GND+0.75以上了。
学习了。

snowy 发表于 2023-2-11 08:54:39

Esp32-s3 可以用8bit并口。

jiezi 发表于 2023-2-28 08:22:18

yuyu87 发表于 2023-2-11 08:49
谢谢,刚看了手册,确实是这样,PGA在1和2倍时,可以低于GND,当在8,64,128时,就需要GND+0.75以上了。 ...
(引用自8楼)

可以参考AD7705的做法,把热电偶负极接参考电压

polarbear 发表于 2023-2-28 12:08:38

这类作品一般是画画绿绿的界面、曲线、换皮、还有 WIFIAPP 占了 99% 的代码, 然后温控哪里估计就 if   else   10行内解决战斗
页: [1]
查看完整版本: T12焊台的制作(ESP32+2.4吋TFT+CS1237)