本帖最后由 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,240x320 Pixels,装配方式:焊接.不带触摸
| 视角当前为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:DIO SPISpeed:80MHz/40MHz Uart的波特率可选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电容的漏电.
后记:
本人并非职业选手,一边做一遍学,可能会有有很多错误.
只是做来自己用.没有成品.
参考照片:
|