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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 2231|回復: 11
打印 上一主題 下一主題
收起左側

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

[復制鏈接]
跳轉到指定樓層
樓主
ID:975927 發表于 2021-11-16 09:45 | 只看該作者 回帖獎勵 |倒序瀏覽 |閱讀模式
請教各位大佬,我想用51單片機寫一個定時器每10ms進行一次AD采樣,對16次的采樣值進行算術平均濾波,采樣函數和濾波函數都應該在哪調用,中斷還是主函數?
分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏 分享淘帖 頂 踩
回復

使用道具 舉報

沙發
ID:750420 發表于 2021-11-16 10:59 | 只看該作者
采樣函數和濾波函數均在主函數中調用,使用標記位的方式,在主函數中去檢測標記位是否被觸發,然后執行相應的函數即可
回復

使用道具 舉報

板凳
ID:546770 發表于 2021-11-16 11:43 | 只看該作者
濾波在主函數最好,ADC轉換完成一般也可以有個引腳觸發中斷,在這個中斷讀取轉換的值就好了,只要中斷里面不加延時函數一般都沒多大問題的。
回復

使用道具 舉報

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

使用道具 舉報

5#
ID:975927 發表于 2021-11-16 13:46 | 只看該作者
本帖最后由 1027669350 于 2021-11-16 15:57 編輯
Y_G_G 發表于 2021-11-16 13:05
在中斷中進行ADC數字量的累加和平均,最大值最多加到一個32位整型數據,256次以下的累加用不了多少時間的,平 ...

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

使用道具 舉報

6#
ID:908826 發表于 2021-11-16 14:37 | 只看該作者
主函數里面吧,
回復

使用道具 舉報

7#
ID:624769 發表于 2021-11-16 16:42 | 只看該作者
我很好奇,你怎么會認為:“每10ms進行一次AD采樣,對16次的采樣值進行算術平均濾波,” 這個操作對“濾波”是最優解的?
我們撇開Hz率不講,舉個現實中的例子, 要統計地鐵的平均客流量, 是每天定時去采樣1小時,連續30天(共計30小時)來的準確,還是, 直接去連續統計24小時平均后來的準確?
回復

使用道具 舉報

8#
ID:975927 發表于 2021-11-16 16:52 | 只看該作者
188610329 發表于 2021-11-16 16:42
我很好奇,你怎么會認為:“每10ms進行一次AD采樣,對16次的采樣值進行算術平均濾波,” 這個操作對“濾波 ...

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

使用道具 舉報

9#
ID:885416 發表于 2021-11-16 17:13 來自觸屏版 | 只看該作者
耗時時間短的操作在中斷里去做,耗時時間長的如計算在主函數做
回復

使用道具 舉報

10#
ID:624769 發表于 2021-11-16 17:22 | 只看該作者
1027669350 發表于 2021-11-16 16:52
那我應該采用什么方法進行采樣和濾波呢,剛接觸這一方面,知道的太少了

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

使用道具 舉報

11#
ID:401564 發表于 2021-11-16 17:29 | 只看該作者
1027669350 發表于 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數據
unsigned long int                 ADC_ANf;                //ADCf數據                  
//──────────────────────────────────────────────────────────────────────────────────
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中斷函數
{

static unsigned char                          count7;                        //ADC通道6轉換次數記錄
static unsigned char                          countf;                        //ADC通道f轉換次數記錄,內部參考電壓通道
static unsigned long int                 ADC_DATA7;                //ADC0數據,累加
static unsigned long int                 ADC_DATAf;                //ADCf數據,累加               
ADC_CONTR=ADC_CONTR&0xdf;                  //清除中斷標志位
                //──────────────────────────────────────────────────────────────────────────
                if(ADC_LINE==ADC_P1f)                                                          //檢測觸發ADC中斷的通道
                        {  
                                if(countf>=ADC_COUNT)                                         //檢測ADC轉換次數
                                        {
                                                 ADC_ANf=ADC_DATAf/ADC_COUNT;          //取平均值
                                                 ADC_DATAf=0x00;                                          //清除ADC累加結果
                                                 countf=0x00;                                          //清除ADC轉換次數記錄
                                        }
                                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
}

回復

使用道具 舉報

12#
ID:123289 發表于 2021-11-18 15:02 | 只看該作者
采樣在中斷中進行,計算在主程序是進行。
回復

使用道具 舉報

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

本版積分規則

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 中文字幕一区二区三区精彩视频 | 日韩高清三区 | 亚洲一区二区三区免费在线观看 | 污污的网站在线观看 | 新超碰97 | 国产欧美精品一区 | 亚洲精品一二区 | 91久久精品国产91久久 | 欧美成人精品一区二区男人看 | 国产精品永久久久久久久www | 9999国产精品欧美久久久久久 | 天天躁人人躁人人躁狂躁 | av中文字幕在线观看 | 国产精品久久久久永久免费观看 | 日本韩国欧美在线观看 | 成人小视频在线观看 | 久久99久久98精品免观看软件 | 日本手机看片 | 日韩免费看视频 | 午夜成人免费电影 | 国产成人免费视频 | 欧美激情一区二区三区 | 久久精品欧美一区二区三区麻豆 | 亚洲精品在线播放 | 欧美成人精品一区二区男人看 | 欧美日韩久久精品 | 午夜精品久久久久久久久久久久久 | 亚洲av毛片 | 国产精品成人在线观看 | 久久精品亚洲欧美日韩精品中文字幕 | 中文字幕亚洲精品 | 日韩高清国产一区在线 | 亚洲一区 中文字幕 | 国产亚洲精品精品国产亚洲综合 | 不用播放器看的av | 欧美一卡二卡在线观看 | 中文一区二区 | 免费的网站www | 日本免费一区二区三区四区 | 激情欧美日韩一区二区 | 亚洲第一成人av |