液晶顯示定時器有點像小時侯戴過的多功能電子表的桌面版,功能減少了跑表、日歷星期顯示,但增加了倒計時、多組鬧鈴等功能。像下圖這樣的在電商活動的時候十塊錢內就能買到。

不過實物沒有寶貝頁面上的那么好看,外觀細節還有差別。有的情況是拍照效果的問題,有的是因為宣傳使用不是照片而是電腦制作的效果圖。不到十元的東西預期不能太高,關鍵在于液晶顯示的效果。我買過不少定時器了,深知這個不見實物不知底細的。


在極端的角度,就可能是下面這種完全不能看的效果。戴過電子表的同學應該有經驗,這種液晶的視角范圍有限度的。

主要是看它用的屏的最佳視角方向是哪個了,我覺得這款立在桌面用還行(帶一點俯視角度),如果是掛墻上仰視,效果要差不少。

能立起來放是因為背后它帶有一個折疊的小支撐,這個設計還不錯。也還粘了一塊軟的磁性材料,可以吸附在實驗室的鐵板、鐵架子上。最上面還可以用掛鉤鉤住。

打開電池蓋,可以看到電池正負極的鋼片是焊接在PCB上的。外殼是螺絲固定,拆掉螺絲后發現并沒有卡扣,可以輕松分離。

這拆解完全沒有難度。PCB暴露出來了:
什么,竟然是沉金工藝的FR4雙面板!
竟然是LQFP封裝的芯片!
竟然是STM32!

PCB另一面,連接液晶的導電橡膠條的觸點,以及按鍵的觸點都是沉金的,所以有良好的接觸。

再仔細看看芯片,STM32L053R8T6. 周圍還留出了好幾個測試焊盤,還有SWD調試接口的標志。
難道這是個工程樣機流出來了?

請EEWorld論壇@xutong幫忙分析一下BOM成本。這種液晶只要量大了成本很低,但MCU可是實打實的。

在這樣的定時器上用LQFP封裝的MCU,真是用料十足了!
最后有個細節,看這個STM32封裝表面那兩個凹的圓,里面是不光滑的。我印象中ST的片子,圓圈里面至少比較平整。

所以,為了降成本,它用的是拆機翻新的芯片?

xutong幫忙分析的BOM成本表
“拆解一個用料十足的多功能定時器”之前傳
我在去年淘寶618活動的時候買了一個多功能定時器:

上圖是寶貝頁面的照片,比實物要漂亮。但是包裝就很簡陋了,就一小紙盒,小商品市場的風格。畢竟賣得便宜呢,還包郵了。

當我裝上電池看顯示效果的時候,意外發現它的顯示在一通電時有,然后竟然漸漸消失!

試幾下都有問題,先懷疑是里面液晶接觸不良了,那就拆開處理一下。
開后蓋卸下電池

卸掉幾顆自攻螺絲之后殼子就分開了。
電路板是這種價位東西常見的電木板,還是單面設計。

PCB的元件面:COB封的專用ASIC芯片

其實原版的拆解現場是如上這樣的,就是廉價貨。
我用示波器查看了液晶的驅動波形,在剛通電的時候是正常的,但不久就消失了。我診斷結論是:芯片損壞。于是錄了視頻和賣家溝通,這個訂單退款了,貨不用退。
那么這個定時器尸體在我手上做什么用途呢?模具還挺好的,為了物盡其用,我就復刻一個吧。于是,過了很久,你們看到了我上面的帖子“拆解一個用料十足的多功能定時器”。我故意開了這樣一個玩笑,先不提“用料十足的定時器”并不是原版,而是我的復刻版。
于是就有了 STM32L053 出場。能支持這種段碼LCD的MCU并不是很普遍,在ST的產品里面只有 STM8L, STM32L 系列的某些型號。注意,LCD是交流驅動,不是方波驅動,因此不能用MCU的GPIO直接驅動,必須有控制器。STM32L053算是STM32中帶LCD驅動的價錢最低的。我最早用過STM8L152,后來發現淘寶出現了很便宜的STM32L053就買了幾片,再后來恍然明白便宜的原因是——翻新貨。不過自己玩的,買了就算了。

ST MCU里的LCD控制器支持最多8個COM端,32個SEG端。像這種定時器LCD大概率是4個COM端的(1/4 duty). MCU里面有電荷泵來產生驅動電壓,軟件可調節,也就能控制對比度。不過最高驅動電壓也有限制,不是能適配任何LCD的。
LCD直接接在GPIO上,引腳配置為LCD SEG或COM功能。另外要使用LSE,接32.768kHz的晶振做時間基準。
畫原理圖的時候要先確認LCD的電極中COMx的位置(余下的就是SEGx端),因為COM和SEG相當于行和列掃描線(打比方,這種LCD不是點陣的不存在行列說)是不可交換的。我是通過示波器測電路板驅動端的波形判斷的,一共有4個公共端,排在一頭。


復刻的關鍵在于測繪原來的PCB上的定位孔,和需要定位的元件的位置。最重要的LCD的電極的位置不能偏。我是用游標卡尺+直尺來量的,效率比較低;我還從來沒有試過拍照法。

用某創的沉金工藝免費打樣券,和我的其它電路一起拼著打了一塊PCB.
打樣回來,先檢查對位,沒問題了再焊接。

剩下就是焊接和軟件的工作了。因為軟件是自己做,功能也就可以自由發揮了。
首先需要測試LCD功能,確定每個驅動線組合COMx SEGy對應的LCD筆段是什么。對于STM32這個控制器,核心的配置寄存器是FCR和CR,它們決定了怎樣驅動:

而點亮(顯示)哪些筆段,由4個LCD RAM寄存器決定,每個寄存器對應一個COM端的掃描,bit[n]表示SEGn的筆段。用起來還是很簡單的。

我做了一個通用的測試程序:
int main(void){ int segsel, comsel; int show;gpio_config();RCC->APB1ENR |= RCC_APB1ENR_PWREN; __DSB(); PWR->CR |= PWR_CR_DBP; __DSB(); RCC->CSR |= RCC_CSR_RTCSEL_1|RCC_CSR_LSION;RCC->APB1ENR |= RCC_APB1ENR_LCDEN;uart_setup(); uart_wstr("\r\nLCD test");LCD->FCR = 3<<LCD_FCR_PS_Pos|15<<LCD_FCR_DIV_Pos|7<<LCD_FCR_CC_Pos|4<<LCD_FCR_PON_Pos;//|LCD_FCR_HD; LCD->CR = LCD_CR_DUTY_1|LCD_CR_DUTY_0|LCD_CR_BIAS_0|LCD_CR_LCDEN; // 1/4 duty, 1/2 biasLCD->RAM[0]=0; LCD->RAM[2]=0; LCD->RAM[4]=0; LCD->RAM[6]=0; LCD->SR = LCD_SR_UDR; // updateRCC->APB1ENR |= RCC_APB1ENR_TIM6EN; TIM6->PSC = 999; // prescaler TIM6->ARR = 999; // auto reload value TIM6->CR1 = TIM_CR1_URS|TIM_CR1_CEN; // start countercomsel=0; segsel=0; while(1) { if(TIM6->SR & TIM_SR_UIF) // check if overflow { TIM6->SR &= ~TIM_SR_UIF; // clear flag if(segsel<0 || segsel>13) { segsel=0; show=0; } show |= 1<<segsel;LCD->RAM[0]=show; LCD->RAM[2]=show; LCD->RAM[4]=show; LCD->RAM[6]=show; LCD->SR = LCD_SR_UDR; // update segsel++; } }}
當然這還不能區分每個COMx對應哪些,還需要換種切換方式才能判斷完整。
測試的時候在草稿紙上記錄下映射關系(這法比較原始):發現了5個8字的筆段映射是很有規律的。

確定完了就可以開發時鐘程序了。這種任務的確是8位MCU搞定都很輕松的。
資源推薦
精彩文章推薦
· END ·
請將我們設為“星標”,這樣就會第一時間收到推送消息。
歡迎關注EEWorld旗下訂閱號:“機器人開發圈”