選擇正確的模數(shù)轉(zhuǎn)換器 (ADC) ,微控制器內(nèi)部ADC
許多微控制器都包含片上 ADC。典型器件包括 Microchip PIC167C7xx 系列和 Atmel AT90S4434。大多數(shù)微控制器 ADC 都是逐次逼近的,因為這可以在速度和微控制器芯片上的空間成本之間進(jìn)行最佳權(quán)衡。
PIC16C7xx 微控制器包含一個帶有模擬輸入多路復(fù)用器的 8 位逐次逼近型 ADC。該系列中的微控制器有 4 到 8 個通道。內(nèi)部寄存器控制選擇哪個通道、開始轉(zhuǎn)換等。一旦選擇了一個輸入,必須經(jīng)過一個穩(wěn)定時間以允許 S/H 電容器在 A/D 轉(zhuǎn)換開始之前充電。軟件必須確保發(fā)生這種延遲。
轉(zhuǎn)換精度和公式
一些微控制器,例如 Microchip 系列,允許我們使用一個輸入引腳作為參考電壓。這通常與某種精度參考相關(guān)。轉(zhuǎn)換后從 A/D 轉(zhuǎn)換器讀取的值為:
(V輸入/V參考) x 256
一些微控制器使用電源電壓作為參考。在 5V 系統(tǒng)中,這意味著 V ref始終為 5V。因此,使用 8 位 ADC 測量 3.2V 信號會產(chǎn)生以下結(jié)果:
(V in x 256)/V參考
= (3.2vx 256)/5V
= 163 10
= A3 16
但是,結(jié)果取決于 5V 電源的值。如果電源電壓高 1%,則其值為 5.05V。現(xiàn)在 A/D 轉(zhuǎn)換的值將是:
(3.2V x 256)/5.05V = 162 10 = A2 16
因此,電源電壓 1% 的變化會導(dǎo)致轉(zhuǎn)換結(jié)果改變一個計數(shù)。典型的電源可能會發(fā)生 2% 或 3% 的變化,因此電源變化會對結(jié)果產(chǎn)生重大影響。電源輸出經(jīng)常隨負(fù)載、溫度、交流輸入變化以及從一個電源到另一個電源而變化。
這帶來了一個影響所有 ADC 設(shè)計的問題:基準(zhǔn)的準(zhǔn)確性。典型的 ADC 基準(zhǔn)電壓可能標(biāo)稱 2.5V,但可以在 2.47V 和 2.53V 之間變化(這些值來自實部的數(shù)據(jù)表)。如果這是一個 10 位 ADC,在參考范圍的極端轉(zhuǎn)換 2V 輸入會產(chǎn)生以下結(jié)果:
在 V ref = 2.47V 時,
結(jié)果 = (2V x 1,024)/2.47 = 829 10
在 V ref = 2.53V 時,
結(jié)果 = (2V x 1,024)/2.53 = 809 10
不同器件之間的參考電壓變化會導(dǎo)致 20 個計數(shù)的輸出變化。
顯示了參考變化對 ADC 結(jié)果的影響。盡管誤差百分比在整個范圍內(nèi)保持不變,但對于較大的 ADC 值,數(shù)值誤差當(dāng)然更大。
軟件校準(zhǔn)
有時我們需要一個準(zhǔn)確的參考,比產(chǎn)品成本所能支持的更準(zhǔn)確。當(dāng)無法進(jìn)行手動調(diào)整時,軟件可以補償參考電壓變化。這通常通過提供用于校準(zhǔn) ADC 的已知精確輸入來完成。該參考可以非常精確(并且非常昂貴),因為生產(chǎn)線只需要很少的參考。
在我們一直在查看的 2.47V 示例中,可能會向 ADC 輸入 2V 的精確電壓。當(dāng)軟件讀取 ADC 時,它知道正確的值應(yīng)該是 819;校準(zhǔn)常數(shù)由 829/819 或 1.012 給出。同樣,2.53V 參考的校準(zhǔn)常數(shù)為 809/819,即 0.988。
這似乎意味著需要浮點數(shù)學(xué)來校正 ADC 值。如果我們使用的是能夠進(jìn)行浮點運算的處理器,這是一種可以接受的方法。但是,在更簡單的處理器上,我們可能沒有可用的執(zhí)行時間或代碼空間來實現(xiàn)浮點計算。
處理 ADC 校正的一種方法是使用查找表。這樣做的缺點是需要足夠的非易失性存儲來維護(hù)每個可能的 ADC 值的查找值——對于 10 位 ADC 的 1,024 字表。
電壓參考非常接近其標(biāo)稱值,否則它不會用作參考。假設(shè)我們的參考在我們的工作溫度范圍內(nèi)足夠穩(wěn)定,則 ADC 誤差將是我們從 ADC 讀取的值的恒定百分比。由于 ADC 具有有限的分辨率,因此嘗試以任何大于 1 LSB 的精度來校正 ADC 誤差是沒有意義的。
知道了這一點,我們就可以簡化 ADC 校正過程。我們存儲的不是查找表,而是一個值,該值告訴軟件要從 ADC 讀數(shù)中添加或減去多少(二進(jìn)制)百分比以糾正錯誤。我們可以添加或減去 1/8、1/16 或 1/24,一直到 1 LSB 的精度。我們只需要存儲一個校準(zhǔn)常數(shù),我們的除法過程由一系列移位和加法或移位和減法運算組成。
可以通過將 ADC 值乘以 0.988 來校正 2.47V 示例。同樣的事情可以通過減去初始值的 1/128 然后 1/256 然后 1/512 來實現(xiàn)。使用原始的 2V 輸入示例,并使用整數(shù)數(shù)學(xué)進(jìn)行此操作,我們得到以下結(jié)果:
829 — 829/128 — 829/156 — 829/512
= 829 — 6 — 3 — 1
= 819
該結(jié)果將 ADC 讀數(shù)校正為 819,如果參考為標(biāo)稱 2.5V,這是理想值。類似地,使用 2.53V 參考讀取的值可以通過添加 1/128 加上 1/256 來校正。
請注意,我們不需要將精確的校準(zhǔn)電壓應(yīng)用于我們正在使用的輸入。我們可以使用任何備用 ADC 輸入,只要該 ADC 使用我們要校準(zhǔn)的參考。
我們需要確保我們的參考在我們的預(yù)期工作溫度范圍內(nèi)足夠穩(wěn)定,否則結(jié)果只會在校準(zhǔn)期間接近溫度時才會好。如果參考的溫度穩(wěn)定性不夠好,我們將不得不獲得更好的參考或?qū)⑽覀兊墓ぷ鳒囟确秶殖啥鄠€段并為每個段使用一個校準(zhǔn)值。當(dāng)然,這意味著我們也必須有一個熱敏電阻或其他測量溫度的方法。
這種方法確實會導(dǎo)致舍入錯誤,這是由于我們移動結(jié)果時發(fā)生的截斷而導(dǎo)致的。我使用 2.47V 示例制作了一個電子表格,在所有情況下,校正值都在理想值的兩個計數(shù)范圍內(nèi)。大多數(shù)校正值完全正確或僅相差一個。這種校正程度明顯優(yōu)于 2V 輸入的原始變化(10 個計數(shù)),并且是許多應(yīng)用所需的全部。如果我們的應(yīng)用程序甚至無法忍受這個錯誤,那么我們可能真的需要更好的參考,或者我們可能不得不求助于手動調(diào)整。
這種校準(zhǔn)技術(shù)還可用于補償其他系統(tǒng)不準(zhǔn)確,例如電阻容差疊加。如果我們正在測量的任何內(nèi)容都包含電壓輸入,我們可以將精密電壓應(yīng)用于該輸入并進(jìn)行一次校準(zhǔn),以補償 ADC 中的參考變化和輸入調(diào)節(jié)中的電阻器容差效應(yīng)。
計算和使用校準(zhǔn)值
校準(zhǔn)值可以通過讀取已知參考值然后找出要使用的校正因子(二進(jìn)制因數(shù))來計算。對于給出的示例,理想情況和最壞情況 ADC 值之間的差異永遠(yuǎn)不會超過 1.2%,因此從原始值的二分之一或四分之一開始是沒有意義的。測試和使用的唯一值是 1/128、1/256 和 1/512。你想從接近你期望看到的價值開始。
使用計算器很容易找到校正因子,但如果我們必須在應(yīng)用程序中使用的定點處理器上計算它,則需要一種基于整數(shù)的方法。
以流程圖形式顯示了本示例中用于計算和使用校準(zhǔn)常數(shù)的算法。在此方法中,使用單個字節(jié)(或字)來存儲校準(zhǔn)常數(shù)。位 7 指示參考電壓是低(需要減去校準(zhǔn)值)還是高(添加校準(zhǔn)值)。位 0、1 和 2 指示是否使用 1/128、1/256 和 1/512 因子。
當(dāng)然,我們可以為每個可能的因素使用一個單獨的字節(jié),用第四個字節(jié)來指示參考值是高還是低。
寫入校準(zhǔn)值
無論我們使用表格還是校準(zhǔn)常數(shù),如何將校準(zhǔn)值輸入系統(tǒng)?任何校準(zhǔn)方案的一個關(guān)鍵組成部分是非易失性存儲的可用性。許多微控制器都有片上 EEPROM。校準(zhǔn)通常在測試電路板時進(jìn)行。在大批量生產(chǎn)環(huán)境中,這可能會通過某種釘床自動測試設(shè)備來完成。
我們通常希望將處理器置于某種“校準(zhǔn)模式”,可能通過將引腳接地??梢詫ιa(chǎn)測試設(shè)備進(jìn)行編程,以將非常精確的電壓施加到模擬輸入并將校準(zhǔn)引腳接地。然后微控制器可以進(jìn)入校準(zhǔn)模式,讀取參考值并計算補償值或創(chuàng)建查找表。
在某些情況下,我們沒有足夠的內(nèi)存將校準(zhǔn)代碼添加到微控制器。在這種情況下,我們可以讓微控制器將 ADC 值返回到輸出引腳(串行)或一組引腳(并行),由生產(chǎn)測試設(shè)備讀取。然后,外部計算機(jī)可以計算校準(zhǔn)值或表格值,并通過相同的接口將它們返回給微控制器。
如果生產(chǎn)設(shè)備還對微控制器進(jìn)行在線編程,則校準(zhǔn)數(shù)據(jù)可以嵌入到閃存中編程的數(shù)據(jù)中。如果被校準(zhǔn)的參考在微控制器內(nèi)部,則測試設(shè)備可能必須首先將校準(zhǔn)程序加載到微控制器中,執(zhí)行校準(zhǔn),然后加載實際的應(yīng)用程序代碼。
最后,一些非常小的微控制器根本沒有足夠的引腳來進(jìn)行校準(zhǔn)。在這種情況下,我們通常可以使輸出引腳兼作校準(zhǔn)引腳。我們使用外部電阻器將引腳拉高。生產(chǎn)設(shè)備在上電前將引腳接地以選擇校準(zhǔn)模式。
它的工作方式是微控制器上電,所有引腳都處于輸入狀態(tài)。它在將引腳配置為輸出之前讀取校準(zhǔn)引腳。如果該引腳為高電平,則開始正常操作。如果引腳為低電平,則必須外部接地,因此單片機(jī)進(jìn)入校準(zhǔn)模式。當(dāng)然,輸出必須是在引腳外部接地時不會損壞任何東西的輸出。
最后,如果我們正在校準(zhǔn)基準(zhǔn),將精確電壓施加到備用 ADC 輸入,我們可以使用該輸入本身將系統(tǒng)置于校準(zhǔn)模式。使用一個電阻器將備用輸入拉至零電平 ADC 電壓(在我們一直使用的示例中為接地)。然后,當(dāng)在引腳上檢測到超過某個預(yù)定閾值(例如,滿量程電壓的三分之二)的電壓時,讓軟件進(jìn)入校準(zhǔn)模式。
選擇校準(zhǔn)電壓時,我們希望選擇在參考電壓處于其可能的最低值時不會使 ADC 飽和的最大值。這可確保我們在計算校準(zhǔn)常數(shù)(或表格)時不會因為位舍入誤差而失去準(zhǔn)確性。這通常會使校準(zhǔn)電壓高于滿量程值的 90%,盡管我們可能希望選擇最接近的標(biāo)準(zhǔn)參考電壓以簡化設(shè)計。
在某些應(yīng)用中,我們可以通過尋找 ADC 輸入的變化來解決參考問題。我們可能會看到光學(xué)傳感器發(fā)生 10% 的變化,而不是將其與固定值進(jìn)行比較,或者我們可能會看到溫度下降 25%。當(dāng)然,傳感器的精度也包括在內(nèi),但該主題超出了本文的范圍。
盡管有時很難知道要為我們的應(yīng)用使用哪種 ADC,但種類繁多的部件可確保我們找到適合我們需要的部件。將軟件與硬件相匹配可確保我們獲得產(chǎn)品所需的準(zhǔn)確性和可靠性。