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

QQ登錄

只需一步,快速開(kāi)始

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

STC8A8K單片機(jī)多路ADC采集得到的結(jié)果一模一樣,可能會(huì)是什么問(wèn)題?

  [復(fù)制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
單片機(jī)程序如下,求大神指導(dǎo)
  1. #include  <stc8.h>
  2. #include  <delay.h>
  3. #include  <uart.h>
  4. #include  <adc12.h>
  5. #include  <adc13.h>        
  6. #include  <adc14.h>

  7. //float R;

  8. void main()
  9. {
  10.         P3M1 &= 0xFE;        P3M0 &= 0xFE;                          //設(shè)置P3.0為準(zhǔn)雙向口
  11.         P3M1 &= 0xFD;        P3M0 |= 0x02;                          //設(shè)置P3.1為推挽輸出
  12.                
  13.         ADC12_config();         
  14.         ADC13_config();
  15.   ADC14_config();                             //ADC初始化

  16.         Uart1_Init();                                 //串口1初始化         
  17.         EA = 1;                                       //使能總中斷
  18.   Delay10ms();                                  //初始化后延時(shí)
  19.         
  20. //        R=(HandleADC13()*3000)/(2*HandleADC12()-HandleADC13());  //輸入電阻計(jì)算
  21.         
  22.   while (1)
  23.         {
  24.                  printf("\r\n P0.4上的電壓: %.3f\r\n",HandleADC12());      //輸入電壓1        
  25.                  printf("\r\n P0.5上的電壓: %.3f\r\n",HandleADC13());      //輸入電壓2        
  26.                  printf("\r\n P0.6上的電壓: %.3f\r\n",HandleADC14());      //輸出電壓               
  27. //                  printf("\r\n 電壓增益: %.3f\r\n",HandleADC14()/HandleADC13());     //串口打印上傳的采集的電壓值
  28. //           printf("\r\n 輸入電阻: %.1f\r\n",R);        
  29.      Delay1000ms();
  30.         }
  31. }

復(fù)制代碼


差分放大電路電壓放大倍數(shù)ADC測(cè)量.zip

89.73 KB, 下載次數(shù): 40

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

使用道具 舉報(bào)

沙發(fā)
ID:401564 發(fā)表于 2021-7-25 23:38 | 只看該作者
你看一下你的ADC程序里面有沒(méi)有這個(gè)查詢(xún)ADC完成標(biāo)志位的我是沒(méi)有在你程序里找到
ADC是要一個(gè)過(guò)程的,啟動(dòng)ADC之后,如果是查詢(xún)方式的話(huà),是要一直等待ADC完成才能正確的得到ADC結(jié)果的


回復(fù)

使用道具 舉報(bào)

板凳
ID:898834 發(fā)表于 2021-7-26 09:12 | 只看該作者
Y_G_G 發(fā)表于 2021-7-25 23:38
你看一下你的ADC程序里面有沒(méi)有這個(gè)查詢(xún)ADC完成標(biāo)志位的我是沒(méi)有在你程序里找到
ADC是要一個(gè)過(guò)程的,啟動(dòng)AD ...

但是我在實(shí)際測(cè)試中,ADC已經(jīng)發(fā)揮作用了,也能得到端口檢測(cè)到的值,只是多路使用的時(shí)候無(wú)法實(shí)現(xiàn)
回復(fù)

使用道具 舉報(bào)

地板
ID:170318 發(fā)表于 2021-7-26 09:40 | 只看該作者
貼上來(lái)的程序不完整,不好分析原因,可以肯定地說(shuō)是程序的問(wèn)題
回復(fù)

使用道具 舉報(bào)

5#
ID:898834 發(fā)表于 2021-7-26 09:48 | 只看該作者
jhczy 發(fā)表于 2021-7-26 09:40
貼上來(lái)的程序不完整,不好分析原因,可以肯定地說(shuō)是程序的問(wèn)題

ADC初始化及采集程序如下
void        ADC_config(void)   //ADC 初始化
{       
        ADC_CONTR|=0x80;              //開(kāi)AD轉(zhuǎn)換電源
        delay_ms(10);           //適當(dāng)延時(shí)等待AD轉(zhuǎn)換供電穩(wěn)定
        ADC_CONTR|=0x0E;                          //選擇P0.6作為模擬功能AD使用
        ADC_CONTR&=0xFE;                          //選擇P0.6作為模擬功能AD使用
       
        ADCCFG&=0xFC;             //AD轉(zhuǎn)換速度為416個(gè)時(shí)鐘數(shù)轉(zhuǎn)換一次
        ADCCFG|=0x0C;             //AD轉(zhuǎn)換速度為416個(gè)時(shí)鐘數(shù)轉(zhuǎn)換一次
        ADC_CONTR&=0xDF;          //清AD轉(zhuǎn)換完成標(biāo)志
               
        EADC=0;                   //禁止ADC轉(zhuǎn)換中斷
        ADCCFG|=0x20;             //ADC轉(zhuǎn)換結(jié)果ADC_RES存高4位,ADC_RESL存低8位

}

uint16        Get_ADC12bitResult(void)        //得到ADC12位結(jié)果
{       
        ADC_CONTR|=0x40;          //啟動(dòng)AD轉(zhuǎn)換,ADC_START=1
        delay_ms(10);
        while(!(ADC_CONTR&0x20));    //查詢(xún)ADC完成標(biāo)志
  ADC_CONTR&=0xDF;              // 將ADC_FLAG完成標(biāo)志清0
        ADC_CONTR&=0xBF;        //關(guān)閉AD轉(zhuǎn)換,ADC_START=0
        //12位AD結(jié)果的高4位放ADC_RES的低4位,低8位在ADC_RESL
        AD_Dat = ADC_RES;                       //將ADC_RES低4位移到應(yīng)在的第9位至第12位
        AD_Dat <<= 8;
        AD_Dat|= ADC_RESL;               //將ADC_RESL的8位移到應(yīng)在的低8位
       
  ADC_CONTR|=0x40;           //啟動(dòng)AD轉(zhuǎn)換,ADC_START=1
        return        AD_Dat;       
}
回復(fù)

使用道具 舉報(bào)

6#
ID:170318 發(fā)表于 2021-7-26 10:00 | 只看該作者
本帖最后由 jhczy 于 2021-7-26 10:07 編輯
zqz1345444061 發(fā)表于 2021-7-26 09:48
ADC初始化及采集程序如下
void        ADC_config(void)   //ADC 初始化
{        

這個(gè)程序確實(shí)有問(wèn)題,STC8與STC15的ADC程序有點(diǎn)小區(qū)別,請(qǐng)?jiān)敿?xì)看STC8的手冊(cè)
回復(fù)

使用道具 舉報(bào)

7#
ID:898834 發(fā)表于 2021-7-26 10:07 | 只看該作者
jhczy 發(fā)表于 2021-7-26 10:00
這個(gè)程序確實(shí)有問(wèn)題,STC8與STC15的ADC程序有點(diǎn)小區(qū)別,請(qǐng)?jiān)敿?xì)看STC8G的手冊(cè)

可是它的確也能實(shí)現(xiàn)ADC的功能
回復(fù)

使用道具 舉報(bào)

8#
ID:170318 發(fā)表于 2021-7-26 10:10 | 只看該作者
zqz1345444061 發(fā)表于 2021-7-26 10:07
可是它的確也能實(shí)現(xiàn)ADC的功能

采集的數(shù)據(jù)可能就是某一個(gè)通道上的
回復(fù)

使用道具 舉報(bào)

9#
ID:898834 發(fā)表于 2021-7-26 10:12 | 只看該作者
jhczy 發(fā)表于 2021-7-26 10:10
采集的數(shù)據(jù)可能就是某一個(gè)通道上的

確實(shí)是,我這個(gè)程序是選擇固定通道,我的問(wèn)題就在于不知道如何選擇多個(gè)通道
回復(fù)

使用道具 舉報(bào)

10#
ID:123289 發(fā)表于 2021-7-26 10:14 | 只看該作者
在AD的硬件中,有一個(gè)采樣電容,當(dāng)你下達(dá)采樣命令后,會(huì)經(jīng)歷如下的過(guò)程:
1、將這個(gè)電容與端口連通,并保持若干個(gè)時(shí)鐘。目的讓電容上得到與端口一樣的電壓。
2、再切斷與端口的連接,防止在進(jìn)行電壓比較時(shí),電壓有波動(dòng),影響、絞亂逐次逼近的邏輯。
3、接下來(lái)才進(jìn)行真正的AD轉(zhuǎn)換(逐次逼近),需要N個(gè)時(shí)鐘周期,得到AD值。
所以,采樣時(shí)要注意(這是精華):
切換端口后,要過(guò)一段時(shí)間再下達(dá)采樣命令,因?yàn)閯偳袚Q后,采樣電容上是上一個(gè)通道的電壓,需要有一個(gè)充放電的過(guò)程,才能變?yōu)樾峦ǖ蓝丝谏系碾妷。這一點(diǎn)相當(dāng)重要。!新手一般不會(huì)考慮到這一點(diǎn),許多高手也吃它的苦。表現(xiàn)為采樣電壓的數(shù)據(jù)不穩(wěn)定,其實(shí)是部分地受上個(gè)通道的電壓“殘余”影響了。
解決的方案很簡(jiǎn)單:估計(jì)樓主想到了……
回復(fù)

使用道具 舉報(bào)

11#
ID:170318 發(fā)表于 2021-7-26 10:17 | 只看該作者
zqz1345444061 發(fā)表于 2021-7-26 10:07
可是它的確也能實(shí)現(xiàn)ADC的功能

我的STC8G的某一個(gè)端口的ADC程序(STC8G1K08的),12MHz
void W1_ADC()                                                //P3.4檢測(cè)
{
//        TR0=0;
        P3M1=0x10;                          //P3.4高阻輸入模式,P3.0-3.1-3.3為準(zhǔn)雙向
        P3M0=0x04;
        P_SW2|=0x80;
        ADCTIM=0x3f;
        P_SW2&=0x7f;
        ADCCFG=0x0f;                  //設(shè)置ADC時(shí)鐘為系統(tǒng)頻率的/2/16
        ADC_CONTR=0x80;               //使能ADC模塊
        _nop_();
        _nop_();
        ADC_RES=0;                           //清除結(jié)果
        ADC_CONTR|=0x0c;               // 設(shè)定轉(zhuǎn)換的通道,P3.4是1100(0x0c)
        ADC_CONTR|=0x40;                     // 開(kāi)始AD轉(zhuǎn)換,即ADC_START=1
        _nop_();
        _nop_();
        while(!(ADC_CONTR & 0x20));    //  等待轉(zhuǎn)換完成 ,即ADC_FLAG=1
        ADC_CONTR&=~0x20;              //  清零 即D3位start清零,D4位轉(zhuǎn)換結(jié)束標(biāo)志位ADC_flag清零
        shuj=ADC_RES;                  //  取高八位
//        TR0=1;
        P3M1=0x00;
        P3M0=0x04;
}
回復(fù)

使用道具 舉報(bào)

12#
ID:170318 發(fā)表于 2021-7-26 10:18 | 只看該作者
zqz1345444061 發(fā)表于 2021-7-26 10:12
確實(shí)是,我這個(gè)程序是選擇固定通道,我的問(wèn)題就在于不知道如何選擇多個(gè)通道

一個(gè)通道一個(gè)程序,端口狀態(tài)要設(shè)置改變的
回復(fù)

使用道具 舉報(bào)

13#
ID:898834 發(fā)表于 2021-7-26 10:23 | 只看該作者
jhczy 發(fā)表于 2021-7-26 10:17
我的STC8G的某一個(gè)端口的ADC程序(STC8G1K08的),12MHz
void W1_ADC()                                                //P3.4檢測(cè)
{

好的,謝謝,我再試一下
回復(fù)

使用道具 舉報(bào)

14#
ID:401564 發(fā)表于 2021-7-26 12:17 | 只看該作者
ADC用中斷比較好,不用一直等待,程序也可以做其它的事
STC8A4k不需要設(shè)定轉(zhuǎn)換時(shí)鐘個(gè)數(shù)的,ADC時(shí)鐘用最慢的時(shí)鐘頻率就可以了
我這個(gè)是自己寫(xiě)的,可以在有字庫(kù)的12864上顯示
你參考一下
STC8A4K_12864.rar (1.92 KB, 下載次數(shù): 90)

回復(fù)

使用道具 舉報(bào)

15#
ID:898834 發(fā)表于 2021-7-26 14:43 | 只看該作者
Y_G_G 發(fā)表于 2021-7-26 12:17
ADC用中斷比較好,不用一直等待,程序也可以做其它的事
STC8A4k不需要設(shè)定轉(zhuǎn)換時(shí)鐘個(gè)數(shù)的,ADC時(shí)鐘用最慢的時(shí) ...

好的,感謝幫助
回復(fù)

使用道具 舉報(bào)

16#
ID:898834 發(fā)表于 2021-7-26 14:50 | 只看該作者
Y_G_G 發(fā)表于 2021-7-26 12:17
ADC用中斷比較好,不用一直等待,程序也可以做其它的事
STC8A4k不需要設(shè)定轉(zhuǎn)換時(shí)鐘個(gè)數(shù)的,ADC時(shí)鐘用最慢的時(shí) ...

好的感謝幫助
回復(fù)

使用道具 舉報(bào)

17#
ID:213173 發(fā)表于 2021-7-26 16:49 | 只看該作者
zqz1345444061 發(fā)表于 2021-7-26 10:12
確實(shí)是,我這個(gè)程序是選擇固定通道,我的問(wèn)題就在于不知道如何選擇多個(gè)通道

對(duì)ADC_CONTR寄存器低4位賦值選擇ADC通道。

回復(fù)

使用道具 舉報(bào)

18#
ID:382454 發(fā)表于 2021-7-27 16:43 | 只看該作者
按我的經(jīng)驗(yàn),8系列分時(shí)復(fù)用IO口檢測(cè)ADC, 剛打開(kāi)IO口的時(shí)候也要延時(shí)1-2ms的,不然測(cè)出來(lái)也不準(zhǔn)
回復(fù)

使用道具 舉報(bào)

19#
ID:229375 發(fā)表于 2021-12-11 17:41 | 只看該作者
兄弟,請(qǐng)問(wèn)這個(gè)問(wèn)題解決了嗎?
我按照之前10樓大佬說(shuō)的解決辦法,延遲采集似乎沒(méi)有效果...
回復(fù)

使用道具 舉報(bào)

20#
ID:229375 發(fā)表于 2021-12-11 17:52 | 只看該作者
河邊洗腳人 發(fā)表于 2021-12-11 17:41
兄弟,請(qǐng)問(wèn)這個(gè)問(wèn)題解決了嗎?
我按照之前10樓大佬說(shuō)的解決辦法,延遲采集似乎沒(méi)有效果...

是我切換通道時(shí)設(shè)置錯(cuò)了。

回復(fù)

使用道具 舉報(bào)

21#
ID:906597 發(fā)表于 2021-12-24 21:47 | 只看該作者
同問(wèn),我也是這個(gè)問(wèn)題,我配置了2個(gè)ADC初始化,選的不同的口,但是還是只顯示1個(gè)的值
回復(fù)

使用道具 舉報(bào)

22#
ID:382454 發(fā)表于 2021-12-29 10:15 | 只看該作者
你的邏輯步驟很重要,STC8A8K系列ADC有幾種工作方式的,中斷是比較實(shí)用的。因?yàn)橹袛嗖灰狢PU去等待,判斷。你要先把單個(gè)口的ADC代碼寫(xiě)OK才行,測(cè)好單個(gè)口的ADC代碼沒(méi)問(wèn)題之后,再擴(kuò)展多個(gè)IO口,那么這多個(gè)口怎么分時(shí)復(fù)用去掃描也是很簡(jiǎn)單的,可以定義一個(gè)掃描完成的標(biāo)志位FLAG ,再定義一個(gè)多口數(shù)字變量,幾個(gè)標(biāo)志一起參寫(xiě)判斷。簡(jiǎn)單的來(lái)就就是第一個(gè)口掃描完志成了,CPU自動(dòng)進(jìn)入第二個(gè)口掃描,掃完第二個(gè),自動(dòng)描掃第三個(gè),以此反復(fù)循環(huán),在寫(xiě)碼的時(shí)候是很靈活的。重點(diǎn)是你要把小個(gè)的函數(shù)寫(xiě)好,把小個(gè)的湊成一個(gè)整體。小的局部沒(méi)寫(xiě)好,大的找起來(lái)就一頭亂。
回復(fù)

使用道具 舉報(bào)

23#
ID:382454 發(fā)表于 2021-12-29 10:18 | 只看該作者
還有一個(gè)就是CPU硬件AVCC這個(gè)ADC供電接口 接了沒(méi)有?我以前試過(guò)畫(huà)板時(shí)沒(méi)有接上,找了我一個(gè)星期。
回復(fù)

使用道具 舉報(bào)

24#
ID:936755 發(fā)表于 2022-10-14 15:02 | 只看該作者
Y_G_G 發(fā)表于 2021-7-26 12:17
ADC用中斷比較好,不用一直等待,程序也可以做其它的事
STC8A4k不需要設(shè)定轉(zhuǎn)換時(shí)鐘個(gè)數(shù)的,ADC時(shí)鐘用最慢的時(shí) ...

ganx,,
回復(fù)

使用道具 舉報(bào)

25#
ID:1051062 發(fā)表于 2022-11-9 15:03 | 只看該作者
采集到的數(shù)值是不變的嗎,不變可能采集不到,變了的話(huà)就是所有采集到的數(shù)據(jù)都在一個(gè)通道里
回復(fù)

使用道具 舉報(bào)

本版積分規(guī)則

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

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

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