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

標(biāo)題: 關(guān)于atmega16單片機(jī)AD換路問題(新手求教) [打印本頁]

作者: zrt9027696    時(shí)間: 2019-5-7 16:04
標(biāo)題: 關(guān)于atmega16單片機(jī)AD換路問題(新手求教)
atmega16單片機(jī)如何判斷adch是否被讀出呢 ? 通過換路讀取了兩個(gè)值
void get_information(void)///獲取ADC信息
{
  unsigned char i=0;

  DDRA=0x00;
  PORTA=0x00;

  for(i=0;i<2;i++)      //讀取兩路路adc
  {
      init_adc(i); //換路初始化
      while(1)
       {
            if(ADCSRA&(1<<4))//判斷是否轉(zhuǎn)換完成
            {
                adcinit[i]=ADCH; //adc暫寄存數(shù)
                adc[i]=datapro(adcinit[i],i); //將adc轉(zhuǎn)化后的結(jié)果存入數(shù)組
                break;
            }

       }
  }

  DDRA=0x00;
  PORTA=0x00;

}

但是結(jié)果是adc[0]和adc[1]里面的值是一樣的,是不是沒有對(duì)adch判斷是否被讀出所導(dǎo)致的呢

作者: 遷就    時(shí)間: 2019-5-7 17:57
謝謝分享
作者: jjjjjjir    時(shí)間: 2019-5-8 10:21
if(ADCSRA&(1<<4))//判斷是否轉(zhuǎn)換完成
            {
                ADCSRA &=~(1<<4);
                adcinit[i]=ADCH; //adc暫寄存數(shù)
                adc[i]=datapro(adcinit[i],i); //將adc轉(zhuǎn)化后的結(jié)果存入數(shù)組
                break;
            }

每次讀完將中斷標(biāo)志位清零
作者: zrt9027696    時(shí)間: 2019-5-8 23:45
jjjjjjir 發(fā)表于 2019-5-8 10:21
if(ADCSRA&(1

非常感謝您的回答,但是問題依然和以前一樣
  1.   for(i=0;i<2;i++)      //讀取兩路路adc
  2.   {
  3.       init_adc(i);
  4.       while(1)
  5.        {
  6.             if(ADCSRA&(1<<4))//判斷是否轉(zhuǎn)換完成
  7.             {
  8.                 adcinit[i]=ADCH;
  9.                 adc[i]=datapro(adcinit[i],i);
  10.                 break;
  11.             }

  12.        }
  13.        ADCSRA |= (1<<4);
  14.   }
復(fù)制代碼

這是我按照您的意思修改的函數(shù),請(qǐng)問下是不是AD采樣存在時(shí)鐘周期所導(dǎo)致的換路后的第一個(gè)值要舍棄呢(不知道該怎么舍棄,是讀完ADCH后數(shù)據(jù)才會(huì)更新嗎)另外這是我的初始化函數(shù),選擇的是連續(xù)轉(zhuǎn)換模式,自動(dòng)觸發(fā)使能等
  1.   void init_adc(int n)
  2. {
  3.     DDRA   &=~ ((1<<0)|(1<<1));      //模擬量輸入管腳PA1設(shè)置為輸入
  4.     ADMUX  |=  (1<<6)|(1<<n);      //參考電壓選擇AVCC  PA15
  5.     ADCSRA |=  (1<<7)|(1<<5)|(1<<2)|(1<<1) ; //自動(dòng)觸發(fā)使能, 64分頻,ADC使能
  6.     SFIOR  &=~ ((1<<2)|(1<<1)|(1<<0));
  7.     ADCSRA |=  (1<<6) ; //開始轉(zhuǎn)換

  8. }
復(fù)制代碼

因?yàn)榈谝淮谓佑|有很多不懂,還請(qǐng)不吝賜教,謝謝!
作者: jjjjjjir    時(shí)間: 2019-5-9 09:14
手冊(cè)上說切換到差分增益通道或參考源改變后  ,才舍棄第一次轉(zhuǎn)換結(jié)果,轉(zhuǎn)換通道應(yīng)該不需要舍棄(不知道我是否看漏)。還有你現(xiàn)在并不是轉(zhuǎn)換結(jié)果左對(duì)齊 所以要先讀 ADCL,再讀 ADCH 。
建議將 while(1) break;去除,意義不明。



QQ截圖20190509085901.png (150.68 KB, 下載次數(shù): 20)

QQ截圖20190509085901.png

QQ截圖20190509090828.png (82.97 KB, 下載次數(shù): 27)

QQ截圖20190509090828.png

作者: jjjjjjir    時(shí)間: 2019-5-9 09:33
void init_adc(int n)
{
    DDRA   &=~ ((1<<0)|(1<<1));      //模擬量輸入管腳PA1設(shè)置為輸入
    ADMUX  |=  (1<<6)|(
1<<5)|(1<<n);      //參考電壓選擇AVCC  PA15 ,轉(zhuǎn)換結(jié)果左對(duì)齊,精度只有8位,請(qǐng)注意!!!!!
    ADCSRA |=  (1<<7)|(1<<5)|(1<<2)|(1<<1) ; //自動(dòng)觸發(fā)使能, 64分頻,ADC使能
    SFIOR  &=~ ((1<<2)|(1<<1)|(1<<0));
    ADCSRA |=  (1<<6) ; //開始轉(zhuǎn)換

}



void get_information(void)///獲取ADC信息
{
  unsigned char i=0,a=0;
  DDRA=0x00;
  PORTA=0x00;

  for(i=0;i<2;i++)      //讀取兩路路adc
  {
      init_adc(i); //換路初始化
      while((ADCSRA&(1<< 6)));//判斷是否轉(zhuǎn)換完成
      adcinit[ i]=ADCH; //adc暫寄存數(shù)
      adc[ i]=datapro(adcinit,i); //將adc轉(zhuǎn)化后的結(jié)果存入數(shù)組
      nop();nop();nop();nop();nop();//
nop();nop();nop();nop();nop();//在 ADSC 置位后的一個(gè) ADC時(shí)鐘周期就可以選擇新的模擬輸入通道了
   }

  DDRA=0x00;
  PORTA=0x00;

}


憑經(jīng)驗(yàn)該的,你試試看吧,紅色的就是我做了修改

作者: jjjjjjir    時(shí)間: 2019-5-9 09:42
我改的不保證能運(yùn)行,有問題的話再改改看
作者: zrt9027696    時(shí)間: 2019-5-10 00:26
jjjjjjir 發(fā)表于 2019-5-9 09:42
我改的不保證能運(yùn)行,有問題的話再改改看

感謝大佬的點(diǎn)撥!但是弄了幾個(gè)小時(shí)問題依然存在,數(shù)據(jù)顯示出現(xiàn)了其他問題,我看技術(shù)手冊(cè)中說的最后一句話的意思是不是要舍棄儲(chǔ)存的第一個(gè)值呢,或者是什么其他的意思?
ADC 輸入通道 選擇模擬通道時(shí)請(qǐng)注意以下指導(dǎo)方針:
在連續(xù)轉(zhuǎn)換模式下,總是在第一次轉(zhuǎn)換開始之前選定通道。在 ADSC 置位后的一個(gè) ADC
時(shí)鐘周期就可以選擇新的模擬輸入通道了。但是最簡(jiǎn)單的辦法是等待轉(zhuǎn)換結(jié)束后再改變
通道。然而,此時(shí)新一次轉(zhuǎn)換已經(jīng)自動(dòng)開始了,下一次的轉(zhuǎn)換結(jié)果反映的是以前選定的模
擬輸入通道。以后的轉(zhuǎn)換才是針對(duì)新通道的。
  1.   void init_adc(int n)
  2. {
  3.     DDRA   &=~ ((1<<0)|(1<<1));      //模擬量輸入管腳PA1設(shè)置為輸入
  4.     ADMUX  |=  (1<<6)|(1<<n);      //參考電壓選擇AVCC  PA15
  5.     ADCSRA |=  (1<<7)|(1<<5)|(1<<2)|(1<<1) ; //自動(dòng)觸發(fā)使能, 64分頻,ADC使能
  6.     SFIOR  &=~ ((1<<2)|(1<<1)|(1<<0));
  7.     ADCSRA |=  (1<<6) ; //開始轉(zhuǎn)換

  8. }

  9. ///數(shù)據(jù)處理
  10. unsigned int datapro(volatile unsigned char m)
  11. {
  12.         a=5*m/1024.0;
  13.         Vin=a*1000;
  14.         return Vin;
  15. }

  16. void get_information(void)
  17. {
  18.   unsigned char i=0;

  19.   DDRA=0x00;
  20.   PORTA=0x00;

  21.   for(i=0;i<2;i++)      //讀取兩路路adc
  22.   {
  23.       init_adc(i);
  24.       while(1)
  25.        {
  26.             if(ADCSRA&(1<<4))//判斷是否轉(zhuǎn)換完成
  27.             {
  28.                 adcinit[i]= ADCL | ADCH << 8;
  29.                 adc[i]=datapro(adcinit[i]);
  30.                 break;
  31.             }

  32.        }
  33. //       nop();nop();nop();nop();nop();
  34. //       nop();nop();nop();nop();nop();//在 ADSC 置位后的一個(gè) ADC時(shí)鐘周期就可以選擇新的模擬輸入通道了
  35.   }

  36.   DDRA=0x00;
  37.   PORTA=0x00;

  38. }

  39.   void main(void)
  40. {
  41.       HC595_init();
  42.     while(1)
  43.     {
  44.             get_information();
  45.             adc_tube_show(adc[0],adc[1]);
  46.     }
  47. }
復(fù)制代碼
結(jié)果是目前數(shù)碼管顯示是AD采集的第一個(gè)數(shù)字而且固定不變了,并且數(shù)碼管上顯示的兩個(gè)數(shù)字還是相同的,實(shí)在找不到問題出在哪了(另外那個(gè)while(1)break;作用應(yīng)該是和while(ADCSRA&(1<<6));一樣的吧)請(qǐng)大佬賜教,感謝!


作者: jjjjjjir    時(shí)間: 2019-5-10 17:28
我這是菜鳥,不是大佬。
附上參考資料http://m.raoushi.com/bbs/dpj-34695-1.html  

void init_adc(int n)
{
    DDRA   &=~ ((1<<0)|(1<<1));      //模擬量輸入管腳PA1設(shè)置為輸入
    ADMUX  |=  (1<<6)|(1<<n);      //參考電壓選擇AVCC  PA15
    ADCSRA |=  (1<<7)|(1<<5)|(1<<2)|(1<<1) ; //自動(dòng)觸發(fā)使能, 64分頻,ADC使能
    SFIOR  &=~ ((1<<2)|(1<<1)|(1<<0));
    ADCSRA |=  (1<<6) ; //開始轉(zhuǎn)換

}

///數(shù)據(jù)處理
unsigned int datapro(volatile unsigned int m)
{
        a=5*m/1024.0;
        Vin=a*1000;
        return Vin;
}

void get_information(void)
{
  unsigned char temp1,temp2;
  unsigned char i=0;

  DDRA=0x00;
  PORTA=0x00;

  for(i=0;i<2;i++)      //讀取兩路路adc
  {
      init_adc(i);
      while(1)
       {
            if(ADCSRA&(1<<4))//判斷是否轉(zhuǎn)換完成
            {
                ADCSRA &=~(1<<4);//建議還要將中斷標(biāo)志位清零,根據(jù)手冊(cè)進(jìn)入中斷是會(huì)硬件清單,但是沒有進(jìn)入中斷的話最好軟件清零
                temp1 = ADCH;
                temp2 = ADCL;
                adcinit[ i]= temp2 | temp1 << 8; //adcinit[ i]這個(gè)數(shù)字必須定義為unsigned int[ i]
                adc[ ]=datapro(adcinit[ i]);
                break;
            }

       }
//       nop();nop();nop();nop();nop();
//       nop();nop();nop();nop();nop();//在 ADSC 置位后的一個(gè) ADC時(shí)鐘周期就可以選擇新的模擬輸入通道了
  }

  DDRA=0x00;
  PORTA=0x00;

}

  void main(void)
{
      HC595_init();
    while(1)
    {
            get_information();
            adc_tube_show(adc[0],adc[1]);
    }
}






歡迎光臨 (http://m.raoushi.com/bbs/) Powered by Discuz! X3.1