close

什麼是 A/D Converter
 

ANALOG-TO-DIGITAL CONVERTER (A/D) 字面翻譯 A是 Analog, D是 Digital, 合起來就是類比數位轉換. A/D Converter 的角色是轉換類比伏特值為數位 Binary 數值. 通常這些 Binary 數值的長度為 4, 8, 10, 12, 14-bit. 舉個例子來說, 假設 A/D Converter 電壓供應範圍從 0~5V. A/D Converter 以 3-bit 轉換輸入電壓. 
 

000 001 010 011 100 101 110 111

 

a2d_3bits.jpg
 

 

Voltage levels [V] Binary representation
0~0.62 000
0.621~1.25 001
1.251~1.87 010
1.871~2.5 011
2.51~3.12 100
3.121~3.75 101
3.751~4.37 110
4.371~5.00 111

 

藍色線描述 A/D Converter 輸入電壓. 
紅色線則描述轉換後的 Binary 數值
 

 

我們可以看出來紅色線並不十分貼近藍色線, 但隨著 A/D Converter Bit 數增加, 紅色線會愈來愈貼近藍色線. 

 

3 點可決定一拋物線
 

通常我們應用是已知  A/D Converter 轉換過後的 Binary 數值, 要去推論這 Binary 數值之輸入電壓. 以上圖為例 Binary 數值 B100 輸入電壓約 2.15~3.12 V. 一般在寫程式時, 處理這樣的問題, 會以線性方程式處理. 但假設這 A/D Converter 的輸入電壓不為線性 (AB 斜率與BC斜率不同) , 怎麼辦呢? 最直覺的想法是多段線性方程式. 這種做法當然是可以. 然而在這裡筆者要介紹的是一元二次方程式 (拋物線) 將已知的 Binary 數值推論輸入電壓. 
 

XY 平面上 y=f(x) , y=Ax^2+Bx+C 已知3點 I,J,K (IJ, JK, KI斜率不同), 分別是 (m,n) (p,q) (r,s) 求過此3點的一元二次方程式 (求 A, B, C 解) . 

計算:

 

n = A * m * m + B * m + C ...... ①
q = A * p * p + B * p + C ...... ②
s = A * r * r + B * r + C ...... ③

 

② - ① : 

q - n = (p * p - m * m) * A + (p - m) * B

若 p != m , 兩邊除以 (p - m),  可得: 

(q - n) / (p - m) = (p + m) * A + B ...... ④

 

同理, ③ - ② :

若 r != p :  

(s - q) / (r - p) = (r + p) * A + B ...... ⑤

 

⑤ - ④ , 消去 B : 

若 m != r

(s - q) / (r - p) - (q - n) / (p - m) = (r - m) * A

A = ( (s - q) * (p - m) - (q - n) * (r - p) ) / ( (r - p) * (p -m) * (r - m) )

其中 r!=p, p!=m, m!=r

 

(p + m) * ⑤ -  (r + p) * ④ , 消去 A: 

B = ( (s - q) * (p + m) * (p - m) - (q - n) * (r + p) * (r - p) )  /  ( (r - p) * (p - m) * (m - r) )

 

已知 A, B 則

C = n - A * m * m - B * m

 

  • A = ((p-r) n)/(p m^2-r m^2-p^2 m+r^2 m-p r^2+p^2 r)+((r-m) q)/(p m^2-r m^2-p^2 m+r^2 m-p r^2+p^2 r)+((m-p) s)/(p m^2-r m^2-p^2 m+r^2 m-p r^2+p^2 r)
  • B = ((r^2-p^2) n)/(p m^2-r m^2-p^2 m+r^2 m-p r^2+p^2 r)+((m^2-r^2) q)/(p m^2-r m^2-p^2 m+r^2 m-p r^2+p^2 r)+((p^2-m^2) s)/(p m^2-r m^2-p^2 m+r^2 m-p r^2+p^2 r)
  • C = n - A m^2 - B m
    C = ((p^2 r-p r^2) n)/(p m^2-r m^2-p^2 m+r^2 m-p r^2+p^2 r)+((m r^2-m^2 r) q)/(p m^2-r m^2-p^2 m+r^2 m-p r^2+p^2 r)+((m^2 p-m p^2) s)/(p m^2-r m^2-p^2 m+r^2 m-p r^2+p^2 r)


 

範例
 

A/D Binary 為 0 時, 輸入電壓為 0.3V; A/D Binary 為 120 時, 量測到的輸入電壓為 1.8V; A/D Binary 為 240 時, 量測到的輸入電壓為 3V . 以 Mini-Volt 為單位, 得到的做標分別是:
(0,300) (120,1800) (240,3000)
套用上述公式計算可得
A=-0.02083333333333333333333333333333
B=17.5
C=300
 

一元二次方程式
Y=-0.02083333333333333333333333333333 X^2 + 17.5 X + 300
有了這個一元二次方程式, 當我們讀到 A/D值為 205時, 可以推論 A/D Converter 輸入電壓約為 3.012 Volt ; A/D值為 49時, 可以推論 A/D Converter 輸入電壓約為 1.107 Volt. 如下圖: 


8bit-adc.png


 

...
#define _A   -0.02083333333333333333333333333333F
#define _B 17.5F
#define _C 300
...
double T GetAdcInputVoltage(unsigned char X)
{
   double voltage;

   voltage=A*(double)X*(double)X + B * (double) * X + C;
   return voltage / 1000.00F;
}
... 

 

這一元二次方程式有幾個特性

  1. 任3點 A,B,C , 斜率AB!=BC, BC!=CA, CA!=AB (若斜率AB=BC=CA 則為直線)
  2. 未跨過拋物線頂點, 隨著 x 遞增或遞減, 切線斜率必定持續遞增或持續遞減 (若切線斜率不遞增也不遞減 則為直線)

因此當你隨著 x 遞增, 量測到的4點 斜率AB,BC,CD 不是持續遞增也不是持續遞減, 請不要用此 Model. 

 

 

 

 

z.png

如果你覺得這篇文章對你有幫助, 請於留言板留個言, 以茲鼓勵. 謝謝! Email: jasonc@mail2000.com.tw

 

 

 

arrow
arrow
    創作者介紹
    創作者 Lexra 的頭像
    Lexra

    Lexra Pixnet

    Lexra 發表在 痞客邦 留言(0) 人氣()