發表文章

製作隔空感應的引擎轉速表 - 新唐N76S003計時器輸入捕捉的應用(Timer input capture)

圖片
先前說過, 用新唐1T 8051 N76S003製作的003Clock套件 不只是時鐘而已,設計時將所有IO接腳都拉出來了,因此它還能夠做其它有趣的應用! 這次分享一個應用實例是「隔空感應的引擎轉速表」。老樣子,會在留言區和GitHub提供完整程式碼。 https://github.com/danchouzhou/003Clock/blob/f8fa5d909b5bdadf008ea9de9164a25ca33d9015/firmware/Tachometer/main.c 引擎轉速信號 轉速表的基本原理都是測量點火之間的週期或頻率,使用類比電路、數位電路或MCU中的程式換算出轉速。那麼點火和引擎轉速有什麼關聯呢?我們看一下 維基百科可以得知,當今主流的四行程引擎運作時,720度中分為 進氣、壓縮、爆炸、排氣 共四個行程 ,其中爆炸行程就是靠與高壓線圈相連接的火星塞產生的火花,點燃在燃燒室中的壓縮混合氣,讓氣體溫度上升,膨脹時讓引擎產生動力。而高壓線圈可以在收到點火信號時,輸出數十KV讓火星塞產生火花。所以可以得知,點火與引擎轉速呈現線性關係,經過換算後即可得知引擎轉速。取得轉速信號最直接的方式當然就是把高壓線圈的點火信號拉出來用。 高壓線圈產生的EMI可以當成是轉速信號? 一般來說,雜訊在電路裡是我們不樂見的干擾源,但我卻將高壓線圈產生的電磁波當成是轉速信號。下圖是發動之後,將示波器探棒靠近引擎量到的波形,信號可是非常清晰的,注意喔,在這裡探棒並未直接與車輛電路相連,是隔空就能測得到信號。經過實際測試,將微控制器的IO用20公分左右的線接出來,並設定成pull-up模式(這可以避免輕微的雜訊誤觸發),接條線出來當天線靠近引擎,IO準位也會隨之跳動,完全不用額外的電路或感測器。如此以來不用改裝原車線路,就能夠「隔空」得到轉速信號。 在這邊將示波器時基設為50 ms/DIV、探棒設為1:1、垂直設為10 V/DIV,trigger level設成-20 V,可以看見trigger頻率是13.8 Hz,大約就是摩托車引擎怠速1600 RPM點火的頻率(後面會再講解頻率如何換算成轉速)。 如何得到兩次點火的間隔? 還記得 之前介紹過的計時器吧 !要得到兩次點火的間隔,可以開一個Timer並將IO設定成邊緣觸發的外部中斷,每次中斷發生時把Timer計數值讀取出來,再把Tim...

消除開關彈跳現象(de-bounce)、Timer delay、功能選單,以新唐N76S003為例

圖片
新年快樂,這是003Clock系列的第三篇文章,前兩篇沒跟上的記得回追一下喔! (一) 製作新唐N76E003/N76S003白光LED電子時鐘套件 (二) 以VS Code, SDCC, Git建立新唐8051編譯環境 (三)新唐N76E003/N76S003白光LED電子時鐘套件韌體技巧說明 Part 1: 消除開關彈跳現象(de-bounce)、Timer delay、功能選單,以新唐N76S003為例 Part 2:Timer auto-reload產生中斷來精確計時,以函式指標(unction pointer)切換中斷服務程式的功能 Part 3:以N76S003的SPI控制PT6961白光LED七段顯示器 (四)免用燒錄器更新韌體:NuMicro ISP Programming Tool 接下來要介紹003Clock的韌體技巧,文章寫到一半發現內容實在太多了,還是將它分為三篇來說明。完整程式碼請見GitHub source code。 https://github.com/danchouzhou/003Clock/blob/4cb1b697c0290f18e6e634b82753c02781767a5e/firmware/003Clock/main.c 開關除彈跳(de-bounce) 彈跳現象 理想的觸摸開關(Tact switch)應該是按下去形成導通,放開恢復為斷路。但實際上因為由機械構造組成的開關,在切換過程中會有一段時間像是彈簧一樣,接點反覆地開開合合,產生短暫的不穩定的情形,稱之為「彈跳現象」。這段不穩定的時間一般都會在50 ms以內結束。 如下圖所示,雖然我們只按了一下開關,但是卻測量到數個脈波。以前實習課拿開關當成計數器時脈的讀者一定很有經驗, 這種信號送進計數器,按一下肯定不是乖乖加1而已。 在韌體中單純在一個迴圈不斷用if確認開關的邏輯電位,也會讀到數個脈波,誤認按了好幾次,一定會降低使用者體驗的,因此開關除彈跳在設計上是必要的。   硬體除彈跳 開關除彈跳有人會從硬體著手, 在開關兩端直接並聯上一顆電容 ,直接與上拉電阻形成一個RC低通濾波器,這個方法很適合用在一些純硬體的電路上。 軟體除彈跳 微控制器其中一個有趣的地方就是,很多電路上遇到的問題,原先要用硬體解決的事情,運用微控制器則可以用軟體去解決。像我自己就喜歡用軟體除...

以多工掃描的方式驅動七段顯示器,要如何避免殘影現象?

圖片
很多人實作多工掃描驅動七段顯示器時都遇過「殘影」的情況,正好最近一個案子用到了多工掃描,順便把文章寫一寫紀錄起來,讓大家之後也能參考。 先來解釋一下「殘影」具體是什麼情況可以看下面這張比較圖, 左圖 可以看到每個位數有右邊一個位數的殘影; 右圖 則是多工掃描有處理好  這個案子客戶的要求不複雜,就是要一個可以1~6 KHz輸出頻率可調的方波產生器,外加斷電記憶的功能,下次復電要能輸出上次調整的頻率。當然,調整到幾KHz還是要讓使用者知道阿,於是我就選擇用四位數七段顯示器。 這次選用了新唐的MG51FB9AE,因為它可以跑在24 MHz,而之前常用的N76S003是16 MHz,兩顆是pin-to-pin相容的。在這邊會需要較高的時脈速度並不是為了運算效能,而是輸出頻率的解析度,因為PWM或Timer輸入頻率越高,輸出的除頻步數就要越多,頻率解析度也會越高。如果對輸出頻率或duty cycle精度有要求的讀者,這就可以列入選型的考量了。 先來簡介一下多工掃描:多工掃描是什麼? 下圖是截自專案的部分電路。圖中有一顆 億光ELF-511 ,是非常標準的四位數共陰極七段顯示器,四個位數的a~g和dot都是在顯示器裡面直接並聯,每個位數的共點(陰極)則是分開的。 每個時間點P0的信號只會讓Q1~Q4其中一顆導通,並在導通的時候從P1送出對應a~g和dot的資料。也就是輪流點亮每一個位數,當輪流的速度快過人眼的視覺暫留,我們看上去就會像是它們一直都亮著一樣。 多工掃描的好處? 如果四位數七段顯示器每一個位數獨立控制的話,共點可以直接接電源,還需要4個a~g和dot,共32支接腳來控制。 多工掃描的話就只需要1個a~g和dot加4條掃描線,只要12支接腳就能控制四位數七段顯示器。 少了十多支接腳在設計上是非常可觀的,無論在BOM cost、電路面積上或是layout難易度都有優勢。 想一想,12支腳我用TSSOP20的MG51FB9AE就可以做完,若是32支腳的話得挑到48-pin的MCU才能做了。 韌體的寫法就是建一個陣列u8segments[16]把0~F (0~16, 0x0~0xF)排出來,利用餘數除法在switch case中將數字u32num的個、十、百、千位數分別提取出來,然後利用查表法去查u8segments[]將它們送出到P1; switch case則...

輕鬆上手:以VS Code, SDCC, Git建立新唐8051編譯環境

圖片
 這是003Clock系列的第二篇文章,第一篇還沒跟上的趕快回追一下~ (一) 製作新唐N76E003/N76S003白光LED電子時鐘套件 (二) 輕鬆上手:以VS Code, SDCC, Git建立新唐8051編譯環境 (三)新唐N76E003白光LED電子時鐘套件韌體技巧說明 Part 1: 消除開關彈跳現象(de-bounce)、Timer delay、功能選單,以N76S003為例 Part 2:Timer auto-reload產生中斷來精確計時,以函式指標(unction pointer)切換中斷服務程式的功能 Part 3:以N76S003的SPI控制PT6961白光LED七段顯示器 (四)免用燒錄器更新韌體:NuMicro ISP Programming Tool 2018年前後,新唐推出了這顆N76E003,主打著只要台幣7塊錢的增強型8051,與STM8S003 pin-to-pin相容,機械週期只有1個clock cycle、內建了18KB的程式記憶體、兩組UART、ADC、I2C、SPI、PWM等齊全的功能,要接什麼感測器都很方便,Arduino UNO有的它都有,於是就入手了一堆N76E003。 朋友們如果有新的設計,推薦使用今年新出的N76S003啊!因為N76E003目前已調漲到台幣10塊錢。新出的N76S003大概是用了更成熟的技術來生產,所以還能維持在台幣7塊錢(聽說是e-store Nuvoton Direct獨賣),除了更便宜之外還多了SPROM的功能。我現在還在用N76E003是因為當年買的那一堆庫存還沒用完XD 但請各位放心,這兩個型號新唐掛保證是完全pin-to-pin、code-to-code相容的,原廠提供的BSP也完全共用。 https://direct.nuvoton.com/n76s003-series 由於Keil C51、IAR之類的商用軟體,免費版本是有code size限制的,印象中Keil C51是限制在2KB,那麼N76E003的18KB豈不是用不完!因此當時就轉向使用open source、無code size limit的SDCC (Small Device C Compiler) 來開發。SDCC只是一套工具鏈(俗稱編譯器),而非整合型的開發環境(Integrated Developm...

維修IKEA VINDRIKTNING空氣品質感應器

圖片
IKEA VINDRIKTNING空氣品質感應器是我在三年前購入的,功能就是有綠、黃、紅三個顏色的燈顯示空氣品質。最近裡面的風扇出現咖咯咖咯的聲音,時不時就亮紅燈(說空氣品質差),我實際去看環保局的空氣品質監測網,空氣品質卻是良好,推測是風扇故障或感測器本身積灰塵導致誤判,決定拆開來清潔看看。拆解到空氣品質感測器時還意外發現上面有顆新唐的8051 XD 卸下背面的四顆螺絲輕輕鬆把本體拆開,映入眼簾的是一顆空氣品質感測器,透過一顆外掛的風扇吸入環境空氣;正面則有一塊電路板負責接收空氣品質感測器的資料,轉換為三色LED告知使用者目前的空氣品質狀態: 從連接器旁的印字可以發現與空氣品質感測器之間是透過UART介面傳輸: 上頭SOP8的IC是Eastsoft (東軟載波) ES7P001FGSA 8-bit MCU: 電路板另一面則有六顆LED,以及photodiode用來偵測環境亮度,可以隨環境亮度調整LED的亮度: 好奇三個顏色為什麼會有六顆LED,於是上電試試看,原來是兩顆LED相同顏色,打在半透明的燈罩上可以呈現較均勻的光線: 再來就是今天要處理的部分,空氣品質感測器了: 有一個塑膠支架將空氣品質感測器與風扇結合在一起,可以直接從外殼上抽取出來: 翻到另一面,果然積滿了灰塵,立刻拿刷子清一清! 風扇廠牌是”WANGSHENG DA TECHMOLOGY CO., LTD”,Google一下查不太到資料 …  將風扇的兩顆螺絲卸下後,風扇是可以順利取下。但還是沒看見其它螺絲,無法將空氣品質感測器本體完整從支架卸下來: 為了檢察裡面的鏡片將鐵蓋拆下,可以看見它的電路板,上面有防潮的塗料: 可以看到空氣品質感測器的PCB上的印字PM1006,是四方光電(Wuhan Cubic Optoelectronics)所出的紅外線粉塵感測器,看規格是可以檢測空氣中大於0.3 um的顆粒: 電路板是直接mount在一塊塑膠板上的,可以從外殼上分離開來 分離開來可以看到原來塑膠板上還包含了鏡片、LED和接收器,外殼中也有一些防止反射的結構: 左上角是一顆PD (photodiode),右上角是IR LED,它們並不是直接對著照的,當紅外線照射到空氣中的一些顆粒、粉塵時,光線才會散射到PD上,所以空氣品質越糟糕,PD接收到的散射光就會越多,PD的信號就可以當成空氣品質的參數。 M...