標定的概念
標定是一種校準過程,它通過與已知的標準或參考值進行比較來確保測量設(shè)備、儀器或系統(tǒng)的準確性和可靠性。這個過程涉及調(diào)整設(shè)備,以消除系統(tǒng)誤差和提高測量結(jié)果與真實值的一致性,從而確保數(shù)據(jù)的精確度和可重復性。
1.為什么去標定
我們使用單片機ADC讀取的電壓電流值由于制造公差、溫度變化、時間老化、電源波動等因素引起的初始誤差和漂移,我們需要對電壓電流進行標定校準,使得我們得到的電壓電流值是正確的。
2.標定的方法
標定的方法多種多樣,我們需要根據(jù)自己的需求來選擇相應(yīng)的方法,常見的標定方法如下所示:
(1)直接比較法:
將待標定的測量設(shè)備與一個已知準確度的標準設(shè)備進行比較,直接讀取并記錄差異。
(2)多點標定法:在多個已知的標準點上進行測量,收集數(shù)據(jù)點,然后通過數(shù)學模型(如多項式擬合)來確定設(shè)備輸出與標準值之間的關(guān)系。(3)線性回歸法:使用最小二乘法等統(tǒng)計技術(shù),通過擬合最佳擬合線來確定設(shè)備輸出與標準輸入值之間的線性關(guān)系。(4)分段線性標定:當測量設(shè)備的響應(yīng)在不同輸入范圍內(nèi)呈現(xiàn)不同的線性度時,可以采用分段線性標定,即在不同的輸入范圍內(nèi)使用不同的線性模型。
(5)非線性標定:
對于非線性設(shè)備,使用非線性函數(shù)(如指數(shù)、對數(shù)或S形曲線)來描述輸入與輸出之間的關(guān)系。
標定的實現(xiàn)
1.CW32開發(fā)板的實物圖和原理圖
2.軟件代碼講解
(1)濾波算法在做電壓值的校準之前,我們根據(jù)傳感器采集到的是連續(xù)性的時間序列信號,所以我們可以采用了均值濾波對單片機采集到的AD值進行濾波處理。在程序中我首先初始化總和、最大值和最小值變量,然后在一個循環(huán)中累加數(shù)組 value 中所有元素的值,并同時更新最大值和最小值。循環(huán)結(jié)束后,從總和中減去最大值和最小值,以排除可能的異常數(shù)據(jù)點,最后將調(diào)整后的總和除以數(shù)組元素數(shù)減去2,得到并返回一個濾除極端值后的均值。這種方法有助于減少數(shù)據(jù)中的噪聲,特別是當數(shù)據(jù)集中包含異常高值或低值時。代碼如下所示:
uint32_t Mean_Value_Filter(uint16_t *value, uint32_t size) //均值濾波 { uint32_t sum = 0; //ADC采樣數(shù)據(jù)和 uint16_t max = 0; uint16_t min = 0xffff; //min初值取最大是為了將第一個數(shù)據(jù)記錄 int i; for(i = 0; i < size; i++) { sum += value[i]; if(value[i] > max) { max = value[i]; } if(value[i] < min) { min = value[i]; } } sum -= max + min; //去除最大最小值 sum = sum / (size - 2); return sum; }
(2)分段線性標定
在代碼中定義了電壓校準的相關(guān)變量X06和X12,分別代表著6V對應(yīng)的AD代碼值和12V對應(yīng)的AD代碼值。其中還定義了縱坐標的變量Y06和Y12,這個對應(yīng)著電壓值6V和12V。最后定義了坐標軸的斜率K,如下所示:
//5V與15V 校準 unsigned int X06=0; unsigned int X12=0; unsigned int Y06=6; unsigned int Y12=12; float K; //斜率
在標定校準之前,我們需要計算斜率,根據(jù)兩點確定一條直線算出該區(qū)間內(nèi)的斜率K,如下圖所示:
void Count_K(void) { K = (Y12 - Y06); K = K/(X12 - X06); }
我們還需要存儲校準值,我們在一個數(shù)組中存了三個數(shù)據(jù),第一個數(shù)據(jù)是判斷位(0xaa),判斷當前是否存儲過校準值。其中兩個是6V對應(yīng)的AD代碼值和12V對應(yīng)的AD代碼值。存儲之前需要擦除然后才能寫入數(shù)據(jù)。代碼如下所示:
void flash_calibration(void) { uint16_t dat[5]; dat[0]=0xaa; dat[1]=X06; dat[2]=X12; flash_erase(); flash_write(0,dat,5); }
我們除了寫入校準值還要讀取校準值,先讀取校準值,判斷第一個數(shù)據(jù)是否為0xaa,如果不是0xaa,代表沒校準過,需要賦一個初始化進行存儲。例如
X06 = 6.0/23/1.5*4096;如果第一個值是0xaa,那就可以把存儲過的值賦給我們的變量就可以了,代碼如下所示。
void judge_calibration(void) { uint16_t dat[5]; flash_read(0,dat, 5); if(dat[0]!=0xaa) { X06 = 6.0/23/1.5*4096; X12 = 12.0/23/1.5*4096; flash_calibration(); } else { X06=dat[1]; X12=dat[2]; } }
我們可以通過按鍵對每一個區(qū)間的信號進行校準,比如說我們這次校準的是6~12V區(qū)間內(nèi)的信號,初始化時可以通過按下一次按鍵對6V時候的數(shù)據(jù)校準,再按一次按鍵就可以對12V時候的數(shù)據(jù)校準,代碼如下所示:
void button_select_calibration(void) { if(GPIO_ReadPin(CW_GPIOB,GPIO_PIN_12) == GPIO_Pin_RESET)//按鍵按下 { mode++; if(mode >2) mode =0; while(GPIO_ReadPin(CW_GPIOB,GPIO_PIN_12) == GPIO_Pin_RESET); } if(mode == 0) { DisPlay_dianya(V_Buffer); } else if(mode == 1) { X06=Mean_Value_Filter(Volt_Buffer,ADC_SAMPLE_SIZE); flash_calibration(); Count_K(); Volt_Cal(); DisPlay_dianya(V_Buffer); } else if(mode == 2) { X12=Mean_Value_Filter(Volt_Buffer,ADC_SAMPLE_SIZE); flash_calibration(); Count_K(); Volt_Cal(); DisPlay_dianya(V_Buffer); } }
3.分段線性標定分析和處理
在這個程序中,我們的思想是同時兩路AD采集,一個是測量電壓的,一個是測量電流的,同時讀取AD數(shù)據(jù),進而能對二者一起校準。代碼如下所示:
void Get_ADC_Value(void) { static uint8_t cnt; ADC_GetSqr0Result(&Volt_Buffer[cnt]); ADC_GetSqr3Result(&Curr_Buffer[cnt]); cnt++; if(cnt >= ADC_SAMPLE_SIZE) { cnt = 0; } }
我們在電壓電流表上測量了大量的數(shù)據(jù),如下圖所示:
在上面圖中可以看出實際的電壓值和測量的電壓值存在一定的偏差,我們將它們的偏差值做成一個折線圖給大家看看,如下圖所示。
常見標定的原理是:使用AD值作為X軸,電壓(電流)值作為Y軸;在電壓(電流)為0的時候標定為Xmin,在電壓(電流)為最大量程的時候標定為Xmax,根據(jù)數(shù)學公式兩點確定一條直線,可以得到這條直線的斜率K。根據(jù)Y=kx公式我們可以通過輸出每一個AD值得到對應(yīng)的電壓(電流)值。
常見的標定是在只有最小值和最大值之間做了標定,如果這兩個值的范圍很大,使用中間的AD值也會出現(xiàn)誤差,所以我們就需要多做幾組標定,使得數(shù)據(jù)更加準確,這樣就形成了分段線性標定。效果圖如下所示。
如果我們求X3到X2之間的電壓值,可以根據(jù)公式:Y=k×(Xad-X2)+5得到準確的電壓值,在這條折線上標的點越多,測量得到的電壓值就越準確。
4.標定的結(jié)果
標定之前的實驗數(shù)據(jù)顯示,誤差在0.08V左右,數(shù)據(jù)如下所示:
誤差的折線圖如下所示:
實物的測量圖顯示誤差在0.08左右,結(jié)果如下所示:
在6V標定之后實驗數(shù)據(jù)顯示誤差在0.01V左右,數(shù)據(jù)如下所示:
標定校準后的誤差的折線圖如下所示,可以看出6V標定后的誤差范圍在0V到0.03V之間的,所以證明了多處標定,得到的測量值就越精確。
經(jīng)過標定校準后的電壓顯示沒有誤差,結(jié)果如下所示:
審核編輯 黃宇
-
精度測量
+關(guān)注
關(guān)注
0文章
8瀏覽量
8266 -
CW32
+關(guān)注
關(guān)注
1文章
203瀏覽量
626
發(fā)布評論請先 登錄
相關(guān)推薦
評論