什麼是 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 |
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. 如下圖:
... #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; } ...
這一元二次方程式有幾個特性
- 任3點 A,B,C , 斜率AB!=BC, BC!=CA, CA!=AB (若斜率AB=BC=CA 則為直線)
- 未跨過拋物線頂點, 隨著 x 遞增或遞減, 切線斜率必定持續遞增或持續遞減 (若切線斜率不遞增也不遞減 則為直線)
因此當你隨著 x 遞增, 量測到的4點 斜率AB,BC,CD 不是持續遞增也不是持續遞減, 請不要用此 Model.
如果你覺得這篇文章對你有幫助, 請於留言板留個言, 以茲鼓勵. 謝謝! Email: jasonc@mail2000.com.tw
留言列表