Thông báo

Collapse
No announcement yet.

TẠi sao khi sỬ dỤng 2 kÊnh adc trong atmega32

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

  • #16
    Nguyên văn bởi vubac2006
    em làm voi atmega 16 bi kenh 1 chay theo kênh 0, nêu dể riêng kênh 1 ma vân chạy dung, in hoi vì ao, mong dc gup do

    lcd_clear();
    lcd_gotoxy(0,0);
    lcd_putsf("ADC1:") ;
    lcd_putnum(2*adc_data[0],6,0);
    delay_us(10);
    lcd_gotoxy(0,1);
    lcd_putsf("ADC2:") ;
    lcd_putnum(2*adc_data[1],6,1);
    - Bạn tăng thêm thời gian delay_ms(1), hoặc hơn nữa xem được không? nếu không được bạn up đoạn
    Code chỗ chọn kênh ADC cho mình xem giúp được không. Mình chủ yếu viết bằng WinAVR.
    - À, bạn cố gắng gõ có dấu nhé.

    Comment


    • #17
      Nguyên văn bởi dung_AVR Xem bài viết
      Trường hợp này lúc trước mình cũng gặp và giải quyết được rồi.
      Đơn giản là khi thực thi chương trình ADC và cho hiển thị kết quả do quá trình chọn kênh diễn ra nhanh trong khi
      chương trình thực thi và cho hiển thị chưa hoàn tất nên xảy ra hiện tượng trùng kênh.
      Cách giải quyết:
      Bạn thêm hàm delay khoảng 1ms, nếu không được thì tăng lên chút xíu là ok.

      ví dụ trong code của bạn:
      ADMUX|=adc_channel;
      delay_ms(1);
      - Còn code của mình đây:
      void Channel_Select(unsigned char ch)
      {
      ADMUX=ch|ADC_VREF_TYPE;
      _delay_us(10); // Phải có delay này, nếu không sẽ bị trùng kênh
      }
      Cái đó mình cũng từng thử tăng khoảng delay lên những 100ms mà vẫn không ăn thua đó bạn.Cái này là trong trường hợp chương trình của mình chứ mình không có ý nói code của bạn.

      Comment


      • #18
        Nguyên văn bởi dung_AVR Xem bài viết
        void Channel_Select(unsigned char ch)
        {
        ADMUX=ch|ADC_VREF_TYPE;
        _delay_us(10); // Phải có delay này, nếu không sẽ bị trùng kênh
        }
        liệu chắc chắn cần fai delay khi nạp kênh đo vào ADMUX ko b?
        mình có thể bỏ lun cả hàm delay mà vẫn chạy OK mà.
        hãy quý những j hiện tại mình đang có

        Comment


        • #19
          Trong code mình viết không hề đề cập đến chuyện đó.Thực ra nếu để ý thì dù có delay đến bao nhiêu đi nữa (miễn trong ngưỡng cho phép) thì cũng không giải quyết được vấn đề gì) cái delay theo mình không thể giải quyết vấn đề.

          Comment


          • #20
            Việc chọn kênh ADC cũng giống như ta làm một việc gì đó, chẳng hạn như đánh răng rồi rửa mặt.
            Đầu tiên bạn đánh răng, sau đó mới rửa mặt, giữa 2 công việc đó buộc phải có thời gian delay.
            Mình không nói chương trình chạy được hay không, vì chương trình mình cũng chạy bình thường nhưng nếu bỏ đi delay như code
            mình gửi thì cũng bị hiện tượng trùng kênh như diễn đàng đề cập. mình chỉ chia sẻ vậy thôi. Còn code về ADC thì trên mạng có rất nhiều,
            Bạn nào có nhu cầu gửi mail cho mình, mình gửi cho kèm theo bảng Demo luôn.

            Comment


            • #21
              Nguyên văn bởi dung_AVR Xem bài viết
              Việc chọn kênh ADC cũng giống như ta làm một việc gì đó, chẳng hạn như đánh răng rồi rửa mặt.
              Đầu tiên bạn đánh răng, sau đó mới rửa mặt, giữa 2 công việc đó buộc phải có thời gian delay.
              Mình không nói chương trình chạy được hay không, vì chương trình mình cũng chạy bình thường nhưng nếu bỏ đi delay như code
              mình gửi thì cũng bị hiện tượng trùng kênh như diễn đàng đề cập. mình chỉ chia sẻ vậy thôi. Còn code về ADC thì trên mạng có rất nhiều,
              Bạn nào có nhu cầu gửi mail cho mình, mình gửi cho kèm theo bảng Demo luôn.
              Thực chất vấn đề mình trùng kênh mình đưa ra ở đây không phải là do nguyên nhân của delay như bạn nói.Nó nằm ở lí do khác sâu xa và phải hiểu bản chất vấn đề mới giải quyết.

              Comment


              • #22
                đúng rùi. vì khi ta chọn kênh đó xong fai tre ít nhất 1 chu kỳ clock rùi mới bắt đầu quá trình chuyển đổi
                hãy quý những j hiện tại mình đang có

                Comment


                • #23
                  chuyển đổi 2 kênh adc

                  các ông thì chỉ đc cái ăn tục nói phét là không ai bằng.cho coi cái adc đơn kênh nè mới chỉ mô phỏng thôi.còn code thì tự viết lấy nó mới lên lever đc chúc may mắn

                  Comment


                  • #24
                    chyen doi adc don kenh tren avr ne ai thick thi coi hehehhttp://echup.com/uploads/user_uploads/0_305344.jpg
                    hoi the gian nay gai la chi
                    ma doi luc lam ta phai kho
                    http://www.mediafire.com/file/ban2e9...w%20Folder.rar

                    Comment


                    • #25
                      chyen doi adc don kenh tren avr ne ai thick thi coi heheh
                      http://echup.com/uploads/user_uploads/0_305344.jpg
                      hoi the gian nay gai la chi
                      ma doi luc lam ta phai kho
                      http://www.mediafire.com/file/ban2e9...w%20Folder.rar

                      Comment


                      • #26
                        Nguyên văn bởi mitomtrung Xem bài viết
                        chyen doi adc don kenh tren avr ne ai thick thi coi heheh
                        http://echup.com/uploads/user_uploads/0_305344.jpg
                        hoi the gian nay gai la chi
                        ma doi luc lam ta phai kho
                        http://www.mediafire.com/file/ban2e9...w%20Folder.rar
                        ông này gửi cái hình của ông với cái mạch chi vậy. gửi mạch mà không gửi code thì thách đố người ta à, sài 3 con led 7seg mà AVR thì còn dư cả mớ chân mà tốn thêm 3 con 7447 phí vậy.

                        Comment


                        • #27
                          Bạn đã bỏ qua 1 điều rất cơ bản. Đó là sau khi đọc xong dữ liệu từ ADCW (ADCL & ADCH) thì phải xoá cờ ADIF đi chứ!. Nếu không xoá thì dù bạn chọn kênh nào đi chăng nữa, bạn cũng sẽ chỉ nhận lại dữ liệu cũ của kênh trước đó mà thôi.
                          !e

                          Comment


                          • #28
                            Nguyên văn bởi zemen Xem bài viết
                            Bạn đã bỏ qua 1 điều rất cơ bản. Đó là sau khi đọc xong dữ liệu từ ADCW (ADCL & ADCH) thì phải xoá cờ ADIF đi chứ!. Nếu không xoá thì dù bạn chọn kênh nào đi chăng nữa, bạn cũng sẽ chỉ nhận lại dữ liệu cũ của kênh trước đó mà thôi.
                            Bạn nói đúng. Nhưng mình muốn hỏi chủ thớt một câu: Chu kì lấy mẫu của bạn là bao nhiêu? Liệu việc đo liên tục như thế này có quá lãng phí thời gian của CPU? Theo mình nghĩ bạn nên dùng ngắt ADC kết hợp với dùng một timer để định thời gian lấy mẫu. Ví dụ như:
                            Code:
                            #include <avr/io.h>
                            #include <avr/interrupt.h>
                            #include <compat/deprecated.h> 
                            #include <util/delay.h>
                            #define FIRST_ADC_INPUT 0
                            #define LAST_ADC_INPUT 1
                            #define ADC_VREF_TYPE 0x20
                            
                            ISR(TIMER0_OVF_vect)//dinh thoi 1ms lay mau  mot lan
                            {
                            	TCNT0 = 0x43;
                            	sbi(ADCSRA,ADSC);
                            }
                            unsigned char input_index;
                            unsigned int adc_data[2]; 
                            ISR(ADC_vect)
                            {
                            	adc_data[input_index]=ADCW;
                            	//do something
                            	// Select next ADC input
                                if (++input_index <= (LAST_ADC_INPUT-FIRST_ADC_INPUT))
                                {
                                    ADMUX=(FIRST_ADC_INPUT|ADC_VREF_TYPE)+input_index;//chuyen den kenh ke tiep
                                    // Delay needed for the stabilization of the ADC input voltage
                                    _delay_us(10);
                                    // Start the AD conversion
                                    ADCSRA|=0x40;
                                }
                                else
                                {
                                        input_index=0;//reset kenh chuyen doi
                                        ADMUX=(FIRST_ADC_INPUT|ADC_VREF_TYPE) + input_index;
                                }
                            }

                            Comment


                            • #29
                              Code chuyen doi adc.

                              CAC BAC CAI NHAU UM SUM WA.EM CHO CAI CODE NAY CHAY CHOI NE. VE MACH GIONG NHU FILE
                              http://www.mediafire.com/file/ban2e9...w%20Folder.rar LA CHAY OK THA HO CHINH SUA THEO Y MINH.CHUC CA NHA MAY MAN
                              XEM NEU HAY NHO THANK NHA CAC BAC
                              /************************************************** ***
                              This program was produced by the
                              CodeWizardAVR V2.03.4 Standard
                              Automatic Program Generator
                              © Copyright 1998-2008 Pavel Haiduc, HP InfoTech s.r.l.
                              http://www.hpinfotech.com

                              Project : CHUYEN DOI ADC HIEN THI NHIET DO LEN LCD
                              Version :
                              Date : 18/5/2011
                              Author :
                              Company :KHOA HOC TU NHIEN TPHCM
                              Comments:HOTLINE 01674558772;


                              Chip type : ATmega32
                              Program type : Application
                              Clock frequency : 1.000000 MHz
                              Memory model : Small
                              External RAM size : 0
                              Data Stack size : 512
                              ************************************************** ***/

                              #include <mega32.h>

                              // Alphanumeric LCD Module functions
                              #asm
                              .equ __lcd_port=0x18 ;PORTB
                              #endasm
                              #include <lcd.h>

                              #include <delay.h>

                              #define ADC_VREF_TYPE 0x20

                              // Read the 8 most significant bits
                              // of the AD conversion result

                              unsigned char read_adc(unsigned char adc_input)
                              {
                              ADMUX=adc_input | (ADC_VREF_TYPE & 0xff);
                              // Delay needed for the stabilization of the ADC input voltage
                              delay_us(10);
                              // Start the AD conversion
                              ADCSRA|=0x40;
                              // Wait for the AD conversion to complete
                              while ((ADCSRA & 0x10)==0);
                              ADCSRA|=0x10;
                              return ADCH;
                              }

                              // Declare your global variables here
                              unsigned char kt(int i);
                              unsigned char ADC_val;
                              void hienthi(unsigned char ADC_val)
                              {
                              unsigned char donvi,chuc,tram,nghin,temp;
                              temp=ADC_val;
                              nghin=temp/1000;
                              tram=(temp-nghin*1000)/100;
                              chuc=(temp-nghin*1000-tram*100)/10;
                              donvi=temp-nghin*1000-tram*100-chuc*10;
                              PORTC=(chuc<<4)+donvi;
                              PORTD=(nghin<<4)+tram;
                              }

                              void LCD(int i)
                              { int hot;
                              int a,b;
                              hot=i/5.1;
                              lcd_gotoxy(0,0);
                              lcd_putsf("temprature");
                              a=hot/10;
                              b=hot-(a*10);
                              lcd_gotoxy(5,1);
                              lcd_putchar(kt(a));
                              lcd_gotoxy(6,1);
                              lcd_putchar(kt(b));
                              lcd_gotoxy(7,1);
                              lcd_putsf(" oC");
                              }


                              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=Out Func6=Out Func5=Out Func4=Out Func3=Out Func2=Out Func1=Out Func0=Out
                              // State7=0 State6=0 State5=0 State4=0 State3=0 State2=0 State1=0 State0=0
                              PORTB=0x00;
                              DDRB=0xFF;

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

                              // Port D initialization
                              // Func7=Out Func6=Out Func5=Out Func4=Out Func3=Out Func2=Out Func1=Out Func0=Out
                              // State7=0 State6=0 State5=0 State4=0 State3=0 State2=0 State1=0 State0=0
                              PORTD=0x00;
                              DDRD=0xFF;

                              // Timer/Counter 0 initialization
                              // Clock source: System Clock
                              // Clock value: Timer 0 Stopped
                              // Mode: Normal top=FFh
                              // OC0 output: Disconnected
                              TCCR0=0x00;
                              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=0x00;

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

                              // ADC initialization
                              // ADC Clock frequency: 500.000 kHz
                              // ADC Voltage Reference: AREF pin
                              // Only the 8 most significant bits of
                              // the AD conversion result are used
                              ADMUX=ADC_VREF_TYPE & 0xff;
                              ADCSRA=0x81;

                              // LCD module initialization
                              lcd_init(16);

                              while (1)
                              {
                              ADC_val=read_adc(0);
                              hienthi(ADC_val);
                              LCD(ADC_val);
                              delay_ms(100);

                              };

                              }
                              unsigned char kt(int i) // Ham Chuyen so sang kytu cho ham xuat lcd_putchar(kytu).
                              {
                              switch (i)
                              {
                              case 1: // So dua vao la 1 thi tra ve kytu '1'.
                              {
                              return '1';
                              break;
                              }
                              case 2:
                              {
                              return '2'; // So dua vao la 2 thi tra ve kytu '2'.
                              break;
                              }
                              case 3:
                              {
                              return '3'; // ... .. "3".
                              break;
                              }
                              case 4:
                              {
                              return '4';
                              break;
                              }
                              case 5:
                              {
                              return '5';
                              break;
                              }
                              case 6:
                              {
                              return '6';
                              break;
                              }
                              case 7:
                              {
                              return '7';
                              break;
                              }
                              case 8:
                              {
                              return '8';
                              break;
                              }
                              case 9:
                              {
                              return '9';
                              break;
                              }
                              case 0:
                              {
                              return '0';
                              break;
                              }
                              }
                              }
                              Last edited by mitomtrung; 18-05-2011, 00:56.

                              Comment


                              • #30
                                Aaaaaaaaaa

                                Aaaaaaaaaaaaaaaaaaaaa

                                Comment

                                Về tác giả

                                Collapse

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

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

                                Collapse

                                Đang tải...
                                X