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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 2699|回復(fù): 18
打印 上一主題 下一主題
收起左側(cè)

單片機(jī)ADC多路轉(zhuǎn)換,有些程序語句不理解,求解釋

  [復(fù)制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
ID:686513 發(fā)表于 2022-2-10 09:37 | 只看該作者 回帖獎勵 |倒序瀏覽 |閱讀模式
后面注釋是我自己加上去的,不知道理解的對不對?還有if(count0<32)          //如果通道0轉(zhuǎn)換次數(shù)小于32 這個語句有沒有數(shù)據(jù)濾波功能,這有32可以是任意值嗎?

單片機(jī)源程序如下:
#include "adc.h"
#include "delay.h"

typedef unsigned char u8;
typedef unsigned int u16;

unsigned long int ADC_DATA0;        //           ADC0數(shù)據(jù)
unsigned long int ADC_DATA1;        //           ADC1數(shù)據(jù)
unsigned long int ADC_DATA2;        //           ADC2數(shù)據(jù)

u8  count0;        //        ADC通道0轉(zhuǎn)換次數(shù)記錄
u8  count1;        //        ADC通道1轉(zhuǎn)換次數(shù)記錄
u8  count2;        //        ADC通道2轉(zhuǎn)換次數(shù)記錄
u8  ADC_LINE;        //        ADC通道記錄

//ADC口初始化
void STC8ADC_INIT()                         //STC8ADC初始化
{
  P1M0=0x00;
  P1M1=0x07;        //設(shè)定P1.4567通道為高阻
//         P_SW2|=0X80;    //打開特殊功能寄存器
//   ADCTIM=0X3F;    //設(shè)置ADC內(nèi)部時序
//   P_SW2&=0X7F;    //關(guān)閉特殊功能寄存器
  ADCCFG=0x2f;          //設(shè)置ADC的時鐘和轉(zhuǎn)換結(jié)果存放格式
  ADC_CONTR=0x80;//選擇ADC通道
  ADC_LINE=0x80;
  DelayXms(10);
  ADC_CONTR=ADC_CONTR|0x40;        //啟動ADC
  EADC=1;
}               

void ADC_ISR()interrupt 5
{
        ADC_CONTR=ADC_CONTR&0xdf;        //清除中斷標(biāo)志位
//=============================================================================================================
        if(ADC_LINE==0x80)        //選擇通道0
                {  
                if(count0<32)          //如果通道0轉(zhuǎn)換次數(shù)小于32
                        {                        
                                 ADC_DATA0=0x00;    //ADC0數(shù)據(jù)清零
                                 count0=0x00;       //通道0轉(zhuǎn)換次數(shù)清零
                        }
                        ADC_DATA0=ADC_DATA0+(ADC_RES*256+ADC_RESL);        //ADC結(jié)果處理
                        count0++;            //通道0轉(zhuǎn)換次數(shù)加1
                        ADC_LINE=0x81;       //切換下一通道(通道1)
                        ADC_CONTR=ADC_LINE;   //下一通道值賦給配置寄存器
                }
//====================================================================
else if(ADC_LINE==0x81)      //選擇通道1
                {  
                if(count1<32)            //如果通道1轉(zhuǎn)換次數(shù)小于32
                        {
                                 ADC_DATA1=0x00;      //ADC1數(shù)據(jù)清零
                                 count1=0x00;         //通道1轉(zhuǎn)換次數(shù)清零
                        }
                        ADC_DATA1=ADC_DATA1+(ADC_RES*256+ADC_RESL);        //ADC結(jié)果處理
                        count1++;                //通道1轉(zhuǎn)換次數(shù)加1
                        ADC_LINE=0x82;           //切換下一通道(通道2)
                        ADC_CONTR=ADC_LINE;      //下一通道值賦給配置寄存器
                }
//=====================================================================
else if(ADC_LINE==0x82)     //選擇通道2
                {  
                if(count2<32)            //如果通道2轉(zhuǎn)換次數(shù)小于32
                        {
                                 ADC_DATA2=0x00;      //ADC2數(shù)據(jù)清零
                                 count2=0x00;         //通道2轉(zhuǎn)換次數(shù)清零
                        }
                        ADC_DATA2=ADC_DATA2+(ADC_RES*256+ADC_RESL);        //ADC結(jié)果處理
                        count2++;              //通道2轉(zhuǎn)換次數(shù)加1
                        ADC_LINE=0x80;         //切換下一通道(通道0)
                        ADC_CONTR=ADC_LINE;    //下一通道值賦給配置寄存器
                }

//=============================================================================================================                                   
        ADC_CONTR=ADC_CONTR|0x40;        //啟動ADC
}


分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏5 分享淘帖 頂2 踩
回復(fù)

使用道具 舉報

沙發(fā)
ID:313048 發(fā)表于 2022-2-10 10:37 | 只看該作者
這里是做一個累加,2個通道連續(xù)都采樣32次之后則清除ADC的數(shù)據(jù)。32你可以自己選擇。
回復(fù)

使用道具 舉報

板凳
ID:807651 發(fā)表于 2022-2-10 13:48 | 只看該作者
這個數(shù)值32應(yīng)該是ad采樣32次后用來求平均值(濾波),每32次清零重新計數(shù),這個數(shù)值可以根據(jù)使用調(diào)整
回復(fù)

使用道具 舉報

地板
ID:686513 發(fā)表于 2022-2-10 18:00 | 只看該作者
AUG 發(fā)表于 2022-2-10 10:37
這里是做一個累加,2個通道連續(xù)都采樣32次之后則清除ADC的數(shù)據(jù)。32你可以自己選擇。

也就是說只是獲取了32次ADC結(jié)果,但沒有對這32次結(jié)果處理?
回復(fù)

使用道具 舉報

5#
ID:686513 發(fā)表于 2022-2-10 18:00 | 只看該作者
wd1988 發(fā)表于 2022-2-10 13:48
這個數(shù)值32應(yīng)該是ad采樣32次后用來求平均值(濾波),每32次清零重新計數(shù),這個數(shù)值可以根據(jù)使用調(diào)整

也就是說只是獲取了32次ADC結(jié)果,但沒有對這32次結(jié)果處理?
回復(fù)

使用道具 舉報

6#
ID:956872 發(fā)表于 2022-2-10 19:07 | 只看該作者
zhth1979 發(fā)表于 2022-2-10 18:00
也就是說只是獲取了32次ADC結(jié)果,但沒有對這32次結(jié)果處理?

為啥要加<32這句判斷。這句判斷的意義是什么?
回復(fù)

使用道具 舉報

7#
ID:807651 發(fā)表于 2022-2-11 10:26 | 只看該作者
zhth1979 發(fā)表于 2022-2-10 18:00
也就是說只是獲取了32次ADC結(jié)果,但沒有對這32次結(jié)果處理?


是的,結(jié)合代碼的時意思  ADC_DATA0 變量存著32次ad采樣的值。
回復(fù)

使用道具 舉報

8#
ID:686513 發(fā)表于 2022-2-11 11:44 | 只看該作者

本來想三路ADC,每路讀32次結(jié)果在mian函數(shù)里求平均的,但感覺又好像不對,現(xiàn)在也不知道從哪處理比較合適?這個程序也是仿壇友的。
回復(fù)

使用道具 舉報

9#
ID:807651 發(fā)表于 2022-2-11 13:52 | 只看該作者
zhth1979 發(fā)表于 2022-2-11 11:44
本來想三路ADC,每路讀32次結(jié)果在mian函數(shù)里求平均的,但感覺又好像不對,現(xiàn)在也不知道從哪處理比較合適 ...

                       if(count2<32)            //如果通道2轉(zhuǎn)換次數(shù)小于32
                        {
                                 ADC_DATA22 =ADC_DATA2/32;//可以放在清零前 用ADC_DATA22 存著求平均后的值
                                 ADC_DATA2=0x00;      //ADC2數(shù)據(jù)清零
                                 count2=0x00;         //通道2轉(zhuǎn)換次數(shù)清零
                        }
回復(fù)

使用道具 舉報

10#
ID:401564 發(fā)表于 2022-2-11 16:38 | 只看該作者
你這代碼怎么像是我當(dāng)初學(xué)C語言時的代碼?
給你一段我改過之后的代碼
注釋全在里面了,實際驗證過的/*──────────────────────────────────────────────────────────────────────────────────Stc8a4k_Adc.c文件
編寫:YGG
完成日期:20211120
功能:Stc8a系列單片機(jī)的ADC功能,采用中斷方式進(jìn)行ADC
完成狀態(tài):已經(jīng)完成
──────────────────────────────────────────────────────────────────────────────────*/
#include "Stc8a.h"
#include "Stc8a_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 32
//──────────────────────────────────────────────────────────────────────────────────────────────────
unsigned         char                  ADC_LINE;                                        //ADC通道記錄
unsigned         int                 ADC_AN0;                                        //ADC0數(shù)據(jù)
unsigned          int                 ADC_AN1;                                        //ADC1數(shù)據(jù)        
//──────────────────────────────────────────────────────────────────────────────────────────────────
void Stc8a_Adc_Init()                                                                 //ADC初始化
{
        unsigned int i;
        P1M1|=0x03;                                                                                //p1.0和p1.1用作ADC端口
        ADC_CONTR=0x80;                                                                        //打開adc電源
        ADCCFG=0x2f;                                                                        //設(shè)定ADC轉(zhuǎn)換結(jié)果保存格式,ADC時鐘選擇最慢       
        for(i=10000;i>0;i--);                                                         //延時一段時間
        ADC_CONTR=ADC_P10;                                                                //選擇P1.f端口ADC
        ADC_LINE=ADC_P10;                                                                //默認(rèn)啟動的ADC通道
        ADC_CONTR|=0x40;                                                                //啟動ADC
        EADC=1;                                                                                        //ADC中斷允許
}
//─────────────────────────────────────────────────────────────────────────────────────────────
void ADC_ISR()interrupt 5                                                        //ADC中斷處理
{               
        static unsigned char                          count0;                        //ADC通道6轉(zhuǎn)換次數(shù)記錄
        static unsigned char                          count1;                        //ADC通道f轉(zhuǎn)換次數(shù)記錄,內(nèi)部參考電壓通道
        static unsigned long int                 ADC_DATA0;                //ADC0數(shù)據(jù),累加
        static unsigned long int                 ADC_DATA1;                //ADCf數(shù)據(jù),累加       
        ADC_CONTR&=~0x20;                                                                //清除中斷標(biāo)志位
        //──────────────────────────────────────────────────────────────────────────
        if(ADC_LINE==ADC_P10)                                                          //檢測觸發(fā)ADC中斷的通道
                {  
                        if(count0>=ADC_COUNT)                                         //檢測ADC轉(zhuǎn)換次數(shù)
                                {
                                         ADC_AN0=ADC_DATA0/ADC_COUNT;          //取平均值
                                         ADC_DATA0=0x00;                                          //清除ADC累加結(jié)果
                                         count0=0x00;                                          //清除ADC轉(zhuǎn)換次數(shù)記錄
                                }
                        ADC_DATA0+=ADC_RES*256+ADC_RESL;                //ADC結(jié)果累加
                        count0++;                          
                        ADC_CONTR=ADC_LINE=ADC_P11;                                //選擇下一個ADC通道
                }
        //──────────────────────────────────────────────────────────────────────────
        else if(ADC_LINE==ADC_P11)
                {  
                        if(count1>=ADC_COUNT)
                                {
                                         ADC_AN1=ADC_DATA1/ADC_COUNT;
                                         ADC_DATA1=0x00;
                                         count1=0x00;
                                }
                        ADC_DATA1+=ADC_RES*256+ADC_RESL;       
                        count1++;                                                          
                        ADC_CONTR=ADC_LINE=ADC_P10;
                }
        //──────────────────────────────────────────────────────────────────────────                 
        ADC_CONTR|=0x40;                                                                //啟動ADC
}
//─────────────────────────────────────────────────────────────────────────────────────────────

回復(fù)

使用道具 舉報

11#
ID:686513 發(fā)表于 2022-2-12 20:52 | 只看該作者
Y_G_G 發(fā)表于 2022-2-11 16:38
你這代碼怎么像是我當(dāng)初學(xué)C語言時的代碼?
給你一段我改過之后的代碼
注釋全在里面了,實際驗證過的/*── ...

if(count0>=ADC_COUNT)                       //檢測ADC轉(zhuǎn)換次數(shù)             這樣寫轉(zhuǎn)換次數(shù)不是沒有限制了嗎?后面為什么還是除32,不應(yīng)該是 if(count0<ADC_COUNT) 嗎?
回復(fù)

使用道具 舉報

12#
ID:686513 發(fā)表于 2022-2-12 20:54 | 只看該作者

感覺這樣是對的,但我把32改成50次或100次結(jié)果為什么不一樣,相差很多!
回復(fù)

使用道具 舉報

13#
ID:401564 發(fā)表于 2022-2-12 23:13 | 只看該作者
zhth1979 發(fā)表于 2022-2-12 20:52
if(count0>=ADC_COUNT)                       //檢測ADC轉(zhuǎn)換次數(shù)             這樣寫轉(zhuǎn)換次數(shù)不是沒有 ...

不是有這句嗎?
count1=0x00;
/32是因為這是累加32次的結(jié)果,想要真實的數(shù)字量,就要/32
代碼是肯定沒有問題的,實際在STC8A4K單片機(jī)上運行過的
回復(fù)

使用道具 舉報

14#
ID:879809 發(fā)表于 2022-2-13 22:32 | 只看該作者
不對啊,count0沒到32就被清零了。
回復(fù)

使用道具 舉報

15#
ID:807651 發(fā)表于 2022-2-14 11:56 | 只看該作者
zhth1979 發(fā)表于 2022-2-12 20:54
感覺這樣是對的,但我把32改成50次或100次結(jié)果為什么不一樣,相差很多!

                        if(count2<32)            //如果通道2轉(zhuǎn)換次數(shù)小于32
                        {
                                 ADC_DATA2=0x00;      //ADC2數(shù)據(jù)清零
                                 count2=0x00;         //通道2轉(zhuǎn)換次數(shù)清零
                        }
                       之前沒注意看  代碼這 轉(zhuǎn)換次數(shù)count2 是不是要 count2 > 32   不是累加 次數(shù)嗎 ?
                       還是你的 count2初始值時32想要累減的。
                       if(count2>32)            //如果通道2轉(zhuǎn)換次數(shù)大于32
                        {
                                 ADC_DATA2=0x00;      //ADC2數(shù)據(jù)清零
                                 count2=0x00;         //通道2轉(zhuǎn)換次數(shù)清零
                        }
                        不然  count2 , ADC_DATA2 一直清零。
                        然后你的AD值獲取在清零后面,所以你改32 50 100得到不一樣的值,實際可能只是獲取一次ad值。
回復(fù)

使用道具 舉報

16#
ID:686513 發(fā)表于 2022-3-4 08:53 | 只看該作者
Y_G_G 發(fā)表于 2022-2-12 23:13
不是有這句嗎?
count1=0x00;
/32是因為這是累加32次的結(jié)果,想要真實的數(shù)字量,就要/32

查了一下,這個程序就是仿您的,您之前的程序是if(count0<32) 而后面卻也是 count0++;   現(xiàn)在這個程序是  if(count0>=ADC_COUNT) 也是 count0++;  兩者都能獲得ADC值,前者穩(wěn)定,但它卻不能隨傳感器的變化而變化,后者可以,但值會跳動。是不是平均濾波不行?您能不能在后者的基礎(chǔ)上幫我改寫成中位置濾波?
回復(fù)

使用道具 舉報

17#
ID:401564 發(fā)表于 2022-3-4 17:12 | 只看該作者
zhth1979 發(fā)表于 2022-3-4 08:53
查了一下,這個程序就是仿您的,您之前的程序是if(count0=ADC_COUNT) 也是 count0++;  兩者都能獲得ADC值 ...

前面的是我剛學(xué)C語言的時候?qū)懙?沒有認(rèn)真的驗證過,也不知道有沒有不對的地方
后面10#的是我驗證過的,肯定是對的了
至于跳動是肯定會有的,不管用什么濾波方式,都會跳動的,我之前就是用的中位濾波,后來發(fā)現(xiàn)沒什么效果,就改為平均濾波了
回復(fù)

使用道具 舉報

18#
ID:488334 發(fā)表于 2022-3-4 18:46 | 只看該作者
if(count1<32)                                                                      //如果通道1轉(zhuǎn)換次數(shù)小于32
{
      ADC_DATA1=0x00;                                                         //ADC1數(shù)據(jù)清零
      count1=0x00;                                                                //通道1轉(zhuǎn)換次數(shù)清零
}
ADC_DATA1=ADC_DATA1+(ADC_RES*256+ADC_RESL);        //ADC結(jié)果處理
count1++;                                                                         //通道1轉(zhuǎn)換次數(shù)加1
ADC_LINE=0x82;                                                                 //切換下一通道(通道2)
ADC_CONTR=ADC_LINE;                                                      //下一通道值賦給配置寄存器

這個三個一樣功能的代碼的條件是不是有問題呢,count1<32條件每次進(jìn)來判斷都是對的,count1計數(shù)和AD采集值都清零了。
count1<32這個條件如果要取平均值應(yīng)該是反過來:count1>=32,當(dāng)條件成立,就在if里面進(jìn)行平均取值,和其他處理。

一般來說AD取值都是用平均值的,AD跳動不管哪個芯片都會有,比如近幾年來很火的芯海科技,我用過他的芯片,有時候還不如國產(chǎn)的AD芯片(有時候誤差在0.1V左右,不過我想誤差縮減到0.05V左右,就采用了其他的芯片),只是看人的接受范圍,誤差在0.1V內(nèi)一般都是默認(rèn)可以接受的。
回復(fù)

使用道具 舉報

19#
ID:686513 發(fā)表于 2022-4-29 14:45 | 只看該作者

你說的對,已經(jīng)改過來了,現(xiàn)在正常了!
回復(fù)

使用道具 舉報

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

本版積分規(guī)則

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

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

快速回復(fù) 返回頂部 返回列表
主站蜘蛛池模板: 午夜视频免费在线观看 | 亚洲一区二区av | 国产亚洲精品区 | 91精品国产91久久久久久吃药 | 国产1区2区3区| 亚洲免费婷婷 | 91精品国产色综合久久 | 亚洲成人精品视频 | 精品国产18久久久久久二百 | 九九一级片 | 欧美电影免费观看高清 | 青青久草 | 91新视频| caoporn国产精品免费公开 | 视频一区二区在线观看 | 人人做人人澡人人爽欧美 | 成年人免费网站 | 国产成人精品一区二区三区在线 | 日韩精品视频在线 | 日韩一区三区 | 成人免费一级 | 国产精品久久久久久久午夜 | 91视在线国内在线播放酒店 | 毛片一级片 | 看片wwwwwwwwwww | 正在播放国产精品 | 久久久精品综合 | 亚洲精品视频在线播放 | 午夜亚洲| 国产免费观看一区 | 黄色国产大片 | 一区二区三区亚洲精品国 | 天天射色综合 | 欧洲一区二区在线 | 亚洲有码转帖 | 免费黄色录像片 | av中文字幕在线 | 在线小视频| 亚洲中午字幕 | 国产精品综合久久 | 精品乱人伦一区二区三区 |