找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

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

STC15單片機ADC-10bit數(shù)字量問題很奇怪

[復(fù)制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
ID:232366 發(fā)表于 2024-7-8 17:32 | 只看該作者 回帖獎勵 |倒序瀏覽 |閱讀模式
先上程序:





uint ADC_DATA;

void delay(uchar ms)
{
        uchar i;
        while(ms--)
        for(i=0;i<220;i++);
}

void ADC_init()//初始化ADC
{
        //ADD采樣輸入口模式設(shè)置
        P1M1|=0x0C;//P1^2-P1^3設(shè)置位高阻模式 0000 1100
        P1M0&=0xF3;//P1^2-P1^3設(shè)置位高阻模式 1111 0011

        //P1口模擬控制功能寄存器 "P1AFS"
        P1ASF|=0x0C;//設(shè)置為P1^2-P1^3為ADC采樣輸入  0000 1100
        
        CLK_DIV&=0xDF;//采樣數(shù)據(jù)左對齊ADRJ=0
        ADC_RES=0; //默認高字節(jié)高8位
        ADC_RESL=0;//默認低字節(jié)低2位
        
        ADC_CONTR|=0x80; //首先要開AD 轉(zhuǎn)換電源 1000 0000
        delay(10);
}

unsigned int ADC()
{
        unsigned int ADC_DATA ;   
        unsigned char ADC_H,ADC_L;
        
        ADC_DATA=0;//清除轉(zhuǎn)換結(jié)果
        /*
                ADC_CONTR寄存器
                第7位:電源開啟
                第6,5:保持轉(zhuǎn)換速度
                第4位:轉(zhuǎn)換結(jié)束位標(biāo)志
                第3位:設(shè)置開始
                最后三位:選擇為轉(zhuǎn)換位(P1.7)
                所以1110 0111
        */
        ADC_CONTR|=0xE2;
        
        delay(3);//延時3MS
        
        ADC_CONTR|=0xEA ; //轉(zhuǎn)換開關(guān) ,轉(zhuǎn)換位置1開始轉(zhuǎn)換: 1110 1010
        
        delay(2);//延時3MS
        
        while(ADC_CONTR&0x10==0); //查詢轉(zhuǎn)換是否結(jié)束,結(jié)束后讀取結(jié)果
        
        ADC_CONTR&=0xE5;//清除轉(zhuǎn)換結(jié)果標(biāo)志位,關(guān)閉轉(zhuǎn)換
        
        ADC_H=ADC_RES; //默認高字節(jié)高8位。
        ADC_L=ADC_RESL;//默認低字節(jié)低2位。
        
        //ADC_L=ADC_L&0x03; // 屏蔽無關(guān)位

        ADC_DATA=ADC_H;
        ADC_DATA=ADC_DATA<<2;
        
        ADC_DATA|=ADC_L;
        
        ADC_CONTR=0x00;
        
        return(ADC_DATA);// 返回轉(zhuǎn)化結(jié)果
}





問題描述:
1:按照官方首冊記載STC15單片機支持10位ADC數(shù)據(jù)存儲位置為“ADC_RES和ADC_RESL"中。
2:按照上面程序各個寄存器配置ADC也可工作但是不正常,
(1):10位ADC數(shù)值正常應(yīng)該是0-1023才對目前AD值顯示為2-1023,可以排除采樣電壓等問題因為采樣端口我是直接對地了仍然顯示2就是不為


不知道哪里設(shè)置出問題還是我的數(shù)據(jù)讀出后處理問題又或者是數(shù)據(jù)左右對齊問題還請朋友們指教。

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

使用道具 舉報

沙發(fā)
ID:1109793 發(fā)表于 2024-7-8 18:21 | 只看該作者
這要求蠻高的好像
回復(fù)

使用道具 舉報

板凳
ID:624769 發(fā)表于 2024-7-8 20:13 | 只看該作者
飛線到 單片機的 GND 引腳就出0了
回復(fù)

使用道具 舉報

地板
ID:232366 發(fā)表于 2024-7-8 20:55 | 只看該作者
188610329 發(fā)表于 2024-7-8 20:13
飛線到 單片機的 GND 引腳就出0了

您肯定理解錯我的問題了。
回復(fù)

使用道具 舉報

5#
ID:624769 發(fā)表于 2024-7-8 22:46 | 只看該作者
SHANWAZI 發(fā)表于 2024-7-8 20:55
您肯定理解錯我的問題了。

你肯定理解錯GND的定義了。
回復(fù)

使用道具 舉報

6#
ID:232366 發(fā)表于 2024-7-9 07:43 來自手機 | 只看該作者
xiaobendan001 發(fā)表于 2024-7-8 18:21
這要求蠻高的好像

沒有啊  就是一個ADC采樣   15單片機是支持10位ADC的當(dāng)我只讀8位數(shù)據(jù)時AD輸出可以0-255。當(dāng)我讀10位數(shù)據(jù)時就不正常了AD值是從2-1023變化的!


正常不應(yīng)該是從0-1023嗎?
回復(fù)

使用道具 舉報

7#
ID:232366 發(fā)表于 2024-7-9 07:45 | 只看該作者
188610329 發(fā)表于 2024-7-8 22:46
你肯定理解錯GND的定義了。

不知道是?
回復(fù)

使用道具 舉報

8#
ID:401564 發(fā)表于 2024-7-9 12:42 | 只看該作者
你要先搞明白ADC的原理
它一定是有誤差和浮動的,在ADC電氣規(guī)格中是有說明的,一般來說,5個位的整體誤差都是正常的
也就是說,當(dāng)輸入電壓為0V時,它的數(shù)字量可能是0,也可能是5,當(dāng)然,是2也就是正常的了
假設(shè)VCC就是ADC的參考電壓,以5V為例,你可以試一下,ADC端口電壓為2.5V時,ADC的數(shù)字量一定是跳來跳去的
這就是ADC為什么濾波的原因了
回復(fù)

使用道具 舉報

9#
ID:1109793 發(fā)表于 2024-7-9 12:53 | 只看該作者

他的意思是有底線噪音。
回復(fù)

使用道具 舉報

10#
ID:232366 發(fā)表于 2024-7-9 14:03 | 只看該作者
Y_G_G 發(fā)表于 2024-7-9 12:42
你要先搞明白ADC的原理
它一定是有誤差和浮動的,在ADC電氣規(guī)格中是有說明的,一般來說,5個位的整體誤差都是 ...

首先非常感謝您的盛情回復(fù)。!


以上問題我剛剛做實驗使用STC8G1K08單片機讀取ADC十位數(shù)據(jù)使用同種方法如下:
1:讀取ADC10位數(shù)據(jù)對齊方式為右對齊
2:數(shù)據(jù)處理方法為

unsigned int adc_once()
{       
        static unsigned int ADC_VALUE;//存放采樣值

        ADC_RES=0;//結(jié)果高2位
        ADC_RESL=0;//結(jié)果低8位
       
        ADC_CONTR|=0x40;// 啟動 AD 轉(zhuǎn)換
        _nop_();_nop_();
        while(!(ADC_CONTR&0x20));//查詢 ADC 完成標(biāo)志       
        _nop_();_nop_();
        ADC_VALUE=ADC_RES;//存儲 ADC 的 10 位結(jié)果的高 2 位
        ADC_VALUE<<=8;
        ADC_VALUE|=ADC_RESL;//存儲 ADC 的 10 位結(jié)果的低 8 位
        ADC_CONTR&=~0x20;//清完成標(biāo)志
        delay_ms(1);
        //adc_value&=0x03FF;//確保adc_value不大于1024
       
        return ADC_VALUE;
}

同樣通過外部電位器對5V電壓進行分壓供給ADC采樣調(diào)節(jié)電位器可使ADC值0-1023變化!。!


同種方法數(shù)據(jù)右對齊同種外部電路同種數(shù)據(jù)處理函數(shù)使用STC15單片機卻不行AD值始終要么就是1-1023
要么就是2-1023變化!。。。。!

不知為何
回復(fù)

使用道具 舉報

11#
ID:232366 發(fā)表于 2024-7-9 14:04 | 只看該作者
xiaobendan001 發(fā)表于 2024-7-9 12:53
他的意思是有底線噪音。

請看樓上
回復(fù)

使用道具 舉報

12#
ID:744809 發(fā)表于 2024-7-9 15:07 | 只看該作者

2-1023是正,F(xiàn)象,MCU生產(chǎn)的時候,基準(zhǔn)電壓就有誤差,不同mcu個體測出來有誤差太正常了
回復(fù)

使用道具 舉報

13#
ID:232366 發(fā)表于 2024-7-9 16:12 | 只看該作者
123156fsadf 發(fā)表于 2024-7-9 15:07
2-1023是正,F(xiàn)象,MCU生產(chǎn)的時候,基準(zhǔn)電壓就有誤差,不同mcu個體測出來有誤差太正常了

但是只讀取八位時又正常
回復(fù)

使用道具 舉報

14#
ID:1034262 發(fā)表于 2024-7-9 17:28 | 只看該作者
SHANWAZI 發(fā)表于 2024-7-9 07:43
沒有啊  就是一個ADC采樣   15單片機是支持10位ADC的當(dāng)我只讀8位數(shù)據(jù)時AD輸出可以0-255。當(dāng)我讀10位數(shù)據(jù) ...

你要多了解一下ADC的一些參數(shù)。
ADC有好幾個誤差參數(shù),其中一個是“0點誤差”,即輸入電壓為0時,讀數(shù)的誤差,比如讀到2,那0點誤差就是2個字。你讀8位能到0,因為因為10位時是2,去掉低2位就是0了。
回復(fù)

使用道具 舉報

15#
ID:232366 發(fā)表于 2024-7-9 18:44 | 只看該作者
coody_sz 發(fā)表于 2024-7-9 17:28
你要多了解一下ADC的一些參數(shù)。
ADC有好幾個誤差參數(shù),其中一個是“0點誤差”,即輸入電壓為0時,讀數(shù)的 ...

哦原來如此。。。。】磥砦疫是功課做少了,感謝感謝
回復(fù)

使用道具 舉報

16#
ID:401564 發(fā)表于 2024-7-9 21:48 | 只看該作者
SHANWAZI 發(fā)表于 2024-7-9 14:03
首先非常感謝您的盛情回復(fù)!!

我把我上面的回復(fù)復(fù)制了,請你再認真看一下,我個人感覺,我已經(jīng)解釋得很明白了
如果還不明白,我再給你注釋
回復(fù)

使用道具 舉報

17#
ID:232366 發(fā)表于 2024-7-10 14:05 | 只看該作者
Y_G_G 發(fā)表于 2024-7-9 12:42
你要先搞明白ADC的原理
它一定是有誤差和浮動的,在ADC電氣規(guī)格中是有說明的,一般來說,5個位的整體誤差都是 ...

感謝朋友的耐心解答,按照您的意思我已做實驗確實如此。。!
回復(fù)

使用道具 舉報

18#
ID:688692 發(fā)表于 2024-7-11 12:56 | 只看該作者
模電功底穩(wěn)步提升中
回復(fù)

使用道具 舉報

19#
ID:232366 發(fā)表于 2024-7-11 16:53 | 只看該作者
cnos 發(fā)表于 2024-7-11 12:56
模電功底穩(wěn)步提升中

是的共同學(xué)習(xí)
回復(fù)

使用道具 舉報

20#
ID:1123773 發(fā)表于 2024-7-11 17:20 | 只看該作者
大家說的意思是不是就是讀8位精度低了,掩蓋了0時的誤差,精度高了誤差就被讀出了。
回復(fù)

使用道具 舉報

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

本版積分規(guī)則

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

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

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