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

                                • dinhthuong80
                                  Trả lời cho Tiếng Anh cho người Việt
                                  bởi dinhthuong80
                                  Bác nói rất khách quan và chính xác. Ngoại ngữ là chìa khóa thăng tiến dù làm gì. Chả thế mà nay nước mình dạy tiếng Anh từ tiểu học.

                                  Nhớ hồi năm 2006 em ra Hải Phòng, Hải Dương tìm việc, thời đó ở Bình Dương lương công...
                                  hôm nay, 14:51
                                • dinhthuong80
                                  Trả lời cho Tiếng Anh cho người Việt
                                  bởi dinhthuong80
                                  Cảm ơn bạn, ĐT cũng có ý nghĩ như vậy.

                                  Thực ra, lỗi của hãng đó ( gọi là hãng vì không chỉ một model sản phẩm) là về phần cứng, ĐT tuy không biết về lập trình phần mềm nhưng cũng thấy rằng sẽ chẳng khó khăn gì đáng...
                                  hôm nay, 14:39
                                • dinhthuong80
                                  Trả lời cho Tiếng Anh cho người Việt
                                  bởi dinhthuong80
                                  Dạ, bác bảy mấy tuổi đời rồi cũng không kém bố cháu bao nhiêu. Tuổi nghề thì bác cũng đáng tuổi cha chú.

                                  Nhưng 2 điều trên thì chưa hẳn đã đáng quí và đáng tôn trọng bằng việc bác rất nhiệt tình chia sẻ kinh nghiệm chuyên...
                                  hôm nay, 14:28
                                • bqviet
                                  Trả lời cho Tiếng Anh cho người Việt
                                  bởi bqviet
                                  Đúng, nếu chú tâm thì chỉ cần mỗi tiếng Việt là đã khá đủ để làm đa số công việc thông thường, ở thời đại ngày nay khi tài liệu sách vở phương tiện thông tin liên lạc đã nhiều. Nhưng cũng chính ở thời nay giao lưu các nước nhiều...
                                  Hôm qua, 20:26
                                • mèomướp
                                  Trả lời cho Tiếng Anh cho người Việt
                                  bởi mèomướp
                                  Dạ cháu nghĩ chú dinh... cứ mạnh dạn gửi thư đi ạ, chú có thể gửi bằng văn bản in chuyển phát nhanh sẽ có giá trị hơn. Vấn đề chưa hẳn là cần hãng làm gì đó, mà chỉ đơn giản là mình cảm thấy nhẹ lòng vì đã làm những việc bản...
                                  Hôm qua, 12:32
                                • vi van pham
                                  Trả lời cho Tiếng Anh cho người Việt
                                  bởi vi van pham
                                  Những lần hắt hơi sổ mũi làm tôi mệt lã, phải dùng rượu uống để ngũ. Tôi cũng đang uống rượu 1 mình, viết vài dòng này cho em ( có lẽ dt chỉ bằng tuổi em tôi).

                                  Dinh thuong dang đi vào vết xe đổ của tôi. Càng chứng minh, có...
                                  20-02-2025, 21:31
                                • bqviet
                                  Trả lời cho Hỏi về cách hàn linh kiện ( giúp tớ với )
                                  bởi bqviet
                                  Thiết nghĩ thi thoảng bác lên đây chia xẻ ít kinh nghiệm cũng vui rồi. Còn chuyện con người sinh lão bệnh tử là thường, sống cùng với quy luật đó thôi. Bqv nhớ trước đây bác từng kể về chuyện rang chì ô-xít bằng chảo để phục hồi bình điện, đấy cũng là thành quả đáng nể phục ở thời kỳ thiếu thốn đó.
                                  20-02-2025, 17:22
                                • dinhthuong80
                                  Trả lời cho Tiếng Anh cho người Việt
                                  bởi dinhthuong80
                                  Tiếng Anh, Đình Thường phải nói là rất tệ, khiến việc giao tiếp đời thường thôi cũng khó chứ nói gì về kĩ thuật.

                                  Nhân tiện, nhờ các bạn, các bác xem giúp thư ĐT viết thế này liệu có thể gửi tới địa chỉ nhận hay chăng,...
                                  20-02-2025, 11:52
                                • vi van pham
                                  Trả lời cho Hỏi về cách hàn linh kiện ( giúp tớ với )
                                  bởi vi van pham
                                  Uống rượu 1 mình, thấy trang này nhớ lại cách đây vài chục năm hàn thiếc với inox cực kỳ khó, phải dùng acid Hcl tác dụng lên kẻm Zn để có Zncl2 làm thuốc trợ hàn, lúc đó làm gì có acid Hcl và thuốc trợ hàn?

                                  Cái khó bó cái...
                                  19-02-2025, 23:05
                                • nhathung1101
                                  Trả lời cho Tiếng Anh cho người Việt
                                  bởi nhathung1101
                                  Nếu chú tâm thì học tiếng Việt cũng đủ rồi, thừa sức làm việc rồi.

                                  Học tiếng Anh cũng chỉ phụ trợ để đọc thêm tài liệu, hướng dẫn.

                                  Nhưng có hiểu điều đó không mới là vấn đề. Khi mà học ngoại ngữ để đi đạp xích lô đón khách???...
                                  19-02-2025, 21:27
                                Đang tải...
                                X