找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 2141|回復: 11
收起左側

單片機AD采樣,算術平均濾波后得到的數(shù)據(jù)出錯

[復制鏈接]
ID:975927 發(fā)表于 2021-11-16 09:45 | 顯示全部樓層 |閱讀模式
請教各位大佬,我想用51單片機寫一個定時器每10ms進行一次AD采樣,對16次的采樣值進行算術平均濾波,采樣函數(shù)和濾波函數(shù)都應該在哪調用,中斷還是主函數(shù)?
回復

使用道具 舉報

ID:750420 發(fā)表于 2021-11-16 10:59 | 顯示全部樓層
采樣函數(shù)和濾波函數(shù)均在主函數(shù)中調用,使用標記位的方式,在主函數(shù)中去檢測標記位是否被觸發(fā),然后執(zhí)行相應的函數(shù)即可
回復

使用道具 舉報

ID:546770 發(fā)表于 2021-11-16 11:43 | 顯示全部樓層
濾波在主函數(shù)最好,ADC轉換完成一般也可以有個引腳觸發(fā)中斷,在這個中斷讀取轉換的值就好了,只要中斷里面不加延時函數(shù)一般都沒多大問題的。
回復

使用道具 舉報

ID:401564 發(fā)表于 2021-11-16 13:05 | 顯示全部樓層
在中斷中進行ADC數(shù)字量的累加和平均,最大值最多加到一個32位整型數(shù)據(jù),256次以下的累加用不了多少時間的,平均后的數(shù)據(jù)存放到一個全局變量中,在主程序中通過這個全局變量來處理就可以
中斷中不能有延時,等待,浮點運算
回復

使用道具 舉報

ID:975927 發(fā)表于 2021-11-16 13:46 | 顯示全部樓層
本帖最后由 1027669350 于 2021-11-16 15:57 編輯
Y_G_G 發(fā)表于 2021-11-16 13:05
在中斷中進行ADC數(shù)字量的累加和平均,最大值最多加到一個32位整型數(shù)據(jù),256次以下的累加用不了多少時間的,平 ...

不好意思,問一個低級的問題,我這樣寫數(shù)碼管是不會顯示的,能幫忙修改一下嗎
void main()
{
        adcs=0;
        Init();
        while(1)
        {
                display(2*value);
        }
}
//定時器中斷函數(shù)
void time0() interrupt 1
{
        
        TH0=(65536-9174)/256;      //重新裝入初值
  TL0=(65526-9174)%256;
        num++;
        myvalue=getad();
        sum+=myvalue;
     
        if(num==16)
        {
                value=sum/16;
        }
}
回復

使用道具 舉報

ID:908826 發(fā)表于 2021-11-16 14:37 | 顯示全部樓層
主函數(shù)里面吧,
回復

使用道具 舉報

ID:624769 發(fā)表于 2021-11-16 16:42 | 顯示全部樓層
我很好奇,你怎么會認為:“每10ms進行一次AD采樣,對16次的采樣值進行算術平均濾波,” 這個操作對“濾波”是最優(yōu)解的?
我們撇開Hz率不講,舉個現(xiàn)實中的例子, 要統(tǒng)計地鐵的平均客流量, 是每天定時去采樣1小時,連續(xù)30天(共計30小時)來的準確,還是, 直接去連續(xù)統(tǒng)計24小時平均后來的準確?
回復

使用道具 舉報

ID:975927 發(fā)表于 2021-11-16 16:52 | 顯示全部樓層
188610329 發(fā)表于 2021-11-16 16:42
我很好奇,你怎么會認為:“每10ms進行一次AD采樣,對16次的采樣值進行算術平均濾波,” 這個操作對“濾波 ...

那我應該采用什么方法進行采樣和濾波呢,剛接觸這一方面,知道的太少了
回復

使用道具 舉報

ID:885416 發(fā)表于 2021-11-16 17:13 來自手機 | 顯示全部樓層
耗時時間短的操作在中斷里去做,耗時時間長的如計算在主函數(shù)做
回復

使用道具 舉報

ID:624769 發(fā)表于 2021-11-16 17:22 | 顯示全部樓層
1027669350 發(fā)表于 2021-11-16 16:52
那我應該采用什么方法進行采樣和濾波呢,剛接觸這一方面,知道的太少了

采樣不要用定時器間隔,直接連續(xù)采樣,計算可以參考地板。
回復

使用道具 舉報

ID:401564 發(fā)表于 2021-11-16 17:29 | 顯示全部樓層
1027669350 發(fā)表于 2021-11-16 16:52
那我應該采用什么方法進行采樣和濾波呢,剛接觸這一方面,知道的太少了

ADC采用中斷方式呀
我一開始沒有認真看,還以為你是采用ADC中斷模式
ADC采用中斷模式,128次ADC累加后,取平均值就行,我試過,去不去掉這個最大和最小值,對于結果影響并不大,可以說是沒啥效果以下是我STC8G的ADC,你參考一下
/*stc8g系列單片機ADC程序*/

#include "Stc8g.h"
#include "Stc8g_Adc.h"
#define         ADC_P10 0x80
#define         ADC_P11 0x81
#define         ADC_P12 0x82
#define         ADC_P13 0x83
#define         ADC_P14 0x84
#define         ADC_P15 0x85
#define         ADC_P16 0x86
#define         ADC_P17 0x87
#define         ADC_P1f 0x8f
#define     ADC_COUNT 128
/*需要在主程序使用以下變量,可以在變量聲明前加上 extern 來聲明,就可以直接調用了*/
//──────────────────────────────────────────────────────────────────────────────────

unsigned char                          ADC_LINE;                //ADC通道記錄
unsigned long int                 ADC_AN7;                //ADC0數(shù)據(jù)
unsigned long int                 ADC_ANf;                //ADCf數(shù)據(jù)                  
//──────────────────────────────────────────────────────────────────────────────────
void Stc8g_Adc_int()//stc8gadc初始化
{
        unsigned int i;
        P1M0=0;
        P1M1=0x80;                //p1.7用作ADC端口       
        ADC_CONTR=0x80;//打開adc電源
        ADCCFG=0x2f;        //設定ADC轉換結果保存格式       
        for(i=10000;i>0;i--);            //延時
        ADC_LINE=ADC_P1f;
        ADC_CONTR=ADC_CONTR|0x40;        //啟動ADC
        EADC=1;
}
//──────────────────────────────────────────────────────────────────────────────────
void Adc_Isr() interrupt 5                         //Adc中斷函數(shù)
{

static unsigned char                          count7;                        //ADC通道6轉換次數(shù)記錄
static unsigned char                          countf;                        //ADC通道f轉換次數(shù)記錄,內部參考電壓通道
static unsigned long int                 ADC_DATA7;                //ADC0數(shù)據(jù),累加
static unsigned long int                 ADC_DATAf;                //ADCf數(shù)據(jù),累加               
ADC_CONTR=ADC_CONTR&0xdf;                  //清除中斷標志位
                //──────────────────────────────────────────────────────────────────────────
                if(ADC_LINE==ADC_P1f)                                                          //檢測觸發(fā)ADC中斷的通道
                        {  
                                if(countf>=ADC_COUNT)                                         //檢測ADC轉換次數(shù)
                                        {
                                                 ADC_ANf=ADC_DATAf/ADC_COUNT;          //取平均值
                                                 ADC_DATAf=0x00;                                          //清除ADC累加結果
                                                 countf=0x00;                                          //清除ADC轉換次數(shù)記錄
                                        }
                                ADC_DATAf+=ADC_RES*256+ADC_RESL;                //ADC結果累加
                                countf++;                          
                                ADC_CONTR=ADC_LINE=ADC_P17;                                //選擇下一個ADC通道
                        }
                //──────────────────────────────────────────────────────────────────────────
                else if(ADC_LINE==ADC_P17)
                        {  
                                if(count7>=ADC_COUNT)
                                        {
                                                 ADC_AN7=ADC_DATA7/ADC_COUNT;
                                                 ADC_DATA7=0x00;
                                                 count7=0x00;
                                        }
                                ADC_DATA7+=ADC_RES*256+ADC_RESL;       
                                count7++;                                                          
                                ADC_CONTR=ADC_LINE=ADC_P1f;
                        }
                //──────────────────────────────────────────────────────────────────────────                  
ADC_CONTR=ADC_CONTR|0x40;                                                                //啟動ADC
}

回復

使用道具 舉報

ID:123289 發(fā)表于 2021-11-18 15:02 | 顯示全部樓層
采樣在中斷中進行,計算在主程序是進行。
回復

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規(guī)則

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

Powered by 單片機教程網(wǎng)

快速回復 返回頂部 返回列表