- 前言
小弟不才,本身並不是ADC的IC/IP設計專家。長期以來在嵌入式系統韌體與硬體整合應用設計系統的開發方面使用到ADC做各種感測器類比訊號擷取及轉換的應用,常在許多資料看到關於step size/LSB value/LSB size/LSB的實際公式算法有些微不同,故提出此討論。雖然這表面上看起來是個不起眼的小細節,但事實上,許多同行的資深工程師或資深教授都未必相當清楚 (除非過去是有ADC的相關開發經驗)
本文會以偏向軟韌體背景人員而非ADC IC設計工程人員的角度來作探討
註: 在許多ADC IC或內建ADC的sensor chip的datasheet所稱的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)本身通常是數位二進制值的最低有效位的意思,而用在ADC的datasheet簡單來說單位數位值所對應的類比電壓值。例如一個8位元的ADC而LSB voltage(或者稱step size voltage)是1V,要讓數位值從0b00000000變成0b00000001就是輸入的待轉換類比電壓要達1V以上。另外,step size voltage/LSB voltage常在datasheet常被簡稱為step size和LSB(常見的敘述形式多種,可能會是這些: step
size/LSB value/LSB size/LSB)
------
- 本文重點
而關於本文要探討的主要部分為: 常見的step size之公式通常就是ADC之參考電壓Vref去除以量化位階,而這公式的常見形式有兩種,如下(暫時撇除量化誤差等誤差條件情況,單純探討原理層面):
Step
size = Vref /(2^n) 第一種公式
Step
size = Vref /(2^n - 1) 第二種公式
Vref為ADC的參考電壓
n為ADC的解析度位元數(文章以下內容皆同此)
而公式的分母項目為量化階層
裡所當然地,數位值的表示範圍是從0到2^n-1,這沒有疑慮。且當位元數多的時候,實際上使用第一種或第二種,都沒有太大的落差(除了這方面需要極度嚴謹的應用系統開發之外)。但這邊要探討的是step size較嚴謹的算法
圖片來源: 成大資工wiki網頁擷取畫面(http://wiki.csie.ncku.edu.tw/embedded/ADC) |
但是,我們也可以在許多書籍或IC晶片廠的datasheet的datasheet裡面的看到ADC的step size(LSB value)的公式,是本文前面所歸類的第一種公式,也就是Vref/(2^n)
,如下:
可以從Analog devices的datasheet看到數位滿格度的0b11111111是對應到(Vref減去1個LSB/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
ADC轉換出來的數位值 = VIN / Step size
從1024可以看出仍然屬於第一種公式(沒有做本文章討論的所謂”減1”的動作)
其中,1024/Vref等於Step
size(LSB size)電壓值的倒數(1/LSB Size),也就是每一階的電壓是多少的倒數
公式中的ADC是指ADC轉換並輸出的數位值,所以上面公式為(意思與上述MCP3004/3008的部分一樣):
ADC轉換出來的數位值 = VIN / Step size
ADC轉換出來的數位值 = VIN / Step size
那從1024可以看出仍然屬於第一種公式(2^10 = 1024)
Arduino UNO板子的MCU晶片是上面提及過的Atmega328P,可看出這裡的寫法一樣是屬於第一種公式,也就是5/1024 (題外話: 它後面寫的4.9 mV僅是一個大約的數值,是不論用第一種或第二種公式去套用,答案都是4.88mV )
基本上雖然這章節在講ADC的Errors,但框起來的這邊主要仍是在描述STM32 MCU的ADC的LSB(即上述各datasheet的Step size或LSB size)的定義,基本上從4096(指的是STM32 的12bits ADC,2^12 = 4096)看起來仍然屬於第一種公式
但是在datasheet的某些部分(如3.2 Errors
due to the ADC environment)就用已經減1的4095在做一些該章節討論的相關計算,目前對這部分尚未清楚(或許這邊探討的狀況不同,尚未詳細研究)
這裡的LSB(即上述各datasheet的Step size或LSB size)
的定義,基本上從4096(STM32 ADC基本上是12bits ADC,2^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)的算法 ,也是屬於第一種公式的類型
-----------
這邊再假設一個極端的例子作為範例來思考,假設今天有一顆Vref為5V、解析度為1bit的ADC(當然不可能有解析度這麼差的ADC產品,這邊只是故意舉極端的例子)。並且在圖表的部分仿照Analog device的datasheet的方式來表示(橫軸為輸入的待轉換類比電壓,縱軸為在許多datasheet也稱為ADC code的已轉換出的數位值)
-> 若是套用第一種公式,step size = 5/(2^1)= 2.5V
-> 而若是套用第二種公式,step size = 5/((2^1) – 1) = 5V
補充: 當然了,本例的上面這兩個圖不一定就是完全精確或完全實際情況的ADC transfer function畫法,僅按照前述Analog devices的datasheet的在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 devices的datasheet的在ADC transfer function圖相同)。而從這點也可以推斷第一種公式較為正確
當然,若有ADC專家或高手能進一步對此說明或討論,則非常歡迎&感謝
------
小弟過去的工程師專職工作都是在IC設計公司負責軟韌體開發,在某間公司時期也需要碰到一些電路的整合設計考量。但剛好都沒有負責到ADC相關的軟韌體,所以當時沒想到要去特別請教負責ADC相關的IC /IP的designer工程師這方面的問題。而最近透過朋友詢問相關專長的工程師,目前也都是得到第一種公式才是正確的公式的回覆。
------
- 後記&補充
小弟過去的工程師專職工作都是在IC設計公司負責軟韌體開發,在某間公司時期也需要碰到一些電路的整合設計考量。但剛好都沒有負責到ADC相關的軟韌體,所以當時沒想到要去特別請教負責ADC相關的IC /IP的designer工程師這方面的問題。而最近透過朋友詢問相關專長的工程師,目前也都是得到第一種公式才是正確的公式的回覆。
【若需要嵌入式系統技術輔導課程 可來信洽談合作方式: iws6645@gmail.com,亦可先點擊參考這篇介紹文章】