總網頁瀏覽量

顯示具有 firmware 標籤的文章。 顯示所有文章
顯示具有 firmware 標籤的文章。 顯示所有文章

2024年9月26日 星期四

用ARM based的MCU或SoC晶片平台,並不代表就是在學ARM

 在台灣,許多人用了ARM based的MCU/SoC為主晶片的板子,就以為自己在學ARM,其實一輩子都完全沒真正接觸過ARM processor的內容,所以可見很多人其實根本不曉得自己口中的ARM到底是是指什麼/講什麼,也沒有很清楚自己做了一堆周邊應用但到底在實作什麼挖糕,其理論基礎對應的學科我想應該是計算機概論。


十幾二十年下來,這早已經變成嚴重的以訛傳訛。這類似的觀念在台灣真的很多。

另一個例子,有不少人以為學80x86原理沒意義,但其實Intel 在2016年所推出的Inte lQuark系列微控制器(MCU) D2000就是基於1993年推出的Pentium CPU。平台和技術年份根本不是重點,哪時會被拿來套在新平台或衍伸出新技術都不一定。用什麼款式的平台去學基礎其實不是該執著的點,只要適合學習即可。


-----

歡迎各方洽談合作,務實/踏實追求共好。歡迎電機電子資工本科系學員,也很歡迎非電機電子資工本科系的學員加入學習嵌入式系統技術/尋求轉職成為研發工程師的行列。

孫文良 個人簡歷: https://sites.google.com/view/wenliangsun/


‼本園區開設之技術課程進一步詳情請參見下方blog網頁的課程介紹👇:
本學習區之Facebook粉絲頁如下:

--------------------------

孫文良 (阿良的嵌入式系統技術學習區)

【若需要嵌入式系統技術輔導課程 可來信洽談合作方式: iws6645@gmail.com,亦可先點擊參考這篇介紹文章



本園區之嵌入式系統基礎技術課程的導向,偏重產業開發所需的基礎,而非讓初學者看到花俏功能為目的

多年來對於嵌入式系統領域的開發與教學經驗讓我感受到,多數產業公司找工程師來開發產品的功能目標是應用,但是開發技術的訓練/基礎奠定的過程,絕對不適合是應用導向 (例如單純call API/現成函數而沒有深入了解其原理細節),不能只是用現成的模組和函數去湊出功能,起碼要了解最基本的基礎觀念與系統架構。以背後設計原理為主,不以主打看到花俏功能為目標,所以我的教學基本上不會強調及主打主流媒體喜歡提及的AI、IoT及應用功能,而是著重在軟韌體開發的細節(如C語言的語法細節原理、軟硬體系統架構),主要希望栽培開發所需要的基礎。

因為在真實去產業界做真實的產品開發階段(嵌入式系統軟韌體/軟硬體整合),不太可能都只純粹依靠那些高度現成的開發板及太過上層的API做應用(即便是使用API也常要懂其背後原理,也可能是要從更底層去做開發),因為實際做產品開發和純創意maker角度需求、所需的背景基礎程度大多是不同的。

在訓練課程中,一旦主打應用功能或者花俏的趨勢 (AI或IoT應用功能之類的),就容易掩蓋掉基礎,而讓初學者誤以為自己會了,但其實只是綁在某塊開發板及其現成的範例程式或函數(常見的例子就是使用標準Arduino API函數所集成的範例程式去兜出應用功能,而沒有去懂更進一步的原理)。而實際上要從頭開發(或較有深度的開發)時,就會發現自己其實沒有具備該有的能力和觀念(其實即便是應用這些API,要做好產品也是需要懂原理,否則將容易產生許多問題)


-----

歡迎各方洽談合作,務實/踏實追求共好。歡迎各方洽談合作,務實/踏實追求共好。歡迎電機電子資工本科系學員,也很歡迎非電機電子資工本科系的學員加入學習嵌入式系統技術/尋求轉職成為研發工程師的行列。

孫文良 個人簡歷: https://sites.google.com/view/wenliangsun/


‼本園區開設之技術課程進一步詳情請參見下方blog網頁的課程介紹👇:
本學習區之Facebook粉絲頁如下:

--------------------------

孫文良 (阿良的嵌入式系統技術學習區)

【若需要嵌入式系統技術輔導課程 可來信洽談合作方式: iws6645@gmail.com,亦可先點擊參考這篇介紹文章

2023年4月20日 星期四

近來,收到來自國內一線 IC design house 公司之研發工程師 的 技術輔導課程需求

近來開始有收到國內一線 IC design house 公司軟韌體工程師學員來尋求軟韌體系統開發基礎的輔導諮詢課程需求,有這方面課程需求的人明顯比過去還多。

長期以來,我很感謝所有工程師學員的認可和支持。

對於各類工程師的相關需求,都非常歡迎。

因自身一路以來的經歷和體會,多年來對於多數學校在軟韌體系統設計開發、軟硬體整合技術方面的巨大學用落差(亦包含許多產業公司對於招募機制的問題與輕忽)與技術輔導的看法及評估,至今已得到結果方面的證實。

(許多問題的根源是來自整個台灣社會長期以來的觀念和文化,並非單一方或者單一問題所致)

事實上,許多嵌入式系統開發的實際面向來說,絕對不單只是coding純軟體方面的技術問題(例如很多實際的軟硬體整合或/週邊驅動應用的開發、SoC(系統晶片)/MCU(微控制器)晶片中的內部硬體架構觀念,與這些年在某些公司面試與年輕求職者之間所盛行的純軟體刷題幾乎無直接相關,許多是軟體與基礎硬體觀念之間的隔閡問題;反過來說,許多較偏向純韌體的工程開發單位,普遍較缺乏對於計算機系統、作業系統方面的基礎觀念理解),實際狀況牽涉許多對於系統的理解、背景知識、自身對於軟硬體基礎的缺乏及實際開發除錯的經驗與思考等等。

歡迎各方洽談合作,務實/踏實追求共好。


-----

個人簡歷: https://sites.google.com/view/wenliangsun/


‼本園區開設之技術課程進一步詳情請參見下方blog網頁的課程介紹👇:
本學習區之Facebook粉絲頁如下:

--------------------------

孫文良 (阿良的嵌入式系統技術學習區)

【若需要嵌入式系統技術輔導課程 可來信洽談合作方式: iws6645@gmail.com,亦可先點擊參考這篇介紹文章


2022年2月9日 星期三

因友人介紹,近期有台大電機系教授洽詢合作! 很歡迎學術界和產業界多方合作交流喔!

如下圖,近期因朋友李博士的介紹,所以有 台灣大學 電機工程學系 的 教授 來討論合作。


回顧這幾年,我大多都是針對業界工程師開課輔導,幾年前自從聯發科(晨星半導體)離開回到南部後,主要回成大幫忙帶產學合作案(同時在他們合作的中小企業公司擔任顧問),當時在成大也有掛計畫下的臨時人員 (同時也算是合作的成大教授的顧問腳色)。

目前也還是有在接觸大學/學術界,多方交流&合作,目標理想還是希望促進減少學用落差、幫助台灣社會及產業發展。同時也推廣技職教育,也希望台灣的技職教育能正常化、特色化,走出自己的一條路。

都很歡迎交流討論任何合作模式,若有合適的合作機會的話,我都會盡量提供真心的建議和實際經驗。


-----

‼本區開設之技術課程的詳情請參見下方blog網頁的課程介紹👇:


本學習區之Facebook粉絲頁如下:

--------------------------

孫文良 (阿良的嵌入式系統技術學習區)

【若需要嵌入式系統技術輔導課程 可來信洽談合作方式: iws6645@gmail.com,亦可先點擊參考這篇介紹文章

2021年9月4日 星期六

適合初學者的【嵌入式系統基礎原理與實務課程】

‼ 在此推廣一下 適合初學者的【嵌入式系統基礎原理與實務課程】‼

👉 本po文的影片內容為一個簡易的小範例,由8051 MCU GPIO之Output(輸出)驅動LED完成簡易跑馬燈功能。

影片內容包含從操作KEIL C51 IDE的免費評估版對程式碼進行編譯,並且藉由 ISP (In System Programming) 燒錄方式(便宜又好用) 對8051 MCU進行燒錄並觀察執行結果。


.

❓ 看完這篇po文的demo影片,或許有些學員會感到疑惑,這影片的跑馬燈功能,豈不是在學校課程裡面就看過/做過了? 這不是都很簡單嗎? 

 

不用擔心 🥸,其實這些表面上簡單的demo功能的背後,其實有著許多深入的學問和需要學習的基礎觀念,在業界做深入的技術問題時很可能會需要這些觀念,而許多大學學校課程不一定會詳細教背後詳細原理,也可能是學員過去從來沒有仔細思考過的較深入的基礎內容。

.

以這個po文的demo影片內容來舉例背後涵蓋的基礎內容,例如: 

👉 以8051實際實作範例說明低階語言 (組合語言,Assembly Language)與C語言(高階語言)的實際差異介紹

👉 介紹8051 指令集 (組合語言 其實即為對應指令集 的 助憶符號)

👉 MCU的原廠官方Datasheet技術手冊的基本閱讀能力

👉 MCU內部架構、GPIO架構原理(例如Port0的open drain是指什麼)、暫存器存取、記憶體組織架構

👉 MCU外部介面電子電路原理(與基礎,包含數位電路和類比電路及訊號的基本觀念)

👉 C語言的各種技巧與重點(包含8051基礎應用以外的平台的韌體開發常見內容和觀念),韌體程式流程追蹤與撰寫

👉 整合開發環境(IDE)操作

👉 ISP燒錄韌體之方式,以及燒錄器所對應軟體之操作 


上述內容在本學習區所開設的課程內容中都會詳細講述,

.

許多學校課程會講的內容,本課程當然會涵蓋到;而就連許多學校課程裡面沒講到的(詳細細節原理與實務開發經驗),在本課程內還是會學到。

.

註: 這門課的核心並不只是教你8051 Microcontroller,而是關於嵌入式系統(Embedded System)的軟硬體入門理論觀念與技術基礎,

同時也會補充許多「真正的計算機概論」的重要內容,不要懷疑,多數人不一定真的有理解過,包含: 

👉 何謂電腦?

👉 何謂嵌入式系統? 

👉 何謂跑non-OS及何謂有跑OS的電腦(計算機)系統

👉 何謂CPU? 何謂MCU(微控制器)? 何謂微處理機? 何謂SoC(系統晶片)? 

👉 產業相關職缺類別與實際可能的工作內容情況(講師分享自身的產業工作經驗與曾經輔導多位學員的經驗)

👉 以8051 MCU作為範例實作的目標教材,目標是希望學員能打下紮實的嵌入式系統基礎,課程內容中會有一系列的基礎實作教學

.


本園區之FB粉絲專頁如下:

--------------------

孫文良 (阿良的嵌入式系統技術學習區)

個人簡介: https://sites.google.com/view/wenliangsun/

【若需要嵌入式系統技術輔導課程 可來信洽談合作方式: iws6645@gmail.com,亦可先參考 課程招生網頁連結


2021年7月6日 星期二

【阿良的韌體科普系列】系列文章─開張文

這幾年來逐漸發現,現在因為某些議題被過度炒作和放大(如AI,不論在新聞媒體/報章雜誌上面),且學術界(大學校院)又過於績效導向,大多為了角逐計畫和資源,而不斷地去追求所謂比較的名詞的相關議題(未必能反映台灣產業界的真實專業技術人才需求),導致一些重要的紮實專業技術教育越來越不受到重視。

於電腦相關領域(資訊工程領域),在較上層的程式語言(如Python)隨著上述議題而一同受到社會高度重視的同時,越來越學生 或 初入社會的人士,能了解何謂電腦系統的底層(如 韌體硬體),

但是,其實產業界對於電腦底層相關的工程師職務需求量是很大的(可自行搜尋人力銀行求證),

許多人似乎都快忘記,軟體終究是被拿來控制/驅動電腦硬體的、軟體是被硬體所執行的,

而且,其實軟體也有很多不同的層面和種類,軟體 並不是 只有一般人眼睛看得到的 視窗介面軟體、APP 或 網頁 而已,

不少人似乎把底層系統都給忘記,甚至不太曉得 較底層的系統軟體(韌體、驅動程式、開機啟動程式、作業系統核心等名詞)存在和意義


有鑑於上述狀況,本園區這邊最近會開始撰寫並分享【阿良的韌體科普系列】系列文章,希望透過比較淺顯易懂的文字介紹方式,讓更多人對於電腦底層、韌體相關的軟體程式、硬體等底層單元,能有更多的了解。

這系列文章的撰寫風格,會盡量避免太過繁瑣詳細的內容,但同時保持內容的正確性,雖然這樣的有可能會犧牲一些詳細的說明,但還是希望能藉此方式,讓更多朋友能對於電腦底層的軟硬體相關知識有些了解。

希望讓大家能擴展自己對於職涯的選擇性和技術視野,而不是等到去工作了,才知道自己做的工作到底是在做什麼。

--------------------


孫文良 (阿良的嵌入式系統技術學習區)

個人簡介: https://sites.google.com/view/wenliangsun/

【若需要嵌入式系統技術輔導課程 可來信洽談合作方式: iws6645@gmail.com,亦可先點擊參考這篇介紹文章

2021年3月8日 星期一

什麼是嵌入式系統?

歡迎透過合法的方式分享此文內容,若要轉載/轉貼,請明確貼出此原始連結並標示作者基本資訊請勿抄襲及非法轉貼(例如擷取內文但並未註明出處)

許多人都聽說過嵌入式系統,包含許多學生、教師甚至是從業工程師,即便這是個在工程界常聽到的名詞,但卻常常有人對此名詞感到困惑。

但到底什麼是嵌入式系統呢?

我們可以看一下Wikipedia上面的定義說明(該內容重點也符合英國電機工程師協會的定義)

An embedded system is a computer system—a combination of a computer processor, computer memory, and input/output peripheral devices—that has a dedicated function within a larger mechanical or electrical system.

從上述內容我們可以看出,簡單來說,嵌入式系統就是一種整合了電腦處理器、記憶體、I/O周邊裝置等單元、具備特定功能的電腦系統 (常被應用於電子系統或者機械系統之中)。

嵌入式系統的整合應用隨處可見,只要是具備電腦系統在其中的產品,都是嵌入式系統的範疇。例如冷氣機、洗衣機、平板、手機、數位電視、數位機上盒、智慧穿戴手環等等。

當然現在的手機或平板電腦的功能越來越廣泛,就嵌入式系統的定義來說顯得有些模糊了,但因為仍是裝置類型的產品,且主要以通訊功能為主,所以仍可歸類為嵌入式系統(和廣泛用途的PC個人電腦系統仍有不少差異)。

而我過去最常見到的錯誤認知是:

• 有些純軟體背景的人認為,嵌入式系統就是指Embedded Linux或者做Linux kernel相關內容

事實上,Embedded Linux是執行在某些嵌入式平台上面的的作業系統軟體,而不論是SoC或者MCU或者Embedded Microprocessor平台,即便其執行的軟體不屬於OS軟體(或RTOS),而可能只有跑non-OS的韌體程式(例如做一些做硬體控制或感測器訊號的擷取),這當然也是屬於嵌入式系統。

而雖然如果是有跑Embedded Linux的嵌入式系統,其中當然有Linux kernel,但其實這就較偏向於作業系統的範疇,因為Linux kernel也可能是PC上的Linux kernel,不能以此概括嵌入式系統,因為嵌入式系統是一個系統而不是單一個部分而已(同樣的,如果一個系統只有純電子電路,而沒有任何的電腦單元在其中,那也不屬於嵌入式系統)。

一樣都是嵌入式系統領域,卻常因人們各自不同背景而有不同的解讀或理解。所以在這裡特別作個說明,也建議閱讀下列相關文章。

相關文章:

1.   現代計算機系統核心硬體常見平台的分類與簡介概述

2.   Arduino到底是什麼? MCU又是什麼?

3.  MPU/MCU/Embedded Microprocessor/Embedded Processor名詞定義探討與整理

4. 許多人對於8051 MCU常有的錯誤觀念討論與闢除 

5. 【課程介紹】本學習區已開設 & 未來即將開設之嵌入式系統軟韌體技術課程 & 課程特色!


--------------------------

孫文良 (阿良的嵌入式系統技術學習區)

【若需要嵌入式系統技術輔導課程 可來信洽談合作方式: iws6645@gmail.com,亦可先點擊參考這篇介紹文章





2020年11月14日 星期六

個人產業經歷相關證明 & 若有技術基礎輔導需求的產業公司與個人,都歡迎來信洽談合作

我是孫文良,因為希望能實現一些理想和分享一些理念

所以開設了 阿良的嵌入式系統技術學習區

如同我的簡歷所示,個人在學生時期就開始接觸一些實作專案並且也有許多參賽獲獎的經驗。而自研究所畢業後,有些在產業界工作的經驗,也曾在一些科技大學擔任業界講師

目前也持續和產業界公司合作,兼任產品研發顧問

相關的證明照片如網址(權限公開,不必登入也可看到): 

https://www.facebook.com/media/set/?set=a.161265529036225&type=3

一直以來,由於個人的求學與產業經驗,看過許多事,有著許多感慨,一直希望能 減少產學落差 以及 振興技職教育體系(國內的大學都不做,而許多號稱技職體系的科技大學大多也不重視產業實務,那我就自己想辦法來做,專業技職/技術教育本來就是國家產業之所需。雖然我個人經常是在做狗吠火車的事情,但是這裡畢竟是自己的國家/家鄉,那就堅持繼續做這些有意義的事吧,這樣日子也會過得踏實且開心點)

故,若有技術基礎輔導需求的產業公司單位 或 個人,都歡迎來信洽談合作

2020年11月13日 星期五

MPU/MCU/Embedded Microprocessor/Embedded Processor名詞定義探討與整理

歡迎透過合法的方式分享此文內容,若要轉載/轉貼,請明確貼出此原始連結並標示作者基本資訊請勿抄襲及非法轉貼(例如擷取內文但並未註明出處)

在嵌入式系統的技術領域,某些與處理器或控制器相關的名詞因為常被混合使用,所以常使許多人對於這些名詞感到模糊以致觀念不清,所以這裡繼續寫這篇文章來作整理分析探討(過去我曾寫過[6]和[13]這兩篇Blog文章來解釋一些名詞定義上的觀念差異)

許多人可能較不會注意到,STM32系列其實除了MCU(Microcontroller Unit)產品之外,也有出MPU(Microprocessor Unit)系列的產品[1],例如ST公司的這顆STM32MP151A[2],這顆IC裏頭除了有有雙核心(ARM Cortex-A7和一顆ARM Cortex-M4)的CPU Cores (當然其實ARM處理器單元之中其實不只包含CPU core,以Cortex-M為例,還會有一些相較於一般周邊裝置而言與CPU更有緊密關係的周邊如NVIC、Systick timer之類的裝置)之外, 還有一些週邊單元(如I2C、SPI、UART、Ethernet MAC、USB、Camera interface、ADC、DAC等等)

須注意的是,上面提到的這款MPU指的是Embedded Microprocessor,而不是傳統所稱的微處理機/微處理器(General-Purpose Microprocessor),單一顆內部主要內容只有CPU單元的IC,而沒有包含週邊單元,如Z80或8086)[3][4]

在某些對於名詞定義較嚴謹書籍裏頭有這樣較明確的定義和解釋去區分上述所提及的Microprocessor和Microcontroller之間的差異,如台科大電子系教授林銘波或者國外的Muhannad Ali Mazidi或者Sencer Yeralan等人寫的書[7][8][9][10]

關於Embedded Microprocessor(嵌入式微處理器),除了上面提到的STM32MP151A之外,像是國內廠商新唐的NUC980[5][12]或者國外廠商Microchip/Atmel公司的SAM9G20[11]也是同類的產品

而Embedded Microprocessor(嵌入式微處理器)這個詞,有時與Z80/8086這種只有內含CPU的IC被放到嵌入式系統之中作為運算核心的狀況下所稱的Embedded Processor(嵌入式處理器),在名詞方面也會有在某些技術手冊或甚至一些書籍中被混用的狀況

Ref:
[3] Wikipedia -Zilog Z80: File:Z80_arch.svg https://en.wikipedia.org/wiki/Zilog_Z80#/media/File:Z80_arch.svg
[4] Wikipedia - Intel 8086: Intel_8086_block_scheme.svg , https://en.wikipedia.org/wiki/Intel_8086#/media/File:Intel_8086_block_scheme.svg
[6] 阿良的嵌入式系統技術學習區, "Arduino到底是什麼? MCU又是什麼?", https://jimsun-embedded.blogspot.com/2019/01/arduino-mcu.html
[7] 林銘波, 微算機原理與應用:x86/x64微處理器軟體、硬體、界面與系統 六版 (精裝本), 全華圖書
[8] 林銘波, 8051微算機原理與應用(精裝本), 全華圖書
[9] Muhammad Ali Mazidi, Janice G. Mazidi, Rolin D. McKinlay, The 8051 Microcontroller and Embedded Systems (2nd Edition), Pearson Education Inc.
[10] Sencer Yeralan, Ashutosh Ahluwalia, Programming and Interfacing the 8051 Microcontroller, Addison-Wesley Publishing Company
[11] Microchip 32-BIT ARM-BASED MICROPROCESSORS: SAM9G20, http://ww1.microchip.com/downloads/en/DeviceDoc/DS60001516A.pdf
[12] 新唐科技(Nuvoton) NUC980 Series Datasheet, https://www.nuvoton.com/resource-files/NUC980_Datasheet_EN_Rev1.0.pdf
[13] 阿良的嵌入式系統技術學習區, "現代計算機系統核心硬體常見平台的分類與簡介概述", https://jimsun-embedded.blogspot.com/2019/11/blog-post_22.html?fbclid=IwAR2-G5oveNJ-esTn7SCrBm_rxnF0IHOSoEorJFGzejbInLd5uBvfrANbilU

2020年3月11日 星期三

【UART應用】國外STM32臉書facebok社團討論小PO文之記錄整理:用UART傳送浮點數的方式



無意間在臉書上看到外國人的臉書社團STM32 ARM Cortex-M上面的這則老外們在討論的討論PO文(可能要加入該臉書社團才能看到)有點意思,是針對用UART傳送浮點數的方式的這個簡單但實用的議題,幾分鐘就能看完下面的留言討論,但是因為是簡單實用的討論所以就想說在此記錄一下。對於此層面的軟體程式邏輯來說,UART只是以byte為單位(Data framing中主要的資料部分)將資料送出的單元(當然如果要針對UART硬體更精確地來說,其實是將資料一個一個位元的進行串列傳送),所以這裡跟UART的關係並不算很直接,其實這議題算是有點偏向C語言的基礎

如果有嵌入式系統的C語言韌體開發背景的讀者,可以簡單看出該PO文的下面留言者(很多都是外國工程師)提出的留言建議的方式多數屬於下列兩種(也都是很直覺的方式),這邊將其整理並作一些解說:


1. 直接傳送浮點數值:使用union,讓浮點數值與uint8型態的資料作對應(casting/mapping), 然後一個一個byte透過UART送出

/* 將浮點數值與uint8型態的資料透過union在其內宣告,使它們共用一塊記憶體空間 */
typedef union{
float f_val;
uint8_t  uint_val[4];
} float_u; 

float_u value;
value.f_val =6.66; //6.66只是隨便舉個小數值的例子

/* Send Data via UART*/
UART_Transmit(value.uint_val);  /*此處的UART_Transmit函式也是類似pseudo code的簡單示意的範例,實際上就看你的嵌入式系統軟韌體開發環境的UART API函式是怎樣的狀況(實際形式),而此處的目的簡單來說就是用UART將浮點數值一個byte一個byte的方式送出去*/



2. 將浮點數值轉成字串並傳送這個字串:透過sprintf函式將浮點數值轉為字串,例如:
char buffer[4];
sprintf(buffer, "%.2f", 3.14);
然後再透過UART將資料傳送出去。接收端如果需要此值去做後續的運算,當然就需要再把字串轉變回數值之後再作運算
(如果相應的嵌入式系統軟韌體開發環境的printf若已直接串通UART, 就可直接用printf函式就好。這邊的討論應該是針對STM32的HAL_UART_Transmit函式來說,用sprintf將浮點數值轉換為字串並放置到某一段連續的buffer(或陣列),然後再透過此位址搭配HAL_UART_Transmit函式將該字串一個一個byte傳送出去)

【若需要家教模式之嵌入式系統技術輔導 可來信洽談合作方式: iws6645@gmail.com,亦可先點擊參考這篇介紹文章

2020年2月26日 星期三

【ADC應用】ADC之Step size(LSB size) voltage的計算: Vref該除以2^n還是該除以2^n – 1之簡略探討

歡迎透過合法的方式分享此文內容,若要轉載/轉貼,請明確貼出此原始連結並標示作者基本資訊請勿抄襲及非法轉貼(例如擷取內文但並未註明出處)

  • 前言
小弟不才,本身並不是ADCIC/IP設計專家。長期以來在嵌入式系統韌體與硬體整合應用設計系統的開發方面使用到ADC做各種感測器類比訊號擷取及轉換的應用,常在許多資料看到關於step size/LSB value/LSB size/LSB的實際公式算法有些微不同,故提出此討論。雖然這表面上看起來是個不起眼的小細節,但事實上,許多同行的資深工程師或資深教授都未必相當清楚 (除非過去是有ADC的相關開發經驗)

本文會以偏向軟韌體背景人員而非ADC IC設計工程人員的角度來作探討


: 在許多ADC IC或內建ADCsensor chipdatasheet所稱的step size/LSB value/LSB size/LSB通常指的都是step size voltage(階層電壓值)的意思,也就是輸入的類比電壓如果超過達到一倍的step size階層電壓值,ADC即輸出數位值1,以此類推,不熟的朋友請自行了解ADC基本應用基礎觀念,例如: https://en.wikipedia.org/wiki/Analog-to-digital_converter,參考內文的: “The change in voltage required to guarantee a change in the output code level is called the least significant bit (LSB) voltage”

平常我們單講LSB(Least Significant Bit)本身通常是數位二進制值的最低有效位的意思,而用在ADCdatasheet簡單來說單位數位值所對應的類比電壓值。例如一個8位元的ADC而LSB voltage(或者稱step size voltage)1V,要讓數位值從0b00000000變成0b00000001就是輸入的待轉換類比電壓要達1V以上。另外,step size voltage/LSB voltage常在datasheet常被簡稱為step sizeLSB(常見的敘述形式多種,可能會是這些: step size/LSB value/LSB size/LSB)


------

  • 本文重點

而關於本文要探討的主要部分為: 常見的step size之公式通常就是ADC之參考電壓Vref去除以量化位階,而這公式的常見形式有兩種,如下(暫時撇除量化誤差等誤差條件情況,單純探討原理層面):

Step size = Vref /(2^n)   第一種公式

Step size = Vref /(2^n - 1)   第二種公式

VrefADC的參考電壓
nADC的解析度位元數(文章以下內容皆同此)
而公式的分母項目為量化階層

裡所當然地,數位值的表示範圍是從0到2^n-1,這沒有疑慮。且當位元數多的時候,實際上使用第一種或第二種,都沒有太大的落差(除了這方面需要極度嚴謹的應用系統開發之外)。但這邊要探討的是step size較嚴謹的算法

成大資工wiki與一些市面上的MCU書籍即認為第二種公式才是正確,其內容主張: ADCstep size(LSB value)Vref/(2^n - 1)

圖片來源: 成大資工wiki網頁擷取畫面(http://wiki.csie.ncku.edu.tw/embedded/ADC)



但是,我們也可以在許多書籍或IC晶片廠的datasheetdatasheet裡面的看到ADCstep size(LSB value)的公式,是本文前面所歸類的第一種公式,也就是Vref/(2^n) ,如下:



可以從Analog devicesdatasheet看到數位滿格度的0b11111111是對應到(Vref減去1LSB/Step size電壓值)的類比電壓,而不是對應到Vref





Step size(LSB size)Vref/(2^10)也就是Vref/1024,

右邊是的Digital Output Code指的是ADC轉換並輸出的數位值 ,而1024/Vref等於Step size(LSB size)電壓值的倒數(1/LSB Size)。所以上面公式為

ADC轉換出來的數位值 =  VIN / Step size

1024可以看出仍然屬於第一種公式(沒有做本文章討論的所謂1”的動作)






其中,1024/Vref等於Step size(LSB size)電壓值的倒數(1/LSB Size),也就是每一階的電壓是多少的倒數

公式中的ADC是指ADC轉換並輸出的數位值所以上面公式為(意思與上述MCP3004/3008的部分一樣): 

ADC轉換出來的數位值 =  VIN / Step size

那從1024可以看出仍然屬於第一種公式(2^10 = 1024)








Arduino UNO板子的MCU晶片是上面提及過的Atmega328P,可看出這裡的寫法一樣是屬於第一種公式,也就是5/1024 (題外話: 它後面寫的4.9 mV僅是一個大約的數值,是不論用第一種或第二種公式去套用,答案都是4.88mV)






基本上雖然這章節在講ADCErrors,但框起來的這邊主要仍是在描述STM32 MCUADCLSB(即上述各datasheetStep sizeLSB size)的定義,基本上從4096(指的是STM32 12bits ADC2^12 = 4096)看起來仍然屬於第一種公式

但是在datasheet的某些部分(3.2 Errors due to the ADC environment)就用已經減14095在做一些該章節討論的相關計算,目前對這部分尚未清楚(或許這邊探討的狀況不同,尚未詳細研究)






這裡的LSB(即上述各datasheetStep sizeLSB size)
的定義,基本上從4096(STM32 ADC基本上是12bits ADC2^12 = 4096),仍然沒有做本文章討論的所謂"1"的動作,所以仍是屬於第一種公式



-        80X86 IBM PC and Compatible Computers: Assembly Language, Design, and Interfacing Volumes I & II (4th Edition), Author: Muhammad Ali Mazidi and Janice Gillispie-Mazidi
這是小弟大學時代的微算機原理科目課本,課本裡的4.4節以8位元的ADC0848 chip為講解範例,Step size一樣是Vref/256,仍然屬於第一種公式






上圖畫紅線的部分,說明1LSB(1個LSB voltage)是怎麼來的,12.5V tied to the Vref/2代表Vref為5V,而19.53mV是套用第一種公式而來(5/256,而不是5/255)


上圖畫紅線的部分,這裡又提到1個LSB(1個LSB voltage)的算法 ,也是屬於第一種公式的類型

-----------


這邊再假設一個極端的例子作為範例來思考,假設今天有一顆Vref5V、解析度為1bitADC(當然不可能有解析度這麼差的ADC產品,這邊只是故意舉極端的例子)。並且在圖表的部分仿照Analog devicedatasheet的方式來表示(橫軸為輸入的待轉換類比電壓,縱軸為在許多datasheet也稱為ADC code的已轉換出的數位值)

-> 若是套用第一種公式step size = 5/(2^1)= 2.5V




-> 若是套用第二種公式step size = 5/((2^1) – 1) = 5V


補充: 當然了,本例的上面這兩個圖不一定就是完全精確或完全實際情況的ADC transfer function畫法,僅按照前述Analog devicesdatasheet的在ADC transfer function方面的繪畫方式與邏輯來表現出這個例子的狀況

從這例子來看,第二種公式似乎不太合理,因為step size居然等於Vref的5V,而這邊的5V就是ADC的可輸入的類比full scale range(FSR)電壓值(題外話: 多數ADC允許差動輸入的方式輸入參考電壓),而5V以下的類比電壓就完全都區分不出來。基本上以此例來看,套用第二種公式的情況,似乎就失去了透過有限的數位位階去進行取樣/模擬/轉換那連續(無限多個值)的類比電壓的Analog to Digital的初衷和意義。



另外也從上面許多datasheet的內容做為結果論來看,在step size的計算方面或許應該是第一種公式才是比較正確的( Step size = Vref/(2^n) )

還有一些國外的相關議題討論文章:
> TI E2E™ support forums - Trying to find ADC non-linearity? Look under the carpet
mastering electronics design - An ADC and DAC Integral Non-Linearity (INL)

可以從上列這幾篇文章內容列出的的ADC transfer function圖看出,與ADC規格位元相對應的數位最大值,基本上對應到的類比輸入電壓,並不是對應到Vref/FSR電壓值(單從這點來說,與前述Analog devicesdatasheet的在ADC transfer function圖相同)。而從這點也可以推斷第一種公式較為正確



當然,若有ADC專家或高手能進一步對此說明或討論,則非常歡迎&感謝

------


  • 後記&補充

小弟過去的工程師專職工作都是在IC設計公司負責軟韌體開發,在某間公司時期也需要碰到一些電路的整合設計考量。但剛好都沒有負責到ADC相關的軟韌體,所以當時沒想到要去特別請教負責ADC相關的IC /IP的designer工程師這方面的問題。而最近透過朋友詢問相關專長的工程師,目前也都是得到第一種公式才是正確的公式的回覆。

【若需要嵌入式系統技術輔導課程 可來信洽談合作方式: iws6645@gmail.com,亦可先點擊參考這篇介紹文章