當(dāng)處理器經(jīng)過模數(shù)轉(zhuǎn)換得到數(shù)值之后,需要經(jīng)過進(jìn)一步的轉(zhuǎn)換得到表征真實(shí)物理量的數(shù)值。
得到了物理量數(shù)值,就可以進(jìn)行顯示,故障判斷等操作。
我們需要找到從模數(shù)轉(zhuǎn)換數(shù)值到物理量之間的轉(zhuǎn)換關(guān)系;
比如,用14位的ADC對市電電壓進(jìn)行采樣,得到了某個數(shù)據(jù),該數(shù)據(jù)并不是電壓值,而需要經(jīng)過轉(zhuǎn)換關(guān)系得到電壓值。
如果傳感器和信號處理電路的線性度都比較好,可以在整個測量范圍內(nèi)采用線性關(guān)系進(jìn)行轉(zhuǎn)換,如下:
ADC與物理量的線性關(guān)系
x為ADC讀到的數(shù)值,y為物理量的數(shù)值,比如電壓值、電流值、溫度值、壓力值等等。
有兩個問題需要注意:
1) k,b的數(shù)值從何而來
2) 單片機(jī)如何轉(zhuǎn)換
一、k, b數(shù)值的確認(rèn)
我通常采用三種方法來確認(rèn)k、b數(shù)值:
1)正向推導(dǎo),根據(jù)傳感器、信號處理電路的線性關(guān)系推導(dǎo)得到:
以下圖的三相線電壓測量電路為例:
三相線電壓測量電路
電壓互感器的參數(shù)為:
初次級的變比:1mA:1mA
初級限流電流為:400kΩ;
次級線圈電阻為:17Ω;
次級采樣電阻為:100Ω;
運(yùn)放組成的處理電路的參數(shù)為:
放大倍數(shù):47/(4.7+0.1//0.017)=9.969。
根據(jù)這些參數(shù),假設(shè)相電壓的真有效值為U,按照下面步驟推導(dǎo):
-
初級電流為
-
次極輸出電壓=次極電流*100//4700=
-
-
運(yùn)放輸出電壓=次極輸出電壓*放大倍數(shù)
-
單片機(jī)讀到的14位ADC的數(shù)值=
-
-
ADC與線電壓的關(guān)系為:
-
-
進(jìn)一步得到:
-
-
為了減少量化誤差,提供精度,我們對換算得到的電壓保留一位小數(shù),當(dāng)用整數(shù)來表示需,需要擴(kuò)大10倍,得到:
從而得到了ADC與擴(kuò)大10倍的線電壓之間的線性轉(zhuǎn)換關(guān)系,其k=3.302264,b=0;
2)分段線性化以及最小二乘法確認(rèn)轉(zhuǎn)換關(guān)系
在另一篇文章中詳述。
二、 單片機(jī)如何轉(zhuǎn)換
當(dāng)我們得到ADC數(shù)值與物理量之間的線性轉(zhuǎn)換關(guān)系:
我們需要在程序中將物理量計算出來。
低端的單片機(jī)都沒有硬件浮點(diǎn)數(shù)計算能力,即使是32位的cortex-M0/cortex-M3內(nèi)核的處理器(如STM32F0xx以及STM32F1xx系統(tǒng)處理器)也沒有硬件浮點(diǎn)數(shù)計算能力。
當(dāng)我們通過浮點(diǎn)數(shù)進(jìn)行轉(zhuǎn)換運(yùn)算時,會消耗大量的時間。
我的做法是,將k轉(zhuǎn)變?yōu)檎砸粋€整數(shù)后再除以另一個整數(shù),
而對物理量保留小數(shù)點(diǎn),利用擴(kuò)大整10倍的整數(shù)進(jìn)行存儲時,b可以直接四舍五入為整數(shù);
即:
,其中,M、N、b都是整數(shù)。
在STM32F103的處理器上,我做了一些測算:
采用64MHz的時間頻率,
計算65535次的浮點(diǎn)數(shù)轉(zhuǎn)換的耗時為:164ms。
單次運(yùn)算耗時為:2.5us。
轉(zhuǎn)化為整數(shù)乘除運(yùn)算,計算65535次耗時為:20ms。
單次運(yùn)算耗時為:0.31us。
當(dāng)轉(zhuǎn)為整數(shù)運(yùn)算時,可能會擴(kuò)大舍入誤差。
我的做法是,根據(jù)整數(shù)M、N的位數(shù)取大數(shù),比如16位的數(shù)。
如果k小于1,則將N固定為65535。
M=round(k*65535)。
如果k大于等于1,則將M固定為65535。
N=round(65535/k)。
在上例中,k=3.302264,則M=65535,N=round(65535/3.302264)=19845。
const STRConfigCalDef g_pt_calvoldefs[PT_VOLTAGE_NUM] =
{
{65535, 19845, 0},
{65535, 19845, 0},
{65535, 19845, 0}
};
U16 pt_calval(U16 val, U16 pm, U16 pn, signed int pk,){
U32 uwDataA;
signed int uwDataB;
U16 resval;
uwDataA = (U32)val * pm;
if(pn == 0){
pn = 1;
}
uwDataA = (U32)val * pm;
uwDataA = (U32)uwDataA / pn;
uwDataB = (signed int)uwDataA;
uwDataB = uwDataB + pk;
if(uwDataB < 0){
uwDataB = 0;
}
if(uwDataB > 65535){
uwDataB = 65535;
}
resval = (U16)uwDataB;
return(resval)
}
-
傳感器
+關(guān)注
關(guān)注
2546文章
50481瀏覽量
751178 -
adc
+關(guān)注
關(guān)注
98文章
6402瀏覽量
543846 -
數(shù)值
+關(guān)注
關(guān)注
0文章
80瀏覽量
14340
原文標(biāo)題:ADC數(shù)值標(biāo)定轉(zhuǎn)換為物理量數(shù)值的方法及注意事項(xiàng)
文章出處:【微信號:mcu168,微信公眾號:硬件攻城獅】歡迎添加關(guān)注!文章轉(zhuǎn)載請注明出處。
發(fā)布評論請先 登錄
相關(guān)推薦
評論