Thông báo

Collapse
No announcement yet.

ADC trong AVR

Collapse
X
 
  • Lọc
  • Giờ
  • Show
Clear All
new posts

  • #16
    Mình thì chỉ thích xài hàng made-in...tự tui thôi. Đây là đoạn code cho AVR để đọc ADC cho mình viết. Mình dùng để xài cho cái màn hình cảm ứng của điện thoại di động OK lắm.
    //================================================== ==============
    //Chuong trinh nay dung voi AVR chay voi tan so thach anh 4 MHz, thuc hien loc nhieu
    //bang cach lay trung binh 8 lan doc.
    int ADC_read(unsigned char input_sel)
    {
    char i;
    int temp = 0;
    int result = 0;
    ADMUX |=(1<<REFS0);//Chon nguon tham khao ben trong chip
    ADMUX += input_sel;//Chon kenh doc vao
    //Chu y, trong truong hop nay, ket qua duoc canh phai


    //Cau hinh cho phep ADC va chon tan so cho bo lay mau va cho phep bo ADC
    ADCSRA |= (1<<ADEN)|(ADPS2)|(ADPS0);
    //4MHz/32 = 125 kHz

    //****Thuc hien thu lan chuyen doi dau tien*****
    ADCSRA|=(1<<ADSC);//Bat dau chuyen doi, ADSC: ADC start conversion, bit nay bang 1 trong qua trinh chuyen doi, chuyen doi xong, bit nay bang 0
    //Cho cho chuyen doi xong, co ADIF len 1
    while (!(ADCSRA & (1<<ADIF)));//Khi chua ket thuc qua trinh chuyen doi thi co ADIF bang 0, ta nhay tai cho
    //**********************************************
    //Thuc hien phep chuyen doi ADC 8 lan nham thu duoc ket qua chinh xac nhat
    for (i=0;i<8;i++)
    {
    ADCSRA|=(1<<ADSC);//Bat dau chuyen doi, ADSC: ADC start conversion, bit nay bang 1 trong qua trinh chuyen doi, chuyen doi xong, bit nay bang 0
    //Cho cho chuyen doi xong, co ADIF len 1
    while (!(ADCSRA & (1<<ADIF)));//Khi chua ket thuc qua trinh chuyen doi thi co ADIF bang 0, ta nhay tai cho
    temp = ADCL;//Doc gia tri thanh ghi thap
    temp += (ADCH<<8);//Cong voi gia tri thanh ghi cao nhan cho 256
    result+=temp;//Cong them gia tri bo ADC vao bien result
    }
    result >>=3;//thuc hien viec chia ket qua cho 8 de lay trung binh
    ADCSRA &= ~(1<<ADEN);//Tat bo ADC
    return result;

    }
    Homepage:

    Comment


    • #17
      Đây là bài lập trình dùng codevision em dùng cho cảm biến dò đường, các bác test hộ em nhé !!!!Vì em cũng chưa hiểu thật kĩ kênh ADC cho lắm .



      /************************************************** ***
      This program was produced by the
      CodeWizardAVR V1.25.5 Professional
      Automatic Program Generator
      © Copyright 1998-2007 Pavel Haiduc, HP InfoTech s.r.l.
      http://www.hpinfotech.com

      Project :
      Version :
      Date : 1/13/2008
      Author : F4CG
      Company : F4CG
      Comments:


      Chip type : ATmega16
      Program type : Application
      Clock frequency : 4.000000 MHz
      Memory model : Small
      External SRAM size : 0
      Data Stack size : 256
      ************************************************** ***/

      #include <mega16.h>

      // Alphanumeric LCD Module functions
      #asm
      .equ __lcd_port=0x15 ;PORTC
      #endasm
      #include <lcd.h>
      #include <math.h>
      #include <delay.h>
      bit bien_lcd=0;
      #define FIRST_ADC_INPUT 0
      #define LAST_ADC_INPUT 7
      #define button0 PIND.0
      #define button1 PIND.1
      unsigned char adc_data[LAST_ADC_INPUT-FIRST_ADC_INPUT+1];
      #define ADC_VREF_TYPE 0x20

      // ADC interrupt service routine
      // with auto input scanning
      interrupt [ADC_INT] void adc_isr(void)
      {
      register static unsigned char input_index=0;
      // Read the 8 most significant bits
      // of the AD conversion result
      adc_data[input_index]=ADCH;
      // Select next ADC input
      if (++input_index > (LAST_ADC_INPUT-FIRST_ADC_INPUT))
      input_index=0;
      ADMUX=(FIRST_ADC_INPUT | (ADC_VREF_TYPE & 0xff))+input_index;
      // Delay needed for the stabilization of the ADC input voltage
      delay_us(10);
      // Start the AD conversion
      ADCSRA|=0x40;
      }
      interrupt [TIM0_OVF] void timer0_ovf_isr(void)
      {
      if ( button0==0 ){SPH=0;SPL=0;}
      if ( button1==0 ){bien_lcd=1;}
      // Place your code here

      }
      // Declare your global variables here


      //================================================== ====================
      void lcd_putnum(unsigned char so,unsigned char x,unsigned char y)
      {
      unsigned char a,b,c;
      a=so/100; // lay fan tram
      b=(so-100*a)/10; // lay fan chuc
      c=(so-100*a-10*b); // lay hang don vi
      lcd_gotoxy(x,y); // ve vi tri x,y
      lcd_putchar(a+48); // day ra hang tram, ma ascii
      lcd_putchar(b+48); // day ra hang chuc, ma ascii
      lcd_putchar(c+48); // day ra hang don vi, ma ascii
      }
      //================================================== =====================
      unsigned int sensor[8],checkSensor[8],bienTG;
      unsigned char a,b,c,x,y,n,tong,checkSUM,ngatu;
      unsigned int bienphu;
      unsigned int trungbinh;
      void main(void)
      {
      // Declare your local variables here

      // Input/Output Ports initialization
      // Port A initialization
      // Func7=In Func6=In Func5=In Func4=In Func3=In Func2=In Func1=In Func0=In
      // State7=T State6=T State5=T State4=T State3=T State2=T State1=T State0=T
      PORTA=0x00;
      DDRA=0x00;

      // Port B initialization
      // Func7=In Func6=In Func5=In Func4=In Func3=In Func2=In Func1=In Func0=In
      // State7=T State6=T State5=T State4=T State3=T State2=T State1=T State0=T
      PORTB=0xff;
      DDRB=0xff;

      // Port C initialization
      // Func7=In Func6=In Func5=In Func4=In Func3=In Func2=In Func1=In Func0=In
      // State7=T State6=T State5=T State4=T State3=T State2=T State1=T State0=T
      PORTC=0x00;
      DDRC=0x00;

      // Port D initialization
      // Func7=In Func6=In Func5=In Func4=In Func3=In Func2=In Func1=In Func0=In
      // State7=T State6=T State5=T State4=T State3=T State2=T State1=T State0=T
      PORTD=0xff;
      DDRD=0b00010000; //PORD.4 = out

      // Timer/Counter 0 initialization
      // Clock source: System Clock
      // Clock value: Timer 0 Stopped
      // Mode: Normal top=FFh
      // OC0 output: Disconnected
      TCCR0=0x02;
      TCNT0=0x00;
      OCR0=0x00;


      // Timer/Counter 1 initialization
      // Clock source: System Clock
      // Clock value: Timer 1 Stopped
      // Mode: Normal top=FFFFh
      // OC1A output: Discon.
      // OC1B output: Discon.
      // Noise Canceler: Off
      // Input Capture on Falling Edge
      // Timer 1 Overflow Interrupt: Off
      // Input Capture Interrupt: Off
      // Compare A Match Interrupt: Off
      // Compare B Match Interrupt: Off
      TCCR1A=0x00;
      TCCR1B=0x00;
      TCNT1H=0x00;
      TCNT1L=0x00;
      ICR1H=0x00;
      ICR1L=0x00;
      OCR1AH=0x00;
      OCR1AL=0x00;
      OCR1BH=0x00;
      OCR1BL=0x00;

      // Timer/Counter 2 initialization
      // Clock source: System Clock
      // Clock value: Timer 2 Stopped
      // Mode: Normal top=FFh
      // OC2 output: Disconnected
      ASSR=0x00;
      TCCR2=0x00;
      TCNT2=0x00;
      OCR2=0x00;

      // External Interrupt(s) initialization
      // INT0: Off
      // INT1: Off
      // INT2: Off
      MCUCR=0x00;
      MCUCSR=0x00;

      // Timer(s)/Counter(s) Interrupt(s) initialization
      TIMSK=0x01;

      // Analog Comparator initialization
      // Analog Comparator: Off
      // Analog Comparator Input Capture by Timer/Counter 1: Off
      ACSR=0x80;
      SFIOR=0x00;

      // ADC initialization
      // ADC Clock frequency: 1000.000 kHz
      // ADC Voltage Reference: AREF pin
      // ADC Auto Trigger Source: None
      // Only the 8 most significant bits of
      // the AD conversion result are used
      ADMUX=FIRST_ADC_INPUT | (ADC_VREF_TYPE & 0xff);
      ADCSRA=0xCA;
      // LCD module initialization
      lcd_init(16);

      // Global enable interrupts
      #asm("sei")
      b=1;
      n=5;// so lan quet
      // lay gia tri dau tien tu ADC

      while (1)
      {
      //};
      //buoc1: nhan gia tri ADC - mang du lieu adc_data
      // hien thi ra LCD
      //buoc2: quet n lan luu vao Mang khac
      //buoc3: tinh gia tri trung binh tren 1 mat
      //buoc4: so sanh gia tri trung binh 1 mat voi khoang gia tri dinh truoc
      //buoc5: dua ra PORTB

      /*
      while (a<8)
      {
      bienphu = adc_data[a];
      lcd_putnum(bienphu,x,y);
      a++;
      x=x+4;
      if (x==16) { x=0;y=1;}
      };
      a=0;
      x=0;
      y=0;
      */
      //-----------------------------------------------------
      // luu du lieu tu ADC vao bien Sensor - Quet n lan
      while (x<=5) // n=5
      { while (y<8)
      {
      sensor[y] = sensor[y] + adc_data[y];
      y++;
      };
      y=0;
      x++;
      };
      x=0;
      y=0;
      //--------------- Tinh trung binh gia tri sensor ---------------

      while (x<8)
      {
      sensor[x] = sensor[x] / 5; // n so lan quet // n=5
      x++;
      // neu lan sau gia tri thay doi khac 2 dv thi cap nhat gia tri moi
      //switch (sensor[x])
      //{
      // case 19: {sensor[x]=20; break ;}
      // case 41: {sensor[x]=40; break ;}
      //}
      if (abs(sensor[x] - checkSensor[x]) > 2 )
      {sensor[x]=sensor[x];
      checkSensor[x]=sensor[x];}
      else
      sensor[x]=checkSensor[x];
      };
      x=0;

      //---------------------------------------------------
      /*
      while (x<8)
      {
      if ((20 <= sensor[x]) & (sensor[x] <=40))
      sensor[x]=0;
      else
      sensor[x]=1;
      x++;
      };
      x = 0;
      */

      while (a<8)
      {
      bienphu = sensor[a];
      if (bien_lcd==1) lcd_putnum(bienphu,x,y);
      a++;
      x=x+4;
      if (x==16) { x=0;y=1;}
      };
      a=0;
      x=0;
      y=0;
      // ********** DUA GIA TRI DA DUOC XU LY CUA SENSOR *** UMI *********
      if ((120<=sensor[0]) & (sensor[0]<=250)) //100 // 17 - 45
      sensor[0]=0;
      else sensor[0]=1;
      /////////////////
      if ((115<=sensor[1]) & (sensor[1]<=250)) //90 // 15 - 40
      sensor[1]=0;
      else sensor[1]=1;
      ////////////////////
      if ((120<=sensor[2]) & (sensor[2]<=250)) //66 // 28 - 50
      sensor[2]=0;
      else sensor[2]=1;
      ///////////////////
      if ((110<=sensor[3]) & (sensor[3]<=250)) //130 // 17 - 45
      sensor[3]=0;
      else sensor[3]=1;
      //////////////////
      if ((112<=sensor[4]) & (sensor[4]<=250)) //72 // 18 - 45
      sensor[4]=0;
      else sensor[4]=1;
      /////////////////// // 25 - 50
      if ((110<=sensor[5]) & (sensor[5]<=250)) //150
      sensor[5]=0;
      else sensor[5]=1;
      //////////////////
      if ((60<=sensor[6]) & (sensor[6]<=250)) //33 // 18 - 40
      sensor[6]=0;
      else sensor[6]=1;

      if ((65<=sensor[7]) & (sensor[7]<=250)) //42
      sensor[7]=0;
      else sensor[7]=1;
      /////////////////////

      //----------------- Kiem tra nga tu ---------------
      tong = sensor[0] + sensor[1] + sensor[2] + sensor[3] + sensor[4] + sensor[5] ;
      if ( tong <= 2 ) // 4
      {PORTD.4=0;PORTB=0B11000000;checkSUM = 0;ngatu = 0;b=0;} // 10000000
      else
      {
      checkSUM = 0;
      ngatu = 0;
      b=1;
      PORTD.4=1;
      }
      // ---------------dua ra PORTB---------------
      if (b)
      {
      PORTB.0 = sensor[0];
      PORTB.1 = sensor[1];
      PORTB.2 = sensor[2];
      PORTB.3 = sensor[3];
      PORTB.4 = sensor[4];
      PORTB.5 = sensor[5];
      PORTB.6 = sensor[6];
      PORTB.7 = sensor[7];
      }
      }



      }

      Comment


      • #18
        bác nào biết check hộ em đoạn code này cái em dùng biến trở để đưa điện áp vào chân ADC đo thử nhưng mà nó không hiện đúng giá trị điện áp đưa vào? em có gửi file kèn theo cả code và mô phỏng nữa
        Attached Files
        Never forget who you are!

        Comment


        • #19
          sao dạo này cái mục AVR chán thế nhỉ chả có ai ghé thăm gì hết trong khi đó 8051 rất sôi nổi. ai biết vào check giúp em đi
          cảm ơn nhiều!
          Never forget who you are!

          Comment


          • #20
            Nguyên văn bởi nhquangdt3k5 Xem bài viết
            bác nào biết check hộ em đoạn code này cái em dùng biến trở để đưa điện áp vào chân ADC đo thử nhưng mà nó không hiện đúng giá trị điện áp đưa vào? em có gửi file kèn theo cả code và mô phỏng nữa
            mình khai báo biến nó bị tràn nên nó hiển thị không chính xác.
            Never forget who you are!

            Comment

            Về tác giả

            Collapse

            khanhcuncon8 Tìm hiểu thêm về khanhcuncon8

            Bài viết mới nhất

            Collapse

            Đang tải...
            X