欧美极品高清xxxxhd,国产日产欧美最新,无码AV国产东京热AV无码,国产精品人与动性XXX,国产传媒亚洲综合一区二区,四库影院永久国产精品,毛片免费免费高清视频,福利所导航夜趣136

 找回密碼
 立即注冊(cè)

QQ登錄

只需一步,快速開始

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

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

  [復(fù)制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
ID:686513 發(fā)表于 2022-2-10 09:37 | 只看該作者 回帖獎(jiǎng)勵(lì) |倒序?yàn)g覽 |閱讀模式
后面注釋是我自己加上去的,不知道理解的對(duì)不對(duì)?還有if(count0<32)          //如果通道0轉(zhuǎn)換次數(shù)小于32 這個(gè)語句有沒有數(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)部時(shí)序
//   P_SW2&=0X7F;    //關(guān)閉特殊功能寄存器
  ADCCFG=0x2f;          //設(shè)置ADC的時(shí)鐘和轉(zhuǎn)換結(jié)果存放格式
  ADC_CONTR=0x80;//選擇ADC通道
  ADC_LINE=0x80;
  DelayXms(10);
  ADC_CONTR=ADC_CONTR|0x40;        //啟動(dòng)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;        //啟動(dòng)ADC
}


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

使用道具 舉報(bào)

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

使用道具 舉報(bào)

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

使用道具 舉報(bào)

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

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

使用道具 舉報(bào)

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

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

使用道具 舉報(bào)

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

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

使用道具 舉報(bào)

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


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

使用道具 舉報(bào)

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

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

使用道具 舉報(bào)

9#
ID:807651 發(fā)表于 2022-2-11 13:52 | 只看該作者
zhth1979 發(fā)表于 2022-2-11 11:44
本來想三路ADC,每路讀32次結(jié)果在mian函數(shù)里求平均的,但感覺又好像不對(duì),現(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ù)

使用道具 舉報(bào)

10#
ID:401564 發(fā)表于 2022-2-11 16:38 | 只看該作者
你這代碼怎么像是我當(dāng)初學(xué)C語言時(shí)的代碼?
給你一段我改過之后的代碼
注釋全在里面了,實(shí)際驗(yàn)證過的/*──────────────────────────────────────────────────────────────────────────────────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時(shí)鐘選擇最慢       
        for(i=10000;i>0;i--);                                                         //延時(shí)一段時(shí)間
        ADC_CONTR=ADC_P10;                                                                //選擇P1.f端口ADC
        ADC_LINE=ADC_P10;                                                                //默認(rèn)啟動(dòng)的ADC通道
        ADC_CONTR|=0x40;                                                                //啟動(dòng)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;                                //選擇下一個(gè)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;                                                                //啟動(dòng)ADC
}
//─────────────────────────────────────────────────────────────────────────────────────────────

回復(fù)

使用道具 舉報(bào)

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

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

使用道具 舉報(bào)

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

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

使用道具 舉報(bào)

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是因?yàn)檫@是累加32次的結(jié)果,想要真實(shí)的數(shù)字量,就要/32
代碼是肯定沒有問題的,實(shí)際在STC8A4K單片機(jī)上運(yùn)行過的
回復(fù)

使用道具 舉報(bào)

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

使用道具 舉報(bào)

15#
ID:807651 發(fā)表于 2022-2-14 11:56 | 只看該作者
zhth1979 發(fā)表于 2022-2-12 20:54
感覺這樣是對(duì)的,但我把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初始值時(shí)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得到不一樣的值,實(shí)際可能只是獲取一次ad值。
回復(fù)

使用道具 舉報(bào)

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

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

使用道具 舉報(bào)

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

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

使用道具 舉報(bào)

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;                                                      //下一通道值賦給配置寄存器

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

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

使用道具 舉報(bào)

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

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

使用道具 舉報(bào)

本版積分規(guī)則

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

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

快速回復(fù) 返回頂部 返回列表