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