久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索

stc8單片機自帶ADC值跳動嚴重,采樣數據波動很大

查看數: 34561 | 評論數: 50 | 收藏 5
關燈 | 提示:支持鍵盤翻頁<-左 右->
    組圖打開中,請稍候......
發布時間: 2019-4-21 12:54

正文摘要:

本帖最后由 lidong85 于 2019-4-22 15:24 編輯 STC8A8K64S4A12單片機用自帶ADC進行轉換,硬件采用高精度連接模式(TL431),采樣數據波動很大請問是什么原因?采樣值如圖:

回復

ID:40861 發表于 2023-5-5 12:20
調整好采樣間隔時間,并用中值濾波就可以了
ID:1034262 發表于 2023-5-5 11:30
任何一個ADC都不會這么差的,何況我用STC8系列的MCU真的是穩如狗,精度高。
樓主最大問題,是碰到問題不用示波器測量一下電源、參考電壓、輸入電壓的紋波。
樓主用的TL431并聯104電容,基本上必然自激,示波器一看便知,那么多人分析,說的奧431自激的不多。
431輸出2.5V時內阻0.3歐姆,我從里不加電容。只有用于開關電源反饋那樣的,TL431處于放大狀態,在輸出和反饋端要串聯合適的RC消振。
ID:1075277 發表于 2023-5-4 16:17
如果我一份代碼,ADC采集以后分別10進制輸出和16進制輸出,發現16進制輸出的數據的折線圖有突變,就是在一定范圍內隨機隨時跳變一下。但是10進制很正常,10進制折線圖很平緩,沒有突變,這是為什么啊?
ID:996771 發表于 2021-12-25 12:23
TL431輸出電容接0.1uF肯定是震蕩的,自己去查手冊的穩定性描述。
431想穩定電容要么小于等于1nF,要么大于10uF。
ID:373388 發表于 2020-12-26 16:51
基準源是作為基準用的,不能做電源用,輸出不了足夠的電流驅動負載,引起電壓波動
ID:65956 發表于 2020-12-26 16:08
我用讀內部基準源去換算,就很準啊,就算不用中值慮波法也還可以啊,跳動也就小數點后面第2、3位在一點跳動,還是不錯的啊
ID:868295 發表于 2020-12-26 15:20
STC8A的ADC電源引腳及參考電壓引腳必須要接,否則單片機不會正常工作。參考電壓引腳接2.5V基準電壓沒有任何問題,而且這樣接只會提高ADC采樣的精度。
ID:868198 發表于 2020-12-26 12:31
公開一個基本經驗:AD是高噪聲系統,無論怎么設法減少噪聲都是無用的,單次采樣絕對精度只有高5~6bit,其余低位均被噪聲淹沒,5%的誤差也可以可以,真要保證12bit精度,要求被采信號穩定,采樣數次然后算術平均
ID:226055 發表于 2020-12-4 10:20
    你的問題不像是來源于硬件,但使用STC8A8K64S4A12單片機確實有幾點需要注意:
    1、相對于之前的STC15及更早的單片機系列,STC8A有了ADC電源引腳及參考電壓引腳,所以單片機的最大IO口說是單片機總引腳數減去5(之前單片機是減去2,這個2就是VCC和GND)。
    2、STC8A的ADC電源引腳及參考電壓引腳必須要接,否則單片機不會正常工作。參考電壓引腳接2.5V基準電壓沒有任何問題,而且這樣接只會提高ADC采樣的精度。
    3、一定注意ADC引腳帶采集信號的電壓不要大于STC8A參考電壓引腳的電壓,即待測信號不要大于2.5V(如果采用的是2.5V電壓基準)。
    4、附上一段ADC采集的源碼,對采集的結果沒有做任何軟件濾波的,效果也是剛剛的。
  • /**************************************************************************
  • 功能描述:ADC口初始化
  • 入口參數:無
  • 返回值:無
  • *************************************************************************/  
  • void    ADC_config(void)  
  • {     
  •     ADC_CONTR|=0x80;        //開AD轉換電源  
  •     delay_ms(10);           //適當延時等待AD轉換供電穩定  
  •     ADC_CONTR|=0x0E;              //選擇P0.6作為模擬功能AD使用  
  •     ADC_CONTR&=0xFE;              //選擇P0.6作為模擬功能AD使用  
  •       
  •     ADCCFG&=0xFC;             //AD轉換速度為416個時鐘數轉換一次  
  •     ADCCFG|=0x0C;             //AD轉換速度為416個時鐘數轉換一次  
  •     ADC_CONTR&=0xDF;          //清AD轉換完成標志  
  •          
  •     EADC=0;                   //禁止ADC轉換中斷  
  •     ADCCFG|=0x20;             //ADC轉換結果ADC_RES存高4位,ADC_RESL存低8位  
  •     ADC_CONTR|=0x40;          //啟動AD轉換,ADC_START=1  
  • }  
  •   
  • /**************************************
  • 功能描述:ADC口檢測AD轉換值函數
  • 入口參數:無
  • 返回值:ADC 12位數據
  • ***************************************/  
  • uint16  Get_ADC12bitResult(void)      
  • {  
  •     uint16  AD_Dat=0;  
  •   ADC_CONTR&=0xDF;          // 將ADC_FLAG清0  
  •     ADC_CONTR&=0xBF;        //關閉AD轉換,ADC_START=0  
  •     //12位AD結果的高4位放ADC_RES的低4位,低8位在ADC_RESL  
  •     AD_Dat = ADC_RES;              //將ADC_RES低4位移到應在的第9位至第12位  
  •     AD_Dat <<= 8;  
  •     AD_Dat|= ADC_RESL;         //將ADC_RESL的8位移到應在的低8位  
  •       
  •   ADC_CONTR|=0x40;           //啟動AD轉換,ADC_START=1  
  •     return  AD_Dat;   
  • }  
  •   
  • /***************************************************************************
  • 功能描述:讀取ADC采集的原始值
  • 入口參數:無
  • 返回值:實時原始值
  • **************************************************************************/  
  • uint16  HandleADC(void)   
  • {  
  •     uint16 Temp_signal;  
  •    
  •   //讀取采集的原始值  
  •     Temp_signal=Get_ADC12bitResult();   
  •   
  •   //返回采集的原始值  
  •     return Temp_signal;   
  • }



   5、再附上ADC的電路圖部分及實物圖片段,以鑒真相。






ID:624769 發表于 2020-12-2 16:43
先選ADC通道,再啟動ADC試試。
或者直接 ADC_CONTR = 0xc2;  選通道啟動一步到位。
TL431 即便不加電容, 應該ADC轉換高8位應該也能保持穩定的數值的。

評分

參與人數 1黑幣 +20 收起 理由
admin + 20 共享資料的黑幣獎勵!

查看全部評分

ID:382454 發表于 2020-7-15 16:43
這樣波動正常的很,樓主你用這TL431就注定了波動,怎么搞都沒用的,
想要高精度的,必須要用其它的高精度,超低溫漂的基準,基準這里用5PPM-15PPM的溫漂器件,還有就是DAC供電引腳也要穩定。50PPm的器件,不跳來跳去才怪呢。
另外上樓上很多人都說了,DAC要檢測多次,再求和取平均值才對。

ID:420836 發表于 2020-7-15 08:46
305/5000
ADC值波動的原因有很多,您需要檢查參考電壓是否穩定,或者是否存在接地噪聲,或者信號調節電路中是否有正確的低通濾波器。 從軟件的角度來看,您需要軟件過濾器算法來平均測量值。
ID:752906 發表于 2020-7-14 18:59
STC的ad輸入是沒有緩沖的,內阻很小
ID:519089 發表于 2020-6-30 13:51
MCU_VCC和模擬Vref 要分開,TL431輸出電容不夠大
ID:471427 發表于 2020-6-28 18:46
同問
ID:261024 發表于 2020-5-30 13:58
431基準電壓輸出濾波電容不能太大,104都大了,用102吧,要不然基準電壓都不穩,用示波器觀察有紋波的。
ID:420836 發表于 2020-5-17 21:43
試添加軟件濾波器以平均模擬讀數,以消除轉換中的較大波動。
ID:371527 發表于 2020-5-17 10:24
首先,VREF穩壓輸出要加10uF,TL431也有品質好壞。其次采集端口要串接電阻并加104電容
ID:420836 發表于 2020-3-26 09:48
似乎參考電壓存在一些問題,如果它平均波動20 mV,則轉換后的結果波動可能是平均20點或更大。
ID:65956 發表于 2020-3-26 09:23
我認為是你計算直接用5V的參數值作計算的,你最好測一下現在板上工作的實際電壓值,然后代入這個值進行計算就OK了,不然就讀取芯片內部的基準源再計算MCU的工作電壓會更穩定
ID:25310 發表于 2020-3-26 08:58
431用處不大,看好5V電壓紋波比這個重要,用過STC15w32s4 10ADC 精度也能做到10mV
ID:241128 發表于 2020-3-26 02:18
mark最近用到STC8a系列12位AD,希望能用到。。。
ID:316880 發表于 2020-3-25 20:20
sduking 發表于 2020-3-25 16:42
基準芯片TL431驅動能力不夠的話,在后面加一個運放跟隨,增加驅動電流,或者直接換一個基準源就行了。樓上 ...

用不著那么麻煩,只要AVCC穩定5V直接上,測量范圍0-5V,你要是用431,范圍就是0-2.5V,這個不好用。
ID:316880 發表于 2020-3-25 20:12
lenceliu 發表于 2020-3-6 19:30
“AVCC經過510R電阻5v直接上”的意思是AVCC經過510R連接到Vref嗎?為什么要加電阻,直接連上不可以嗎

不加也可以,因為我把431拿掉了。
ID:228467 發表于 2020-3-25 17:05
都是好經驗,學習了!
ID:602576 發表于 2020-3-25 16:42
基準芯片TL431驅動能力不夠的話,在后面加一個運放跟隨,增加驅動電流,或者直接換一個基準源就行了。樓上的幾位提得都對,應該軟件采集后濾波,平均值,中值濾波都可以,信號到AD輸入端,接一個104的電容濾波,中間可以串一個25-50歐的小電阻
ID:165291 發表于 2020-3-25 16:16
這樣結果是正常的,可采用軟件濾波減少波動。方法:連續采集10次,去除最大、最小各一個,余下8個取平均。
ID:165291 發表于 2020-3-25 16:16
同問呢!
ID:120930 發表于 2020-3-14 11:16
第一次發的代碼有個錯誤 第二次的改正了
ID:120930 發表于 2020-3-14 11:15
void ADC_Isr() interrupt 5
{
        static uint8 i = 0,j = 0;
        uint8 max,min;
        uint16 tmp;
        ADC_CONTR &= ~0X20;       //清零ADC_FLAG       
        if(i<100)
        {
                if(j<100)
                {
                        adcstr[j] = 255-ADC_RES;
                        j ++;
                }
                else
                {
                        tmp = 0;
                        for(j=0;j<100;j++)
                        {
                                tmp += adcstr[j];
                        }
                        max = min = adcstr[0];
                        for(j=0;j<100;j++)
                        {
                                if(min>adcstr[j])
                                        min = adcstr[j];
                                if(max<adcstr[j])
                                        max = adcstr[j];
                        }
                        adcstr1[i] = (tmp-min-max)/98;
                        j = 0;
                        i ++;
                }               
        }
        else
        {
                tmp = 0;
                for(i=0;i<100;i++)
                {
                        tmp += adcstr1[i];
                }
                max = min = adcstr1[0];
                for(i=0;i<100;i++)
                {
                        if(min>adcstr1[i])
                                min = adcstr1[i];
                        if(max<adcstr1[i])
                                max = adcstr1[i];
                }
                temperature = (tmp-min-max)/98;
                i = 0;               
        }
        ADC_CONTR |= 0X40;     //關閉ADC
}
ID:120930 發表于 2020-3-14 11:12
我正在用stc8a8k64s4a12做了個產品,正好用到pt100溫度采集,用adc0采集,官方的高精度電路和官方的代碼,數據變化的厲害,變化幅度有5%,我采用先取10次數據去掉最大和最小再取平均值還是有跳動,然后取100次數據去掉最大和最小再取平均值還是有跳動,最后取100次數據去掉最大和最小再取平均值,把取得100次的平均值再取1000次平均值后就穩定了,一點跳動也沒有,其實也不用取這么多次,因為單片機的資源充足,時間有限我就沒再繼續增減數值做實驗,就這樣用了,最后把代碼奉上
void ADC_Isr() interrupt 5
{
        static uint8 i = 0,j = 0;
        uint8 max,min;
        uint16 tmp;
        ADC_CONTR &= ~0X20;       //清零ADC_FLAG       
        if(i<100)
        {
                if(j<100)
                {
                        adcstr[j] = 255-ADC_RES;
                        j ++;
                }
                else
                {
                        tmp = 0;
                        for(j=0;j<100;j++)
                        {
                                tmp += adcstr[j];
                        }
                        max = min = adcstr[0];
                        for(j=0;j<100;j++)
                        {
                                if(min>adcstr[j])
                                        min = adcstr[j];
                                if(max<adcstr[j])
                                        max = adcstr[j];
                        }
                        adcstr1[i] = (tmp-min-max)/98;
                        j = 0;
                        i ++;
                }               
        }
        else
        {
                tmp = 0;
                for(i=0;i<100;i++)
                {
                        tmp += adcstr1[i];
                }
                max = min = adcstr1[0];
                for(i=0;i<50;i++)
                {
                        if(min>adcstr1[i])
                                min = adcstr1[i];
                        if(max<adcstr1[i])
                                max = adcstr1[i];
                }
                temperature = (tmp-min-max)/98;
                i = 0;               
        }
        ADC_CONTR |= 0X40;     //關閉ADC
}
ID:633626 發表于 2020-3-6 19:30
余生不負 發表于 2020-3-5 22:57
示波器看一下電源電壓穩點不,然后看TL431的2.5V,我之前就是2.5V示波器看了有一點點文波,我直接把431去 ...

“AVCC經過510R電阻5v直接上”的意思是AVCC經過510R連接到Vref嗎?為什么要加電阻,直接連上不可以嗎
ID:316880 發表于 2020-3-5 22:57
太陽的心 發表于 2020-2-28 17:09
我也是遇到這個問題,中位值濾波用了,也不行,測ad口電壓很穩定的,就是讀取出來跳動很大,中位值取的40次 ...

示波器看一下電源電壓穩點不,然后看TL431的2.5V,我之前就是2.5V示波器看了有一點點文波,我直接把431去了,AVCC經過510R電阻5v直接上,不要2.5v,程序里面加了 平均值慮波,轉換的結果顯示 0-30V電壓,結果穩的一批,效果杠杠的
ID:316880 發表于 2020-3-5 22:52
說一下我用STC8A8K,12位AD的經驗,也是按照PDF資料這個搭建的電路,程序不加軟件慮波直接出來的結果跳變特別嚴重,后面想是不是電壓不穩點,用示波器看TL431的2.5V有一點點波浪,不穩點,后面我直接把TL431直接去了,直接5v做基準,數據跳變就沒有多大厲害,然后在程序里面加個平均值慮波,數據很穩點,如果數據轉換出來不穩點,應該檢查TL431的2.5V有沒有波浪,和通道輸入的慮波,還有電源電壓有沒有很大波浪。
ID:159575 發表于 2020-2-29 18:17
stc精度也就這樣,一般五次取平均值就可以了。
ID:401564 發表于 2020-2-29 08:26
太陽的心 發表于 2020-2-28 17:09
我也是遇到這個問題,中位值濾波用了,也不行,測ad口電壓很穩定的,就是讀取出來跳動很大,中位值取的40次 ...

ADC本身就不是一個穩定的,就算是硬件ADC也是要有一定的濾波的
你取值的方法不對
并不是你進行了多次的ADC然后平均就能得到一個平均值的
打個比方:進入ADC中斷或者函數調用ADC,你進行一次ADC之后,ADC結果的值為:1024,如果你直接再進行39次ADC,結果基本上也都是1024.下一次再進行ADC的時候,結果可能是1000,顯示就會有波動了
我的方法是:進行一次ADC之后,保存ADC結果了,就選擇一個不用的通道進行一次ADC,然后再來進行一次當前通道的ADC,不用擔心速度的問題,使用中斷就可以了
你去看一下這個單片機的ADC框圖,就會理解我說的了
ID:696952 發表于 2020-2-28 17:09
我也是遇到這個問題,中位值濾波用了,也不行,測ad口電壓很穩定的,就是讀取出來跳動很大,中位值取的40次濾波,還是不行,而且adc還不滿,最大沒有4096,濾波都做了,地也隔離了就是不行
ID:419072 發表于 2019-6-9 19:21
樓主可以把你說的那個最大值最小值然后平均值那個給我看看么
ID:346927 發表于 2019-5-28 11:31
需要加入濾波算法,比如中值濾波,遞推平均濾波等,數值會穩定很多
ID:494850 發表于 2019-5-28 07:50
剛好遇到同問題,參考了

小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術交流QQ群281945664

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 久久精品国产亚洲 | 尤物在线 | 一级欧美一级日韩片 | 日韩午夜网站 | 久久新视频 | 欧美二区在线 | 91视频91 | 在线亚洲电影 | 免费精品久久久久久中文字幕 | 精品乱人伦一区二区三区 | 亚洲欧美视频一区二区 | 综合色导航 | 日韩乱码av | 中文字幕免费中文 | av在线电影网站 | 亚洲成人综合在线 | 欧美精品一区二区三区在线播放 | 超碰综合| 亚洲第一色站 | 国产精品一区二区久久 | 午夜精品久久 | 日本精品一区 | 久久久久国产精品一区二区 | 天天操 天天操 | 一区二区电影网 | 亚洲一卡二卡 | 蜜月aⅴ免费一区二区三区 99re在线视频 | 久久久久无码国产精品一区 | 日韩免费成人av | 亚洲不卡一 | 99re热精品视频 | 日本xx视频免费观看 | 欧美激情网站 | 日韩精品一区二区三区四区 | 日韩精彩视频 | 精品亚洲一区二区三区 | 亚洲在线免费观看 | 久久夜视频| 欧美精品网 | 国产一级一级国产 | 色婷婷综合久久久中字幕精品久久 |