2017年8月6日 星期日

使用Oversampling提高ADC解析度

在使用ADC過程當中,解析度是一個用來表示ADC性能的指標,其計算方式可以透過如下方程式表示 : 1LSB = VREF / (2^n - 1), VREF為ADC的參考電壓, n為表示解析度的位元數,假設使用10-bits ADC, ADC參考電壓為5V, 可以計算1LSB = 5 / (2^10 - 1) =  0.0048875855327468, 大約為4.88mV,也就是說當ADC轉換得到512時,實際的輸入電壓約為512 * 4.88 = 2499mV, 若輸入電壓變化小於4.88mV, 可以說ADC是看不出來的,因此若要設計高精度的產品,解析度要高的話,10-bits ADC是不夠的,我曾使用過TI 18-bits delta-sigma ADC,解析度很高,只是轉換起來很慢,18-bits模式下一秒大概只能拿四筆資料,也就是說Report rate : 4Hz, 而且成本也高,對於低價的產品來說不適用,為了在有限成本內壓榨出性能,於是乎就有Oversampling的技術出現,透過軟體來實現提高ADC解析度!
要做訊號的取樣必須先了解取樣頻率及"Nyquist theorem", Nyquist theorem簡單來說若要還原訊號原本的樣子,必須遵循f nyquist > 2 f signal, 關於Nyquist theorem詳細的內容可以自行google查詢,Oversampling則透過公式f oversampling = 4^n * f nyquist來完成!
實作:
我實作的方式是將4^n的取樣結果加總之後,再將加總的結果右移n,然後再結果取出使用,假設要將ADC解析度由10-bits提高至12-bits, n = 12 - 10 = 2, 因此取樣數必須為原本的4^n = 4^2 = 16,也就是說每提升1-bit要取樣4^n, 接著將16筆資料加總,再將加總結果右移n, 就可以將得到的結果透過12-bits的計算公式來使用,假設VREF = 5V, 1LSB = 5 / (2^12 - 1) = 1.22mV, 解析度優於10-bits的4.88mV, 需要使用到透過軟體提升ADC 解析度的朋友,可以參考Microchip AN1152 Achieving Higher ADC Resolution Using Oversampling及ATMEL AVR121: Enhancing ADC resolution by oversampling這兩份文件,搭配程式實際試試看!

STM32於IAR 9.3以後的版本將uart導向至printf

首先,請先參考如以下IAR提供的"在IAR Embedded Workbench中实现打印输出技術資料" https://www.iar.com/cn/knowledge/support/technical-notes/general/implementing-printf-ou...