Thông báo

Collapse
No announcement yet.

ADC trên AVR (10 bit) làm sao truyền ra TxD (UART)

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

  • ADC trên AVR (10 bit) làm sao truyền ra TxD (UART)

    Dạ em chào Quý anh chị! Em có gặp 1 vấn đề sau: Em đã dùng bộ ADC trên AVR ATmega32 để chuyển đổi tín hiệu Analog thành dữ liệu số (có độ lớn 10 bit). Cho em hỏi làm sao để truyền dữ liệu này ra chân TxD (truyền UART) giao tiếp với cổng COM thông qua RS232 để hiển thị tín hiệu lên máy tính (trong khi khung truyền dữ liệu UART chỉ cho phép data cao nhất là truyền 9 bit data).
    Em cảm ơn sự trả lời của anh ạ!!! Em đang làm Luận Văn TN, gặp vấn đề này. Dạ, cũng gần nộp Báo cáo, nên em mong anh phúc đáp giúp em. Em cảm ơn anh nhiều!!!
    Thân,
    em Nhất Duy

  • #2
    bạn dùng hàm printf() trong thư viện stdio.h mình vẫn truyền ADC 10 bit lên máy tính bằng cách này mà.
    Never forget who you are!

    Comment


    • #3
      Nó có 2 thanh ghi byte cao và byte thấp mà.Học Vi điều khiển 8 bit mà kô hiểu à.
      , , ,

      Comment


      • #4
        Dạ, em cũng rõ hiểu điều này. Nhưng em muốn tham khảo thêm từ các anh chị có kinh nghiệm hơn! Ai biết thì viết giúp mình một chương trình con cho trường hợp này, cho mình tham khảo với. Mình đang viết bằng WinAVR.

        Comment


        • #5
          Bạn lên hocavr.com mà tham khảo. Tui nhớ ko lầm thì trên đó có hết đó

          Comment


          • #6
            Em là fan bên đó mà. Đọc cũng kỹ, nhưng tổng hợp lại cũng khó đó.
            Nội dung mình cần làm là:
            "Chuyển đổi tín hiệu Analog (Tín hiệu điện tim - ECG đã xử lý lọc nhiễu và khuếch đại IA lên khoảng 3V) đưa vào từ chân PA0/ADC0 thành tín hiệu số sử dụng bộ ADC 10 bit của ATmega 32. Sau đó, tín hiệu số này cần được đưa ra đường truyền chân TxD (chế độ UART) giao tiếp với máy tính (PC) thông qua chuẩn RS232 và MAX232". Tín hiệu trên máy tín là tín hiệu sóng điện tim ECG cần thu nhận. Tín hiệu này có thể dùng (VB hoặc VC++ để viết giao diện thu nhận - em làm được. Chỉ có thắc mắc ở khâu lấy dữ diệu số sau khi chuyển ADC rồi làm sao đưa ra kênh TxD bằng UART)
            Em mong Quý anh chị trên diễn dàn, có ai biết rõ, có chỉ giúp em. Em đang viết trên WinAVR

            Cảm ơn Quý anh chị nhiều!
            Em, Nhất Duy

            Comment


            • #7
              Có ai giúp em với đi mà!!! Đang gặp khó khăn muốn chết luôn. Ngày nào cũng ngồi tới khuya. Hoa cả mắt. Có ai biết giúp em với nha!!!

              Comment


              • #8
                Thế có nhất thiết là ADC 10 bit thì cứ phải truyền đúng 10 bit ko
                Vẫn có thể biến nó thành 16 bit để truyền cơ mà ?

                Comment


                • #9
                  Truyền 8 bit thấp, 8 bit cao .

                  quan trọng nó là giá trị kết quả chứ 10 bit ... với 16 bit thì cũng vẫn 2 lần truyền
                  Module RF chuyên dụng điều khiển, truyền dữ liệu, thiết kế đề tài, dự án điện tử - chuyển giao công nghệ... ĐT: 0904964977 - email: dientuqueduong@yahoo.com

                  Comment


                  • #10
                    Nguyên văn bởi queduong Xem bài viết
                    Truyền 8 bit thấp, 8 bit cao .

                    quan trọng nó là giá trị kết quả chứ 10 bit ... với 16 bit thì cũng vẫn 2 lần truyền
                    Anh giúp em chỉnh sửa lại chương trình với anh Dương ơi!!! Em đuối quá rồi anh. Tối nào em cũng thức tới khuya 3 giờ sáng, hoa cả mắt rồi anh. Vậy mà vẫn bí. Em làm xong mấy phần mạch lấy tín hiệu điện tim, lọc nhiểu, khuếch đại ... phần cứng cho AVR cũng xỏngoiff. Giờ viết phần mềm, phần mày em bí mất anh. Anh giúp em nha anh!!! Có dịp em sẽ gặp anh báo đáp sự giúp đỡ!!!

                    File chương trình em đính kèm ...

                    #include <avr/io.h>
                    #include <avr/interrupt.h>
                    #include <util/delay.h>
                    #include <stdio.h>

                    #define AREF_MODE 0 //dien ap tham chieu ngoai, dien ap tren chan Vref
                    #define AVCC_MODE (1<<REFS0) //dung dien ap chan AVcc lam dien ap tham chieu, chan Vref gan voi 1 tu dien
                    #define INT_MODE (1<<REFS1)|(1<<REFS0) //dung dien ap tham chieu noi 2.56V, chan Vref gan voi 1 tu dien
                    #define ADC_VREF_TYPE AREF_MODE //dinh nghia dien ap tham chieu

                    uint16_t ADC_val;
                    //*********** chuong trinh con doc ADC theo tung kenh ********************
                    uint16_t read_adc(unsigned char adc_channel){
                    ADMUX=adc_channel|ADC_VREF_TYPE;
                    ADCSRA|=(1<<ADSC); //bat dau chuyen doi
                    loop_until_bit_is_set(ADCSRA,ADIF); //cho den khi nao bit ADIF==1
                    return ADCW;
                    }
                    //******** chuong trinh con xu ly du lieu sau khi chuyen doi ADC (10 bit) ********
                    void PORT_out(uint16_t val){
                    uint16_t dvi, chuc, tram, nghin,temp_val;
                    temp_val=val;

                    nghin=temp_val/1000;
                    temp_val-=(1000*nghin);
                    tram=temp_val/100;
                    temp_val-=(100*tram);
                    chuc=temp_val/10;
                    dvi=temp_val-(10*chuc);

                    PORTB=(chuc<<4)+dvi; //xuat du lieu sau khi chuyen doi ADC ra LED de kiem tra
                    PORTC=(nghin<<4)+tram;

                    }
                    // chuong trinh con phat du lieu bang UART ra chan TxD ket noi cong COM May tinh
                    void uart_char_tx(unsigned char chr){
                    while (bit_is_clear(UCSRA,UDRE)) {}; //cho den khi bit UDRE=1 moi thoat khoi while
                    UDR=chr;
                    }
                    volatile unsigned char u_Data;

                    // tao "FILE" (stream) tuong ung voi UART
                    static FILE uartstd= FDEV_SETUP_STREAM(uart_char_tx, NULL,_FDEV_SETUP_WRITE);

                    int main(void){
                    //******** UART: set baud,38.4k ung voi f=8Mhz ***********
                    UBRRH=0;
                    UBRRL=12;
                    //set khung truyen va kich hoat bo nhan du lieu
                    UCSRA=0x00;
                    UCSRC=(1<<URSEL)|(1<<UCSZ1)|(1<<UCSZ0);
                    UCSRB=(1<<RXEN)|(1<<TXEN)|(1<<RXCIE); //cho phep ngat RxD
                    sei(); //cho phep ngat toan cuc
                    //UART: in ra uart --------------------
                    stdout=&uartstd;
                    printf("Moi cac ban theo doi tin hieu ECG thu nhan duoc\n");


                    // *********************chuyen ADC************************

                    ADCSRA=(1<<ADEN)|(1<<ADPS2)|(1<<ADPS0); //enable ADC, khong dung interrupt
                    ADMUX=ADC_VREF_TYPE; //chon kieu dien ap tham chieu

                    DDRB=0xFF; //PORTB la output PORT, for LED
                    DDRC=0xFF; //PORTC la output PORT, for LED



                    while (1){
                    ADC_val=read_adc(0);
                    PORT_out(ADC_val); // xuat du lieu tu ADC ra PORT (noi voi LED) de kiem tra
                    _delay_ms(100);
                    }
                    }
                    ISR(SIG_UART_RECV){ //trinh phuc vu ngat USART
                    u_Data=UDR;
                    uart_char_tx(u_Data);
                    //In ma ASCII cua phim duoc nhan
                    fprintf(&uartstd,"Dao trinh II:%i\n",UDR);
                    }

                    // the end

                    Comment


                    • #11
                      Có ai biết chỉnh sửa lại chương trình trên giúp mình với!!! Mình việt vậy còn nhiều chổ không rành ...

                      Comment


                      • #12
                        ADC 10 bit sau khi đọc xong được giá trị ADC_val;

                        tách cái ADC_val này thành 2 byte

                        VD : ADC_val1= ADC_val & 0xFF; // byte thấp
                        ADC_val2 = ADC_val >>8; // byte cao


                        hoặc :
                        ADC_val1= ADC_val % 256 ; // byte thấp
                        ADC_val2= ADC_val / 256 ; // byte cao

                        rồi mang ra mà truyền lên UART

                        truyền_UART (ADC_val1);
                        truyền_UART(ADC_val2);


                        --- có vậy thôi.
                        Ở máy tính thì nhận được 2 byte ... làm phép biến đổi ngược lại , cộng chúng vào với nhau ta sẽ có được kết quả ADC_val 10 bit trên máy tính.

                        Cái này mình nghĩ là kiến thức cơ bản nhất byte, bit ... của bộ môn kỹ thuật số và MCU chứ nhỉ ???
                        Module RF chuyên dụng điều khiển, truyền dữ liệu, thiết kế đề tài, dự án điện tử - chuyển giao công nghệ... ĐT: 0904964977 - email: dientuqueduong@yahoo.com

                        Comment


                        • #13
                          cái này là cơ bản của vi điều khiển khi truyền thông mà:m
                          mà để đơn giản hóa bạn sài ADC 8 bit truyền 1 byte cho dễ cần gì phải sài ADC 10 bít truyền 2 byte cho phức tạp

                          Comment


                          • #14
                            Nguyên văn bởi daicaxomlieu Xem bài viết
                            cái này là cơ bản của vi điều khiển khi truyền thông mà:m
                            mà để đơn giản hóa bạn sài ADC 8 bit truyền 1 byte cho dễ cần gì phải sài ADC 10 bít truyền 2 byte cho phức tạp
                            nói thế này người ta sản xuất ADC 10 bit , 12bit hoặc những dòng cao cấp hơn để húp cháo !
                            Module RF chuyên dụng điều khiển, truyền dữ liệu, thiết kế đề tài, dự án điện tử - chuyển giao công nghệ... ĐT: 0904964977 - email: dientuqueduong@yahoo.com

                            Comment


                            • #15
                              Quý anh chị nào biết giúp mình kiểm tra lại chương trình mình viết bên dưới với!!! Mình đã mô phỏng xuất Led để kiểm tra ADC và dùng Virtual Terminal để test ... Kết quả: không hiểu sao lại ra vầy. Mình gửi liink toàn bộ file chương trình và file mô phỏng. Các bạn giúp mình kiểm tra lại với nha!!! Anh QueDuong ơi, vô giúp em với!!!
                              Mình cảm ơn Quý anh chị giúp đỡ!!!
                              Em, Nhất Duy

                              Link: 2shared - download ADC_UART.rar
                              Last edited by engineering; 19-11-2011, 23:33.

                              Comment

                              Về tác giả

                              Collapse

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

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

                              Collapse

                              Đang tải...
                              X