當(dāng)處理器經(jīng)過模數(shù)轉(zhuǎn)換得到數(shù)值之后,需要經(jīng)過進一步的轉(zhuǎn)換得到表征真實物理量的數(shù)值。
得到了物理量數(shù)值,就可以進行顯示,故障判斷等操作。
我們需要找到從模數(shù)轉(zhuǎn)換數(shù)值到物理量之間的轉(zhuǎn)換關(guān)系;
比如,用14位的ADC對市電電壓進行采樣,得到了某個數(shù)據(jù),該數(shù)據(jù)并不是電壓值,而需要經(jīng)過轉(zhuǎn)換關(guān)系得到電壓值。
如果傳感器和信號處理電路的線性度都比較好,可以在整個測量范圍內(nèi)采用線性關(guān)系進行轉(zhuǎn)換,如下:
ADC與物理量的線性關(guān)系
x為ADC讀到的數(shù)值,y為物理量的數(shù)值,比如電壓值、電流值、溫度值、壓力值等等。
有兩個問題需要注意:
1) k,b的數(shù)值從何而來
2) 單片機如何轉(zhuǎn)換
一、k, b數(shù)值的確認
我通常采用三種方法來確認k、b數(shù)值:
1)正向推導(dǎo),根據(jù)傳感器、信號處理電路的線性關(guān)系推導(dǎo)得到:
以下圖的三相線電壓測量電路為例:
三相線電壓測量電路
電壓互感器的參數(shù)為:
初次級的變比:1mA:1mA
初級限流電流為:400kΩ;
次級線圈電阻為:17Ω;
次級采樣電阻為:100Ω;
運放組成的處理電路的參數(shù)為:
放大倍數(shù):47/(4.7+0.1//0.017)=9.969。
根據(jù)這些參數(shù),假設(shè)相電壓的真有效值為U,按照下面步驟推導(dǎo):
-
初級電流為
-
次極輸出電壓=次極電流*100//4700=
-
-
運放輸出電壓=次極輸出電壓*放大倍數(shù)
-
單片機讀到的14位ADC的數(shù)值=
-
-
ADC與線電壓的關(guān)系為:
-
-
進一步得到:
-
-
為了減少量化誤差,提供精度,我們對換算得到的電壓保留一位小數(shù),當(dāng)用整數(shù)來表示需,需要擴大10倍,得到:
從而得到了ADC與擴大10倍的線電壓之間的線性轉(zhuǎn)換關(guān)系,其k=3.302264,b=0;
2)分段線性化以及最小二乘法確認轉(zhuǎn)換關(guān)系
在另一篇文章中詳述。
二、 單片機如何轉(zhuǎn)換
當(dāng)我們得到ADC數(shù)值與物理量之間的線性轉(zhuǎn)換關(guān)系:
我們需要在程序中將物理量計算出來。
低端的單片機都沒有硬件浮點數(shù)計算能力,即使是32位的cortex-M0/cortex-M3內(nèi)核的處理器(如STM32F0xx以及STM32F1xx系統(tǒng)處理器)也沒有硬件浮點數(shù)計算能力。
當(dāng)我們通過浮點數(shù)進行轉(zhuǎn)換運算時,會消耗大量的時間。
我的做法是,將k轉(zhuǎn)變?yōu)檎砸粋€整數(shù)后再除以另一個整數(shù),
而對物理量保留小數(shù)點,利用擴大整10倍的整數(shù)進行存儲時,b可以直接四舍五入為整數(shù);
即:
,其中,M、N、b都是整數(shù)。
在STM32F103的處理器上,我做了一些測算:
采用64MHz的時間頻率,
計算65535次的浮點數(shù)轉(zhuǎn)換的耗時為:164ms。
單次運算耗時為:2.5us。
轉(zhuǎn)化為整數(shù)乘除運算,計算65535次耗時為:20ms。
單次運算耗時為:0.31us。
當(dāng)轉(zhuǎn)為整數(shù)運算時,可能會擴大舍入誤差。
我的做法是,根據(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)注
2561文章
52198瀏覽量
761690 -
adc
+關(guān)注
關(guān)注
99文章
6611瀏覽量
547729 -
數(shù)值
+關(guān)注
關(guān)注
0文章
80瀏覽量
14511
原文標(biāo)題:ADC數(shù)值標(biāo)定轉(zhuǎn)換為物理量數(shù)值的方法及注意事項
文章出處:【微信號:mcu168,微信公眾號:硬件攻城獅】歡迎添加關(guān)注!文章轉(zhuǎn)載請注明出處。
發(fā)布評論請先 登錄
相關(guān)推薦
TLV5616數(shù)據(jù)轉(zhuǎn)換過程中當(dāng)數(shù)字量為奇數(shù)值時寫不進去或著轉(zhuǎn)換不出模擬量,怎么解決?
ADC08060測試數(shù)值偏低的原因?怎么解決?
ADS1120讀取K type的數(shù)值很小是怎么回事?
用PGA309 -USB DAQ板標(biāo)定PGA309的過程中,ADC無法采集到電壓信號,為什么?
labview字符串?dāng)?shù)組轉(zhuǎn)化為數(shù)值數(shù)組
plc模擬量和數(shù)字量之間的轉(zhuǎn)換方法
模擬量4-20ma對應(yīng)的數(shù)字量是多少
將模擬量轉(zhuǎn)換為數(shù)字量,采用什么轉(zhuǎn)換器
數(shù)字量與模擬量的關(guān)系如何算
電感傳感器能夠測量哪些物理量?
PLC對模擬量信號的處理過程及方法 詳解版

評論