當處理器經過模數轉換得到數值之后,需要經過進一步的轉換得到表征真實物理量的數值。
得到了物理量數值,就可以進行顯示,故障判斷等操作。
我們需要找到從模數轉換數值到物理量之間的轉換關系;
比如,用14位的ADC對市電電壓進行采樣,得到了某個數據,該數據并不是電壓值,而需要經過轉換關系得到電壓值。
如果傳感器和信號處理電路的線性度都比較好,可以在整個測量范圍內采用線性關系進行轉換,如下:
ADC與物理量的線性關系
x為ADC讀到的數值,y為物理量的數值,比如電壓值、電流值、溫度值、壓力值等等。
有兩個問題需要注意:
1) k,b的數值從何而來
2) 單片機如何轉換
一、k, b數值的確認
我通常采用三種方法來確認k、b數值:
1)正向推導,根據傳感器、信號處理電路的線性關系推導得到:
以下圖的三相線電壓測量電路為例:
三相線電壓測量電路
電壓互感器的參數為:
初次級的變比:1mA:1mA
初級限流電流為:400kΩ;
次級線圈電阻為:17Ω;
次級采樣電阻為:100Ω;
運放組成的處理電路的參數為:
放大倍數:47/(4.7+0.1//0.017)=9.969。
根據這些參數,假設相電壓的真有效值為U,按照下面步驟推導:
-
初級電流為
-
次極輸出電壓=次極電流*100//4700=
-
-
運放輸出電壓=次極輸出電壓*放大倍數
-
單片機讀到的14位ADC的數值=
-
-
ADC與線電壓的關系為:
-
-
進一步得到:
-
-
為了減少量化誤差,提供精度,我們對換算得到的電壓保留一位小數,當用整數來表示需,需要擴大10倍,得到:
從而得到了ADC與擴大10倍的線電壓之間的線性轉換關系,其k=3.302264,b=0;
2)分段線性化以及最小二乘法確認轉換關系
在另一篇文章中詳述。
二、 單片機如何轉換
當我們得到ADC數值與物理量之間的線性轉換關系:
我們需要在程序中將物理量計算出來。
低端的單片機都沒有硬件浮點數計算能力,即使是32位的cortex-M0/cortex-M3內核的處理器(如STM32F0xx以及STM32F1xx系統處理器)也沒有硬件浮點數計算能力。
當我們通過浮點數進行轉換運算時,會消耗大量的時間。
我的做法是,將k轉變為整以一個整數后再除以另一個整數,
而對物理量保留小數點,利用擴大整10倍的整數進行存儲時,b可以直接四舍五入為整數;
即:
,其中,M、N、b都是整數。
在STM32F103的處理器上,我做了一些測算:
采用64MHz的時間頻率,
計算65535次的浮點數轉換的耗時為:164ms。
單次運算耗時為:2.5us。
轉化為整數乘除運算,計算65535次耗時為:20ms。
單次運算耗時為:0.31us。
當轉為整數運算時,可能會擴大舍入誤差。
我的做法是,根據整數M、N的位數取大數,比如16位的數。
如果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)
}
-
傳感器
+關注
關注
2563文章
52573瀏覽量
763720 -
adc
+關注
關注
99文章
6639瀏覽量
548260 -
數值
+關注
關注
0文章
80瀏覽量
14532
原文標題:ADC數值標定轉換為物理量數值的方法及注意事項
文章出處:【微信號:mcu168,微信公眾號:硬件攻城獅】歡迎添加關注!文章轉載請注明出處。
發布評論請先 登錄
評論