1. 問題描述
在LPCXpresso540xx Eval Brd Rev E開發闆上測試ADC的例子程式 SDK_2.5.0_LPCXpresso54018\boards\lpcxpresso54018\driver_examples\adc\lpc_adc_basic\iar,得到如下結果:
LPC54608 VDD(VDD_TARGET_IC)引腳電壓是3.253v。
當輸入 0.156v 實際電壓,在通道4上獲得 adcResultInfoStruct.result 的結果是192,理論數值是0.152v=(3.253/4096 X 192), 誤差是 0.004v =(0.156v-0.152v).
當輸入1.650v 實際電壓,在通道4上獲得 adcResultInfoStruct.result 的結果是2048,理論數值是1.6265v,誤差是0.0235v。
當輸入1.488v 實際電壓,在通道4上獲得 adcResultInfoStruct.result 的結果是1856,理論數值是1.474v,誤差是0.014v。
當輸入 3.253v 實際電壓,在通道4上獲得 adcResultInfoStruct.result 的結果是4093,理論數值是3.2506v,誤差是0.0024v。
為什麼在接近0v或者接近Vdd電壓的時候,誤差在小數點後3位,但是如果在1v到2v的範圍時,誤差在小數點後2位。
解決方法:
使用 LPCXpresso Board LPC54018 開發闆,測試條件:
Vdda = VDD = Vrefp = 3.29 V, Temp = 25 C,主時鐘=系統時鐘= ADC采樣時鐘= 80 MHz。在ADC0.4通道上采樣100次後的ADC輸入電壓的平均值如下表所示。
ADC 輸入電壓(V) | 觀察輸出數值 (十進制) 100次采樣的平均值 | 理論輸出數值(十進制) |
3 | 3734 | 3734 |
2.5 | 3112 | 3112 |
2 | 2489 | 2489 |
1.5 | 1868 | 1867 |
1 | 1245 | 1245 |
在早期的SDK2.5 ADC驅動例子, ADC_Init 函數裡面實際使用的是6位的精度替代了12位。是以采樣精度出現問題,主要原因是沒有定義宏。
FSL_FEATURE_ADC_HAS_CTRL_RESOL
在最新的SDK2.8裡面已經使能,
#define FSL_FEATURE_ADC_HAS_CTRL_RESOL (1)
另外有些GPIO引腳的内部電阻上拉是使能的,做ADC使用的時候需要禁止内部的電阻上拉功能。
2. 問題描述
LPC5528每次ADC觸發采集,電壓都有跌落。為什麼?如何解決?
目前使用LPC5528來實作連續的ADC采樣1Mhz采樣每秒,持續輸出采樣值。
設定96M高頻時鐘,ADC使用Divider = 4, STS = 3, 16位分辨率。每次觸發後采樣16次,并将結果分别寫入到FIFO0 和FIFO1。實作步驟如下:
a.初始化軟體觸發adc寫入到FIFO0
b.FIFO0 -> adc isr
c.在adc isr, 軟體觸發adc,寫入到FIFO1,觸發DMA從FIFO0拷貝到記憶體區。
d.FIFO1 -> adc isr
e.在adc isr, 軟體觸發adc,寫入到FIFO0,觸發DMA從FIFO1拷貝到記憶體區。
f.FIFO0 -> adc isr
g.重複 c - f
每次觸發都有延遲,大概是1us的時間。
例如,如果在ADC引腳輸入正弦波,每16采樣,采樣數值連成的線并不是直的。
每次ADC啟動采集的時候,都有電壓跌落,是以每次在FIFO隊列的第一個采樣值都是小的。
LPC5528的ENOB,針對16位的ADC,真有效的精度是12bit,但是跌落的範圍超過了這個精度的範圍,而且每16個數值後發生一次,是以這個并不是随機噪聲。
問題解答:
關于電壓跌落,S/H采保電路實際上是一個電容,是以在采樣階段,外部的模拟輸入給電容充電,是以模拟端的電壓會跌落,因為外部的模拟源有阻抗。為了減小電壓跌落,可以使用模拟緩沖器,可以使用電壓跟随運放電路,将外部模拟信号連接配接到運放的+輸入,将放大器的-引腳連接配接到放大器的輸出引腳。
從軟體的角度,設定CMDHT[STS] = 0x7, 但它會增加轉換時間,降低轉換率。可以有效的減小和消除跌落和尖峰。
LPC MCU 輸入阻抗的值不是一個固定的值,和選擇的采樣位數,采樣周期都有關系,可以參考下列公式:

在開始打開采樣通道的時采樣結果會有跌落,但是增加采樣cycles之後,會延長采樣時間,最後采的點會比較穩定。