版本协议

Public Domain

专业版
#第九届立创电赛#VFD桌面时钟

创建时间:6个月前

456 4

描述

<p>说明:以下所提到的问题和改进均已在工程的2.0版本的原理图中改好。1.0版本为最初测试和调试版本(本来想把PCB也改好的,但是不知道为什么EDA它犯病了,我把PCB复制过去后原理图和PCB中的器件不对应了,芯片跳转到PCB是个电容,就很离谱!!!更新原理图的话就全乱了,就请自行修改一下吧。。。)</p> <div align="center"> <img src="//image.lceda.cn/oshwhub/a32bd697787f40bf8fe7f2ce9baa0a6b.jpg" width="80%" height="80%"> </div> <h2>设计思路</h2> <p><span style="color:#999AAA">1、首先我将数码管替换成了一块VFD屏幕 2、能够单独工作,并可以通过type-c给锂电池充电 3、同时兼顾环境温湿度的检测与显示 4、作为一块桌面摆件,我认为它应该得精致小巧,所以应该有一个外壳</span></p> <h2>硬件设计</h2> <p><span style="color:#999AAA">提示:总体设计方案框图</span></p> <p><img src="https://image.lceda.cn/images/2022-1/60a95ddd36204044a43bc9a6c62a828a.png" alt="image.png"></p> <h3><strong>VFD屏幕</strong></h3> <p><span style="color:#999AAA">该项目最重要的就是屏幕部分了,我选用了一块非常便宜的VFD屏幕,裸板仅需15元,带驱动的成品屏幕35块(只需要用单片机控制其3个引脚,就能实现显示功能) VFD屏幕购买链接:<a href="https://m.tb.cn/h.ghyHEhAhJ5wPJ0J?tk=3IIn3b190b5" target="_blank">https://m.tb.cn/h.ghyHEhAhJ5wPJ0J?tk=3IIn3b190b5</a></span></p> <div align="center"> <img src="//image.lceda.cn/oshwhub/9bc69e87d0d54b5d9d04e57524983043.png" width="80%" height="80%"> </div> <p>但显示效果还是不错的。既然已经都决定要做了,所以我并没有买成品的屏幕,而是自己参照着商家的资料做一下驱动电路学习一下,并且成本也是差不多的。如果大家想要做也可以买更好的VFD屏幕,有显示位数更多的,或者显示的更精细的,也有类似收音机的频谱显示的屏幕。还有就是一些商家可能给的资料更全一些,想做好就能更容易一些。(附件的VFD用户资料为商家提供)</p> <h3>屏幕驱动电路</h3> <p><img src="//image.lceda.cn/oshwhub/88b13c28b20e4b6baa39d414fcf98519.png" alt="10e2b0ae93ba1a57fca41d8457f3dc9.png"> 需要注意的是,里面有几个物料在立创商城没有货或者是特别贵(尤其是TI的芯片,很离谱) PT6315-LQ:<a href="https://m.tb.cn/h.g8LCLWxdBK7SgHv?tk=nsPW3XgIU5x" target="_blank">https://m.tb.cn/h.g8LCLWxdBK7SgHv?tk=nsPW3XgIU5x</a> SN74LS04DR:<a href="https://m.tb.cn/h.gjLCw9ycpEMLOO9?tk=kbnW3XgH2rL" target="_blank">https://m.tb.cn/h.gjLCw9ycpEMLOO9?tk=kbnW3XgH2rL</a> UCC27517DBVR :<a href="https://m.tb.cn/h.g8LCmqI9Bx2Uaxq?tk=NWyi3Xgsxzi" target="_blank">https://m.tb.cn/h.g8LCmqI9Bx2Uaxq?tk=NWyi3Xgsxzi</a> </p> <p><strong>其余原理图就照着抄就行了(VFD这个器件得跟据需要自己画一下符号和封装):</strong> <img src="//image.lceda.cn/oshwhub/c7bda8cae2ba47b09fe13fcea8b337f3.png" alt="ca7807740ca9fbc824b37947baf44ca.png"></p> <p>商家所使用的驱动电路经验证没有什么大问题。但需要注意的是点亮荧光屏需要一个24v的高压。由原理图中的MT3608产生,然后再取反。这里芯片的输出电压约24V没有什么问题。但是取反后的电压却只有-16V左右。</p> <table> <tr> <th>升压输出</th> <th>反转后</th> </tr> <tr> <td><img src="//image.lceda.cn/oshwhub/5a81c4f51301441589f6b641c1e1d080.jpg" alt="879b5f4871d31c6a9da4de48daa88af.jpg"></td> <td><img src="//image.lceda.cn/oshwhub/e22f0d051641419abdba3e811b818b6d.jpg" alt="a9587eab0ea6149f446eb38ea925684.jpg"></td> </tr> </table> <p>虽然也能够将屏幕点亮,但显示效果一般。所以在后续硬件调试中我进行了改进。</p> <p><strong>我采取了使用两块PCB的方案,一是因为分成VFD屏幕模块和控制主板两个模块方便我们进行硬件调试,二是这样做也可以缩小PCB的面积,因为屏幕那一面是不放器件的,否则屏幕那一面焊上之后下面的电路要是有什么问题就没办法拆下来了</strong>。</p> <p>所以我们需要用一个6Pin的排针将控制引脚(DA、CP、CS、EN)和电源(5V、GND)引出,方便后面VFD屏幕模块和控制主板之间通过排针和排母进行连接。</p> <p>左边为主控板上的排母接口,跟据芯片手册将EN和5V直接相连,实现上电启动,断电关闭的功能。右边为VFD屏幕模块上的排针接口,在5V和GND之间用一个二极管防反接,如果烧坏了得及时跟换。</p> <div align="center"> <img src="//image.lceda.cn/oshwhub/74c075fd59f24a57841e13b1a4223a1d.png" width="80%" height="80%"> </div> <h3><strong>电源管理</strong></h3> <p>锂电池购买连接https://m.tb.cn/h.gjcTRsKs7dlS0Hf?tk=dhb63XhBg6n 这里商家说的是送2.54mm的接头,为此我还特意在原理图中留了座子,但是我感觉他这个有问题或者我选错了,最后大小不合适,我就将线剥开直接焊在了板子上有点不太利于插拔。 <img src="//image.lceda.cn/oshwhub/813585a82fc5496f9b6800edd81d2043.png" alt="ec566447dfa274b5d4c62e827e194c8.png"></p> <p>因为设计之初的想法就是希望这个摆件可以插上TYPE-C工作也可以独立工作,那么电源就是必不可少的。为了体积小巧耐用,我选择了使用锂电池。锂电池的尺寸需要跟据PCB的尺寸来选择。如果想要它能够工作的更久,可以选择第二款大容量的锂电池。而使用电池就要考虑到充电与放电。我采用的是TP5400 锂电池充电和升压控制芯片。</p> <h4><strong>TP5400电源管理芯片</strong></h4> <p>TP5400 为一款移动电源专用的单节锂离子电池充电器和恒定 5V 升压控制器,充电部分集高精度电压和充电电流调节器、预充、充电状态指示和充电截止等功能于一体, 可以输出最大 1A 充电电流。而升压电路采用CMOS 工艺制造的空载电流极低的 VFM 开关型 DC/DC 升压转换器。其具有极低的空载功耗(小于10uA),且升压输出驱动电流能力能达到 1A。无需外部按键,可以即插即用。以下为芯片手册中给出的电路设计图:</p> <div align="center"> <img src="//image.lceda.cn/oshwhub/40df241efc7843329c300def4983faef.png" width="80%" height="80%"> </div> <p>各引脚说明</p> <ul> <li>VOUT(引脚 1):输出电压检测引脚。 连接升压 5V 输出端。</li> <li>CHRG(引脚 2):充电中漏极开路输出的充电状态指示端。当充电器向电池充电时,CHRG 管脚被内部开关拉到低电平,表示充电正在进行;否则 CHRG 管脚处于高阻态。</li> <li>PROG(引脚 3):充电电流设定、充电电流监控和停机引脚。在该引脚与地之间连接一 个精度为 1%的电阻器 Rprog可以设定充电电流(典型电路中的1.1K则设置为1000mA的充电电流)。当在恒定电流模式下进行充电时,引 脚的电压被维持在1V。PROG 引脚还可用来关断充电器。将设定电阻器与地断接,内部一个 2.5μA 电流将 PROG 引脚拉至高电平。当该引脚的电压达到 2.7V 的停机门限电压时,充电器进入停机模式,充电停止且输入电源电流降至 40μA。重新将Rprog与地相连将使充电器恢复正常操作状态。 </li> <li>TDBY (引脚 4):电池充电完成指示端。 当电池充电完成时 STDBY 被内部开关拉到低电平,表示充电完成。除此之外, STDBY 管脚将处于高阻态。</li> <li>VCC(引脚 5):充电器输入电源电压。充电输入电源引脚。典型值 5V,并应通过至少 一个 10μF 电容器进行旁路。当 VCC 降至 BAT 引脚电压的 30mV 以内,TP5400 充电部分进入停机模式。</li> <li>BAT(引脚 6):充电电流输出。该引脚向电池提供充电电流并将最终浮充电压调节至4.2V。该引脚的一个精准内部电阻分压器设定浮充电压,在停机模式中,该内部电阻分压器断开,升压模式下内部工作电源。</li> <li>GND(引脚 7):地 </li> <li>LX(引脚 8):升压电路内部功率管输出端。 </li> </ul> <div align="center"> <img src="//image.lceda.cn/oshwhub/4b646d09dda84db2a3680c8beb98b2f0.png" width="50%" height="50%"> </div> <p>在手册的基础上做一定的修改,给出电路设计图如下:</p> <p><img src="//image.lceda.cn/oshwhub/fcfd22d7f9a74d9b868316fbe55717c4.png" alt="f6d82835a09310f23657dba7cf4f533.png"></p> <p>红色指示灯代表锂电池正在充电,当红色灯熄灭,绿色灯亮起代表电池已充满电。</p> <p>引脚PROG所接的电阻决定了充电电流大小,但是充电电流越大芯片发热也会越严重。而这也会影响温湿度的检测。我在这里选择了3K的电阻,此时不会有明显的发热。(这里建议使用的电阻阻值不要低于1.1K,更低我也没试过,可能有风险)</p> <h4><strong>ADC检测</strong></h4> <p>锂电池相对来说还是比较有风险的,就需要做一个ADC检测电路了,方便观察锂电池的电压。锂电池过充或者过过放都会降低锂电池的寿命。</p> <p>电池的最大电压为4.2V,最小工作电压3.2V(要根据具体情况确定)如果使用ADC直接测量电池的电压,那么它无法测量3.3V以上的电压。为了解决这个问题,我们可以通过电阻分压的形式测量电池电压。电阻的大小可以根据IO口电平计算,分压后不要超过IO口容忍的电压的即可,选取一个合适的值。这里我们选择最常用的10K电阻进行分压。</p> <div align="center"> <img src="//image.lceda.cn/oshwhub/90761f9613e2481ca206e5336f59e130.png" width="50%" height="50%"> </div> <h4><strong>TMI3411</strong></h4> <p>这样我们就已经得到一个5V的电压为VFD屏幕模块提供电压。但是单片机无法承受5V的供电电压,所以这里还需要一个3.3V的电压。但如果采取分压的方式来得到就太浪费功率了,150mah根本撑不了多久。所以电路设计中我们能节省功率就尽量节省。于是我采用了梁山派上TMI3411的DCDC方案将5V转换为3.3V为单片机供电</p> <p><img src="//image.lceda.cn/oshwhub/ad03cb3dca9d4ba39513e3ee5dde0a6d.png" alt="d0c7645e9653f5ff0328cd2bc2b2e2c.png"> <img src="//image.lceda.cn/oshwhub/1c0a0e28013549df958917689dc8c2f8.png" alt="c052f9783d84b24bdc9ce58c885897c.png"> 跟据芯片手册中案例和说明,只需要控制反馈回路两电阻的比值,就能让芯片输出我们想要的电压。这里450K的电阻并不好买,建议换用100k和22k的搭配。</p> <h4><strong>电源其余部分设计</strong></h4> <p>除了锂电池充放电、5V、3V3三个部分外,还需要TYPE-C接口、开关、保护电路。</p> <p><strong>TYPE-C接口</strong>:方便我们通过用充电线给锂电池充电,由于这里我用的4PIn的排针进行烧录的,所以这里TYPE-C只需要几个引脚就行了,便宜还好焊接。其实如果想方便一些,也可以使用CH340,这样就可以直接使用数据线进行烧录了,但就需要更换更多Pin的TYPE-C座</p> <p><strong>拨码开关</strong>:由于需要开启和关闭功能,当打开开关时将VOUT和5V连通。我用了一个我之前使用过的拨码开关,就不需要再买物料了。建议大家也可以在平时的Diy设计中使用自己之前买来没用完的物料,节约成本的同时,也可以间接锻炼自己的硬件设计能力。(其实这里换成一个更大一点的开关,放在和按键一样的内层。更为美观和方便使用一些)</p> <p><strong>保护</strong>:在各接入口加了TVS管,用来吸收浪涌电压。VOUT处已经有滤波了,就没有再加了。而3V3是为芯片供电的,所以保险也加了一个,DCDC方案所产生的纹波往往比LDO(<strong>发热严重会导致,温湿度传感器测不准</strong>)要大得多,所以主控的输入还有磁珠来抑制纹波,以确保电源质量。</p> <p><img src="//image.lceda.cn/oshwhub/7a82b6a2546f47c4a3033f193208ee46.png" alt="98b5601fd72a60c56f488dc78764294.png"></p> <h3><strong>SHT40温湿度传感器模块</strong></h3> <p>温湿度传感器是用于测量环境温度和相对湿度的设备。它通常由传感元件、信号处理电路和输出接口组成。盛思锐的这款SHT40,体积小巧,测量值也很准确,在温湿度传感中也算是性价比很高的了。这样的小模块买来就能用,而且还方便取下来,可以随时用在别的项目上。</p> <div align="center"> <img src="//image.lceda.cn/oshwhub/c6179220af8c4491a35308e7f9d01f7e.png" width="60%" height="60%"> </div> <p><strong>传感元件</strong>:常用的技术包括热敏电阻、电容式湿度传感器、半导体传感器等。热敏电阻是基于材料的温度敏感性来测量温度的,而电容式湿度传感器则利用湿度与电容之间的关系进行测量。半导体传感器既可以测量温度,又可以测量湿度,是一种多功能传感器。 <strong>信号处理电路</strong>:用于将传感元件获取的信号进行放大、滤波、线性化等处理,确保传感器输出的准确和稳定性。 <strong>输出接口</strong>:可以是模拟信号接口或数字信号接口,用于将传感器测量的温湿度数据传输给其他设备进行进一步处理或显示。</p> <div align="center"> <img src="//image.lceda.cn/oshwhub/bc619c542ae04e608f419959f26c16d4.png" width="70%" height="70%"> </div> <p>并且应用电路简单,只需要通过一个4Pin的排针,为模块供电和两路IIC接口(需要上拉)即可</p> <div align="center"> <img src="//image.lceda.cn/oshwhub/5cbdb81704af4806b5d1c55db880274b.png" width="40%" height="40%"> </div> <h3><strong>主控电路</strong></h3> <p>主控芯片是和官方案例一样的主控STM32G030K6TK,之前没用过,试一下。便宜的同时可以使用CubeMX配置,方便软件设计。(这是个大坑,网上的资料还很少,给我之后的设计带来了很多困难,快把芯片手册都翻烂了,有些问题都没有解决。建议大家自己设计的时候如果不是为了学习一下没用过的芯片,还是尽量用自己熟悉的或者网上资料更丰富的芯片) </p> <p>其实很推荐使用<strong>ESP的芯片</strong>,可以通过网络获取时间,就几乎没有误差。使用RTC实时时钟误差还是大了一些。而且这是我第一次做实时时钟,有一个<strong>致命的问题在设计之初忘记考虑了</strong>,那就是这里芯片作为时钟的功能在断电的时候还需要给它提供备用电。而我这里开关关闭时就真的完全断电了。。。(后面只能采用刮铜飞线的方式解决了,在硬件调试部分会讲)</p> <div align="center"> <img src="//image.lceda.cn/oshwhub/e1dce77a29044fce8ab09fbe85d76a43.png" width="70%" height="70%"> </div> <p>其余的电路还是很简单的,主要就是一些功能按键(我使用的是卧贴的一种按键,大小合适,方便从两块板子中间的空隙按,具体可以看3D预览)和一个32.768KHz的外部无缘低速晶振提供时钟。</p> <div align="center"> <img src="//image.lceda.cn/oshwhub/55e59fd447ec4e7d982cae954ddbe2da.png" width="60%" height="60%"> </div> <p>这里我还为主控添加了一颗工作指示灯,它自带时钟可以随着时间自动变色,非常炫酷好看的同时方便硬件的调试。</p> <h3><strong>机械部分</strong></h3> <p>在两块板子之间只依靠排针排母肯定是没法固定的,于是在PCB上添加了M2的定位孔然后采用铜柱连接接固定,并且最外围两侧使用了两片cnc的亚克力板做外壳。保护电路和屏幕的同时更加好看。</p> <p><img src="//image.lceda.cn/oshwhub/65d0f41797104a3ea1fdcd40a778eb7c.png" alt="3259624e5c96cdb33ab7e137b12ed67.png"></p> <p>现在的亚克力板定制非常方便,只需要在淘宝给商家提供一些二维的尺寸图就可以了,而且价格也不贵,两片亚克力花了10块,应该和雕刻难度也有关。</p> <p>亚克力定制链接:<a href="https://m.tb.cn/h.g8GFnTpWrUkhkXz?tk=njpF3XQXFxx" target="_blank">https://m.tb.cn/h.g8GFnTpWrUkhkXz?tk=njpF3XQXFxx</a> 铜柱:<a href="https://m.tb.cn/h.g89xjIE6SMDWglG?tk=5X6t3XQdXkZ" target="_blank">https://m.tb.cn/h.g89xjIE6SMDWglG?tk=5X6t3XQdXkZ</a> 螺丝:<a href="https://m.tb.cn/h.g8GEalCAvfZnqvZ?tk=jivw3XQ2bPw" target="_blank">https://m.tb.cn/h.g8GEalCAvfZnqvZ?tk=jivw3XQ2bPw</a></p> <p><strong>铜柱</strong>:需要选M2<em>11+3的拿来固定两个PCB和控制板一端(可以看实物图仔细想一想连接方式就懂了)M2</em>11的用于VFD屏幕和亚克力之间的支撑。 <strong>螺丝</strong>:选M2<em>4到M2</em>8之间的都行,主要是为了固定亚克力板。</p> <div align="center"> <img src="//image.lceda.cn/oshwhub/78eb77ac679848efacf3f6b157abc69c.png" width="80%" height="80%"> </div> <p>可以看到实物的整体还是偏厚了一些,可以定制亚克力板是将厚度要求更低一些1mm~2mm最优。并且两端的铜柱也可以跟据实际压缩距离,在烧录完代码之后也可以将排针取下。这样下来应该还能够缩短1.5cm左右</p> <p><img src="//image.lceda.cn/oshwhub/97af54280f384fecb5a65a4578f9332f.png" alt="dc42388dea379d253caa3b0ebc9ee5b.png"></p> <h2>PCB设计说明</h2> <p>这里PCB设计并没有太多讲究,主要就是布局得模块化,驱动板参考商家的布局就好。控制板将电源部分靠近板边集中摆放,减小DCDC产生的干扰。元件摆放不能过密,以方便后续调试。</p> <p>并且温湿度检测模块需要远离发热的部分,从而增加检测的准确度(其实这里已经将SHT40悬空对着PCB摆放了,相当于和板子做了一个简单的隔离的同时,又尽量的防止了落灰影响检测)。</p> <p><img src="//image.lceda.cn/oshwhub/c79e8bd3b05a461a9ebd62a6fb97f0ad.png" alt="a38c12afe44537ca3f51df0d34a5813.png"> 注意过大电流的地方可以采用走更粗的线,或者铺铜的方式(可以提前在网络管理器中将网络分好类,对应分配好规则)。</p> <p>在晶振底部和SHT40周围都需要禁止铺铜来进行隔离,最后画完之后添加上泪滴再修一下铜就行了。</p> <h2>硬件调试</h2> <h4><strong>注意</strong>:将VFD驱动板和控制板焊接好后,强烈建议先使用万用表检测电源与GND之间是否短路,虽然有保护措施,也很容易冒烟。。。我在一次测量电压时,手滑探针不小心把24V处碰短路后MT3608直接冒烟了。而且这个屏幕引脚非常多,焊上去之后就难以完整将其取下来了,当然如果你是焊武帝当我没说。</h4> <h4>以及TP5400有过热保护,在焊接温度影响下可能触发,如果发现其在锂电池单独供电下不工作,可能需要插上TYPE-C重新激活一下。</h4> <h4><strong>反向电压偏低</strong></h4> <p>我尝试在输出端多并联几颗电容。将C34、C35替换成了22uF,将C33替换成了47uF。于是输出电压变成了-21V左右。已经足够点亮屏幕了。</p> <div align="center"> <img src="//image.lceda.cn/oshwhub/919abcaec4ed49d090c9d2ba09c91ea1.png" width="70%" height="70%"> </div> <p>我猜测可能是由于二极管的电压降造成的。但是又不太科学,这里已经采用了肖特基二极管,肖特基二极管具有更低的正向电压降,所以也不至于产生这么大的误差。并联在输出端的电解滤波电容可以提升输出电压,这是因为电容在滤波过程中可以累积电荷,从而提高输出电压。然而,电容的电压提升作用并不是无限的,它受到电容本身的容量和电路设计的影响。在实际操作中,电解电容滤波后能提升的电压大约是其额定电压的1.4倍。其实我觉得这里使用一个运放来完成电压的反转可能效果更好一下。(要是有大佬知道原因,希望告知一下原因)</p> <h4><strong>TYPE-C供电屏幕不亮</strong></h4> <p>这个电源管理我本来以为应该没有什么问题,但实际只有当锂电池单独供电时才能让屏幕正常工作(此时VOUT为率高于5.00V,驱动板上高压率高于-21.50V),而给锂电池充电时屏幕不亮。</p> <p>我查了很久手册,我一开始以为是输出电容不够大导致芯片工作不稳定的原因。于是尝试了和驱动板一样的方法将输出电容进行替换。一开始插上TYPE-C时,用万用表测量VOUT引脚,发现此时VOUT电压只有3.6V左右。当输出电容变大之后差不多3.9V,驱动电压只有-18V,不足以点亮屏幕。</p> <p>后面我将到后级电路的3V3断开,再插上充电线,虽然此时5V处只有4.2V左右,但是驱动电压来到了-21V已经足够了。所以可能是这部分电路分走了电压,导致供电不足。</p> <div align="center"> <img src="//image.lceda.cn/oshwhub/91d53f22b9e04644bfe382892cf16225.png" width="80%" height="80%"> </div> <p>虽然芯片手册中没有说,但其实真正的原因可能是因为TP5400芯片工作在充电模式时不能同时升压,导致VOUT没有5V。我在之前使用这款芯片时由于对电压的要求并不高,所以一直没注意到这个问题。</p> <p>我想出的解决方法就是利用一个mos管,在TYPE-C供电时不再将VOUT提供给5V电压。而是直接将VBUS直接供电给5V处,这样应该就可以解决这个问题了(实际我并没有尝试,因为得重新打板子)。具体设计如下:</p> <div align="center"> <img src="//image.lceda.cn/oshwhub/e21710301ac24669b54fae09177e7f22.png" width="80%" height="80%"> </div> <p>在TP5400的输出端添加了一个mos管 当VBUS = 0V时,即锂电池单独供电时,Vg < Vs, MOS管导通,VOUT输出和原来一样在5V左右。 当VBUS = 5V时,即TYPE-C供电时,Vg > Vs ,MOS管截止,VBUS通过二极管流向VOUT,相当于C口直接为后级电路供电。 </p> <h4><strong>时钟无备用电源</strong></h4> <p>在设计之初我并没有考虑到这个时钟的功能是不能完全断电的,它可以暂停显示,但芯片还是需要一直运行RTC的。所以导致我这里断电时,整个系统就真的完全断电了。所以在不想重新打板的前提下,我选择了刮铜飞线。</p> <div align="center"> <img src="//image.lceda.cn/oshwhub/8ba63943358043d2b4063d44e5865f1d.png" width="80%" height="80%"> </div> <p>跟据原理图,3V3的输入为5V,开关关闭时就会将VOUT和5V断开。在不影响开关控制显示的基础上,我选择将开关到TMI3411的5V切断,改用VOUT直接输入到TMI3411的5V。也就是图中粉色铺铜区。</p> <p>需要注意在割铜时需要彻底小心的彻底隔断,因为这里并不是线而是一片区域,并且为显示模块供电的5V也是从这里走线的。(所以操作上还是有一定难度的,请量力而行!!!可以选择2.0版本已经改好的PCB)。我就不小心将其割断了,又往后面多飞了一条线。</p> <div align="center"> <img src="//image.lceda.cn/oshwhub/0d323c16a9fb47bc919a99643d4d447a.jpg" width="80%" height="80%"> </div> <p>刮好之后需要万用表测一下是不是完全刮断开了,以及别的地方有没有短路。强烈建议有一瓶洗板水,便于清洁板子。 洗板水:<a href="https://m.tb.cn/h.gjyoe5IFYhElZkC?tk=KJA13XMX4aD" target="_blank">https://m.tb.cn/h.gjyoe5IFYhElZkC?tk=KJA13XMX4aD</a> </p> <p>黑色线为将TP5400的VOUT引脚(或者旁边二极管下端,哪个方便焊哪个)连接到TMI3411的5V处(尽量含在旁边滤波电容处)</p> <div align="center"> <img src="//image.lceda.cn/oshwhub/66f535d748054e96a1d4e85b4c3eeb6f.png" width="80%" height="80%"> </div> <p>红色线为开关5V处到为后面供电的线处将表免阻焊层刮开焊接上。但这样仍存在一些问题,在开关断开时,由于3V3供电仍然存在,所以工作指示灯也会一直亮着。所以如果介意的话可以调试完之后就将这颗灯拆掉,或者干脆一开始就不要这颗LED。</p> <h2>软件设计</h2> <p>在附件的用户资料中有商家提供的参考代码,但是完全没有注释,且是用基于STM32F103的标准库写的。如果要适配到STM32G030且用HAL库的话,还是需要改挺多地方的。关于芯片包的下载和环境配置我就不再赘述了,可以查看官方文档和直播回放。</p> <p>文档:<a href="https://www.yuque.com/wldz/jlceda" target="_blank">https://www.yuque.com/wldz/jlceda</a><br> 直播回放:<a href="https://www.bilibili.com/video/BV1Ay411B7MF/?vd_source=a2cfa7ab4c27b82528b05c71931dcf02" target="_blank">https://www.bilibili.com/video/BV1Ay411B7MF/?vd_source=a2cfa7ab4c27b82528b05c71931dcf02</a></p> <p><strong>点亮屏幕:</strong></p> <p>首先我们需要做的第一步就是要先把屏幕点亮,以下是需要修改的地方,有遗漏的话请查看附件最终版工程文件</p> <pre><code>#define SET_PT6315_CS GPIO_SetBits(PT6315_PORT, PT6315_CS_PIN) #define CLR_PT6315_CS GPIO_ResetBits(PT6315_PORT, PT6315_CS_PIN) #define SET_PT6315_CLK GPIO_SetBits(PT6315_PORT, PT6315_CLK_PIN) #define CLR_PT6315_CLK GPIO_ResetBits(PT6315_PORT, PT6315_CLK_PIN) #define SET_PT6315_DATA GPIO_SetBits(PT6315_PORT, PT6315_DATA_PIN) #define CLR_PT6315_DATA GPIO_ResetBits(PT6315_PORT, PT6315_DATA_PIN) </code></pre> <p>这是屏幕案例中的宏,GPIO_SetBits(PT6315_PORT, PT6315_CS_PIN)这个函数在HAL库中相同的功能为HAL_GPIO_WritePin(PT6315_PORT, PT6315_CS_PIN, GPIO_PIN_SET) </p> <pre><code>void vfd_gpio_config(void) { GPIO_InitTypeDef GPIO_InitStructure; RCC_APB2PeriphClockCmd(PT6315_RCC_PERIPH, ENABLE); GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; GPIO_InitStructure.GPIO_Pin = PT6315_CS_PIN | PT6315_CLK_PIN | PT6315_DATA_PIN; GPIO_Init(PT6315_PORT, &amp;GPIO_InitStructure); } </code></pre> <p>上面为标准库配置引脚的函数,但在HAL库中就不再需要了,可以直接在CubeMX中配置就可以了。 </p> <pre><code>static const unsigned char font[][3] = { 0x8a,0x88,0x06,//0 0x84,0x80,0x08,//1 0x82,0x0f,0x06,//2 0x82,0x87,0x06,//3 0x88,0x87,0x00,//4 0x0a,0x87,0x06,//5 0x0a,0x8f,0x06,//6 0x82,0x80,0x00,//7 0x8a,0x8f,0x06,//8 0x8a,0x87,0x06,//9 0x8a,0x8f,0x00,//A 0x8b,0x8f,0x07,//B 0x0e,0x08,0x0e,//C 0x87,0x88,0x07,//D 0x0f,0x0f,0x0f,//E 0x0f,0x0f,0x01,//F 0x0e,0x8c,0x06,//G 0x8d,0x8f,0x09,//H 0x22,0x22,0x06,//I 0x84,0x88,0x0f,//J 0x4d,0x4B,0x09,//K 0x09,0x08,0x0f,//L 0xdd,0x8a,0x09,//M 0x9d,0xca,0x09,//N 0x8f,0x88,0x0f,//O 0x8b,0x0f,0x01,//P 0x8a,0xc8,0x06,//Q 0x8b,0x4f,0x09,//R 0x0e,0x87,0x07,//S 0x27,0x22,0x24,//T 0x8d,0xc8,0x8f,//U 0x95,0xc2,0x08,//V 0x8d,0xda,0x09,//W 0x55,0x52,0x09,//X 0x55,0x22,0x04,//Y 0x47,0x12,0x0f,//Z 0xff,0xff,0xff,//全显示 }; </code></pre> <p>该数组为显示的内容,商家资料中并没有给我们设置显示图案的具体方法。但是跟据下面这张图片我们可以反向推测,它大概是跟据BCD码来控制的。拿这个举例0x82,0x87,0x06,//3 3对应亮起的灯管为0、1、2、7、8、9、10、15、16、17、18、19 对应二进制数为(0表示点亮)0001 1110 0001 1110 0000 xxxx ==》87 87 0x</p> <p>虽然不对,但差不多应该是这个原理,可以跟据已经给出的图形去推测(因为这里我只想要一个%来表述湿度,试了几下就出来了,就没去推了),多试几下就能试出来你想要的图案了。 </p> <p><img src="//image.lceda.cn/oshwhub/92de4dacea614e46af8f6a90d242ba05.png" alt="屏幕引脚图.png"></p> <p>下面为字符显示函数,传入的需要是一个字符变量,但是我们想要显示的温度和湿度的数值需要进行一下校准和计算,这个变量再进行强制类型转换后传入该函数会有问题,显示不了。</p> <pre><code>void display_char(unsigned char pos, unsigned char data, unsigned char dot) { unsigned char display_buffer[3]; if ( pos > 5 ) { return ; } if ( data >= '0' &amp;&amp; data &lt;= '9' ) { display_buffer[0] = font[data - '0'][0]; display_buffer[1] = font[data - '0'][1]; display_buffer[2] = font[data - '0'][2]; } else if ( data >= 'A' &amp;&amp; data &lt;= 'Z' ) { display_buffer[0] = font[data - 'A' + 10][0]; display_buffer[1] = font[data - 'A' + 10][1]; display_buffer[2] = font[data - 'A' + 10][2]; } else { return; } if ( ( pos == 1 || pos == 3 || pos == 4 ) &amp;&amp; dot ) { display_buffer[2] = display_buffer[2] | 0x10; } unsigned char temp; temp = pos * 3; CLR_PT6315_CS; pt6315_write_byte( 0xC0 | temp ); pt6315_write_byte(display_buffer[0]); pt6315_write_byte(display_buffer[1]); pt6315_write_byte(display_buffer[2]); SET_PT6315_CS; delay_ms(1); } </code></pre> <p>我的解决方法是跟据这个函数又修改了一下,可以直接传入int类型。记得delay这个函数如果不自己写是没有的,可以用HAL_Delay()函数替代</p> <pre><code>void display_num(uint16_t pos, uint16_t data, uint16_t dot) { unsigned char display_buffer[3]; if ( pos > 5 ) { return ; } if ( data >= 0 &amp;&amp; data &lt;= 9 ) { display_buffer[0] = font[data - 0][0]; display_buffer[1] = font[data - 0][1]; display_buffer[2] = font[data - 0][2]; } else { return; } if ( ( pos == 1 || pos == 3 || pos == 4 ) &amp;&amp; dot ) { display_buffer[2] = display_buffer[2] | 0x10; } unsigned char temp; temp = pos * 3; CLR_PT6315_CS; pt6315_write_byte( 0xC0 | temp ); pt6315_write_byte(display_buffer[0]); pt6315_write_byte(display_buffer[1]); pt6315_write_byte(display_buffer[2]); SET_PT6315_CS; HAL_Delay(1); } </code></pre> <p>dot这个参数的意思是当位选为1、3、4时,传入如果为1的话,屏幕上时间的哪个:的灯就会点亮,其中4的那位为小数点。</p> <p><strong>温湿度&ADC:</strong><br> 这个部分直播和文档中已经讲的很仔细了,稍微抄一下就行了。</p> <p><strong>配置按键功能:</strong> 本来按键肯定是用中断来搞的,但是出现了非常玄学的问题,我在main里配置了一直显示这个A以确保屏幕是能正常运行的。</p> <p>我按照直播中的过程配置了中断,刚开始是配置好了之后莫名其妙按了不亮,后面又突然有反应了,就出现了如图的现象。这里按下按键之后代码已经进入了中断服务函数之中,并且执行了第一句,但是突然就不执行之后的代码了。后面我又尝试了不同的方法,但是不仅没用,连进入中断都进不了了。。。并且网上也不太能找到相关的代码资料。 </p> <div align="center"> <img src="//image.lceda.cn/oshwhub/7a6d3a783db14d749f65e32e0c84b29e.png" width="80%" height="80%"> </div> <p>所以最后无赖之下我只能使用按键扫描的方式来实现功能,虽然这样的效率很低,但是好在这里对执行速度没有太高的要求,并且执行的代码也没多复杂。所以也能实现功能。</p> <p>最后的效果是按下一个按键显示温度,另一个按键显示湿度(这里我没有用定时器计时,就简单的用循环加上delay来实现显示几秒,凭感觉就行,又回到时钟状态),wake按键我并没有配置,因为荧光屏所消耗的功率本身就很高,而且我用的电池也很小。所以我将这个按键配置成了显示电池电压的功能。如果有需要可以参考官方案例配置芯片低功率模式,用wake键唤醒。</p> <p><strong>RTC实时时钟:</strong> </p> <p>我也是第一次做RTC实时时钟,但感觉这个误差还是比较大的,两三小时就会有好几秒的误差,所以想要精确的时间可以尝试用ESP的芯片做主控,联网获取时间。</p> <p>江科协:<a href="https://www.bilibili.com/video/BV1th411z7sn?p=41&amp;vd_source=a42adc182640300fc671655cd3a45f00" target="_blank">https://www.bilibili.com/video/BV1th411z7sn?p=41&amp;vd_source=a42adc182640300fc671655cd3a45f00</a></p> <p>HAL库时钟:<a href="https://www.bilibili.com/video/BV1pm421g77H/?spm_id_from=333.337.search-card.all.click&amp;vd_source=a42adc182640300fc671655cd3a45f00" target="_blank">https://www.bilibili.com/video/BV1pm421g77H/?spm_id_from=333.337.search-card.all.click&amp;vd_source=a42adc182640300fc671655cd3a45f00</a> </p> <p>江科协的视频中详细的介绍了时钟相关的理论知识和代码配置过程,但它使用的是标准库,如果想用HAL库复现可以参考第二个视频,有详细的过程。</p> <p>在CubeMX中需要配置好LSE:</p> <p><img src="//image.lceda.cn/oshwhub/b0621f65713b47e1b1243fdbc9842414.png" alt="15e824fc058fc66a2b24a34bd9da470.png"></p> <p><img src="//image.lceda.cn/oshwhub/c45421799859420cbc83351b74204f17.png" alt="830a635c2b1d13bfee70eff55f53794.png"></p> <p>但HAL库所提供的时间设置函数是存在一定问题的,在掉电时只有时分秒会备份,但是date中年月日的数据会丢失。解决方法是将年月日时分秒均换算成秒再来储存,最后调用时再将数据进行处理显示出来,但其实我只想获得时分秒的数据,年月日的数据我并不需要接下来的操作也可以不用管。 </p> <p>目的就是将附件中实时时钟标准库的代码改成HAL库,但是我并没有找到RTC_WriteTimeCounter和RTC_WriteReadCounter这两个寄存器,连接中文档又没有开源出来,我就只把代码中的那个时间的数组适配到了我的rtc.c中,方便我修改时间,不然每次都得到CubeMX中重新修改。</p> <pre><code>/* USER CODE BEGIN 0 */ //定义全局的时间数组,数组内容分别为年、月、日、时、分、秒 uint16_t MyRTC_Time[] = {2024, 7, 24, 22, 46, 0}; /* USER CODE END 0 */ </code></pre> <p>需要注意的是,修改完代码烧录之后,其他功能都是没问题的,但是由于时间数据已经备份到BKP中,使用时间是不会跟据你的修改变的。解决的方法也很简单,只需要在每次重新修改代码时更改if中0xA1A5这两处的值(需要一致)因为只有当这个值不等于这个时,他才可以重新设置时间。</p> <pre><code>if(HAL_RTCEx_BKUPRead(&amp;hrtc,RTC_BKP_DR1)!= 0xA1A5){ /* USER CODE END Check_RTC_BKUP */ /** Initialize RTC and set the Time and Date */ sTime.Hours = MyRTC_Time[3]; sTime.Minutes = MyRTC_Time[4]; sTime.Seconds = MyRTC_Time[5]; sTime.SubSeconds = 0; sTime.DayLightSaving = RTC_DAYLIGHTSAVING_NONE; sTime.StoreOperation = RTC_STOREOPERATION_RESET; if (HAL_RTC_SetTime(&amp;hrtc, &amp;sTime, RTC_FORMAT_BIN) != HAL_OK) { Error_Handler(); } sDate.WeekDay = RTC_WEEKDAY_MONDAY; sDate.Month = MyRTC_Time[1] - 1; sDate.Date = MyRTC_Time[2]; sDate.Year = MyRTC_Time[0] - 1900; if (HAL_RTC_SetDate(&amp;hrtc, &amp;sDate, RTC_FORMAT_BIN) != HAL_OK) { Error_Handler(); } /* USER CODE BEGIN RTC_Init 2 */ HAL_RTCEx_BKUPWrite(&amp;hrtc,RTC_BKP_DR1, 0xA1A5); } /* USER CODE END RTC_Init 2 */ }</code></pre> <h2>视频演示功能</h2> <p>b站链接:<a href="https://www.bilibili.com/video/BV15TeCeoEXy/?spm_id_from=333.999.0.0" target="_blank">https://www.bilibili.com/video/BV15TeCeoEXy/?spm_id_from=333.999.0.0</a></p> <h2>更进一步</h2> <ul> <li>由于这里商家所提提供的屏幕资料少的可怜,我就并没有尝试去进一步优化显示的效果。像淘宝也有很多卖VFD桌面时钟的贵的有300多的。在显示时有翻页的效果,大佬可以尝试一下。这应该需要一个很长的数组去实现,但是这个屏幕的“分辨率”并不是很高,所以就算做出来可能效果也不见得很好。</li> <li>在续航方面,它还有很大的空间,最简单的方法就是氪金,使用更大容量的电池。其次就是提高电源管理部分的效率,减小发热。以及在不工作时让芯片都进入低功耗模式。</li> <li>外壳我只用了简单的亚克力,便宜的同时也很简约好看。如果愿意也可以自己画一个更完整精致的外壳,像按键部分也能套上橡胶垫增加手感。还有一些芯片的引脚支持触摸功能也可以尝试。 </li> </ul>

文档

BOM

暂无

附件

附件名 下载
VFD用户资料.rar
VFD_PROJECT_FINAL.rar
12-2 实时时钟.rar
VFD驱动板V1.0.zip
VFD主控板V1.0.zip

成员

评论(0)

  • 表情
    emoji
    小嘉工作篇
    小嘉日常篇
  • 图片
成功
工程所有者当前已关闭评论
goToTop
svg-battery svg-battery-wifi svg-books svg-more svg-paste svg-pencil svg-plant svg-ruler svg-share svg-user svg-logo-cn svg-double-arrow