基于stm32F1的過采樣技術(shù)研究與實現(xiàn)
1問題的提出
2016年TI杯電子設(shè)計競賽G題簡易電子秤中有一項要求如下:
可以計算出該題目要求的精度是
(500-5)/0.01=49500
但是stm32F1自帶ADC只有12位精度,也就是說最多能采集2的12次方個數(shù)據(jù)(2^12=4096),顯然不滿足題目的要求,通過過采樣技術(shù),可以達到需求的精度。
2 過采樣數(shù)據(jù)的抽取
注:這里的p是需要得到額外p位精度
假設(shè)p=1,那么需要采集4^1=4個數(shù)據(jù),假設(shè)這4個數(shù)據(jù)分別為
1101
1100
1011
1010
R表示采樣的位數(shù),在這里R=4
這四個數(shù)據(jù)的累加和為101110(R+2p=6,經(jīng)過累加得到了一個6位的數(shù)據(jù))
然后再將這個6位數(shù)右移1位(p=1),即可得到10111(R+p=5),這個數(shù)值就是提高了1位精度的采樣結(jié)果。
3進行過采樣的前提條件
(1) 輸入信號里必須存在一些噪音,這些噪音必須是白噪音,功率平均分配在整個有用的頻帶內(nèi)。
(2) 噪聲的幅度必須能夠?qū)斎胄盘柈a(chǎn)生足夠大的影響,以使得ADC轉(zhuǎn)換的結(jié)果能隨機的翻轉(zhuǎn)至少1位,否則的話所有的輸入信號將會轉(zhuǎn)換出同樣的值,對這些值進行的抽取操作將不會帶來精度的提高。
注:這里可以參考鏈接部分文章《基于STM32的過采樣技術(shù)研究與實現(xiàn)》
4 程序?qū)崿F(xiàn)
在我自己的程序中并沒有完全按照參考資料里實現(xiàn),我的程序:
while(1){ADC_ConvertedValueLocal=(float)ADC_ConvertedValue/4096*3.3;//讀取AD轉(zhuǎn)換的值,這里的變量ADC_ConvertedValue就是AD轉(zhuǎn)換的值printf("rnThecurrentADvalue=%drn",ADC_ConvertedValue);printf("rnThecurrentADvalue=%fVrn",ADC_ConvertedValueLocal);for(h=0;h<10;h++){//這里的最外層循環(huán)是為了連續(xù)10次打印轉(zhuǎn)換的值,方便觀察for(j=0;j<500;j++){for(i=0;i>8;//右移8位得到的是12位的精度Adctemp4=Adctemp4>>4;//右移4位得到16位的精度//printf("16?????è?a£o%dn",Adctemp4);//printf("12?????è?a£o%dn",Adctemp8);Adctemp=0;sum=sum+Adctemp4;}adcaverage=sum/500;//將16位精度的值取500次,也就是多次采樣求平均值sum=0;printf("adcaverage=%dn",adcaverage);//打印出16位精度連續(xù)取500次值再求得的平均值}Delay(0xffffee);}123456789101112131415161718192021222324252627282930313233
5 注意事項
(1)在程序中ADC的采樣頻率為9MHz,顯然在電子秤這類的采樣中采樣頻率過高,可以選擇降低ADC采樣頻率的方法進一步提高精確度。
(2)更多詳細的內(nèi)容可以參考百度文庫的一篇文章《基于STM32的過采樣技術(shù)研究與實現(xiàn)》,這篇文章分析的比較好,我自己也基本是按照這篇文章的思路來寫的程序。本篇博客只是我自己的一點心得體會,寫的不好的地方多多關(guān)照。
《基于STM32的過采樣技術(shù)研究與實現(xiàn)》
網(wǎng)址為:
http://wenku.baidu.com/link?url=5r_i7r38zSqDF0-cQlWqSBp64UHeXmPKAMGgnKk4u-FYkYdzgltG5btIFz6x0Wyi_8Q8MzoRdo4AHVhGs9MN4fxigSqJUC3O1XPjzefCdeC
頂
0
踩