Thông báo

Collapse
No announcement yet.

Help: đọc giá trị điện áp lên PC

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

  • Help: đọc giá trị điện áp lên PC

    Chào mọi người trong 4room.
    Em có 1 vài câu hỏi mong mọi người giúp đỡ
    Hiện em đang cần hiển thị tín hiệu điện áp từ môt mạch khuếch đại âm thanh (tín hiệu trước loa) lên máy tính để vẽ đồ thị và thực hiện xử lý.
    Cụ thể tín hiệu em cần lấy lên là 1 tín hiệu có dạng như hình bên dưới (đo được = osilo ) có điện áp mã= 1,5 V
    Phương án truyền dữ liệu mà em nghĩ ngay đến là dùng VXL cụ thể là PIC16f877a đọc giá trị ADC gửi lên máy tính thông qua RS232. Nhưng vấn đề ở đây là code VXL em viết không đọc được đúng điện áp. Cụ thể là trong mô phỏng em lấy tín hiệu vào là 1 V thì VXL đọc ra và hiển thị LCD chỉ có 0,2 - 0,5 V.
    Khi cho vào mạch thực tế thì giá trị bị nhảy giữa 0 V và 5 V.
    Em chẳng biết nên làm gì nữa mong mọi người chỉ giáo.

    Và em cắm dây trực tiếp từ tín hiệu trước loa vào chân AN0 (ADC) được k ạ?
    Cảm ơn mọi người rất nhiều.
    Chúc mọi người dịp nghỉ lễ vui vẻ.

    PS: e up mãi file mô phỏng với chương trình mà k được (.zip) nên đành up qua trang mediafire vậy. Mong mọi người thông cảm.
    help.rar (help.rar)
    Attached Files

  • #2
    mọi người có xem qua thì up giúp e với ạ @@!
    Em cảm ơn và hậu tạ sau ạ

    Comment


    • #3
      k ai giúp e ạ, hay tại câu hỏi dễ quá T___T

      Comment


      • #4
        Nguyên văn bởi lovezero Xem bài viết
        Chào mọi người trong 4room.
        Em có 1 vài câu hỏi mong mọi người giúp đỡ
        Hiện em đang cần hiển thị tín hiệu điện áp từ môt mạch khuếch đại âm thanh (tín hiệu trước loa) lên máy tính để vẽ đồ thị và thực hiện xử lý.
        Cụ thể tín hiệu em cần lấy lên là 1 tín hiệu có dạng như hình bên dưới (đo được = osilo ) có điện áp mã= 1,5 V
        Phương án truyền dữ liệu mà em nghĩ ngay đến là dùng VXL cụ thể là PIC16f877a đọc giá trị ADC gửi lên máy tính thông qua RS232. Nhưng vấn đề ở đây là code VXL em viết không đọc được đúng điện áp. Cụ thể là trong mô phỏng em lấy tín hiệu vào là 1 V thì VXL đọc ra và hiển thị LCD chỉ có 0,2 - 0,5 V.
        Khi cho vào mạch thực tế thì giá trị bị nhảy giữa 0 V và 5 V.
        Em chẳng biết nên làm gì nữa mong mọi người chỉ giáo.

        Và em cắm dây trực tiếp từ tín hiệu trước loa vào chân AN0 (ADC) được k ạ?
        Cảm ơn mọi người rất nhiều.
        Chúc mọi người dịp nghỉ lễ vui vẻ.

        PS: e up mãi file mô phỏng với chương trình mà k được (.zip) nên đành up qua trang mediafire vậy. Mong mọi người thông cảm.
        help.rar (help.rar)
        Đọc điện áp :
        1) xem cái adc đó là bao nhiêu bít ( VD 8 bit ( tương ứng 256 giá trị) , 10 bit (tương đương 1024 giá trị ))
        2) xem điện áp ref ( VD 5V ==> 8 bit sẽ có 5/256 = 0,0195V 1 giá trị , 10 bit : 5/1024 = 0,00488V một giá trị )
        - nếu sử dụng điện áp ref 2,56V với ADC 8 bit sẽ có 2,56/256 = 0,01V một giá trị )
        3) Đọc ADC lấy giá trị ADC
        4) VD với ADC 8 bit : Điện áp = giá trị ADC * 0,01

        ------------ Cứ như vậy mà làm

        // Đọc tín hiệu analog ( âm thanh ) thì tần số lấy mẫu ADC phải lớn , xử lý phải nhanh hơn cái tần số âm thanh ... thì mới đọc được chính xác và liên tục.
        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


        • #5
          Nguyên văn bởi queduong Xem bài viết
          Đọc điện áp :
          1) xem cái adc đó là bao nhiêu bít ( VD 8 bit ( tương ứng 256 giá trị) , 10 bit (tương đương 1024 giá trị ))
          2) xem điện áp ref ( VD 5V ==> 8 bit sẽ có 5/256 = 0,0195V 1 giá trị , 10 bit : 5/1024 = 0,00488V một giá trị )
          - nếu sử dụng điện áp ref 2,56V với ADC 8 bit sẽ có 2,56/256 = 0,01V một giá trị )
          3) Đọc ADC lấy giá trị ADC
          4) VD với ADC 8 bit : Điện áp = giá trị ADC * 0,01

          ------------ Cứ như vậy mà làm

          // Đọc tín hiệu analog ( âm thanh ) thì tần số lấy mẫu ADC phải lớn , xử lý phải nhanh hơn cái tần số âm thanh ... thì mới đọc được chính xác và liên tục.
          Cảm ơn mod queduong, em như nắng hạn gặp mưa đấy ạ
          Em đang làm đề tài phân tích tín hiệu siêu âm doppler bằng máy tính kết quả hiển thị lên máy tính chả đúng j cả
          Em xin trả lời mode queduong:
          1/ em dùng adc 10 bit để tăng độ chính xác
          2/ Vref e lấy bằng Vdd= 5V
          3/ điện áp em gửi ra máy tính và LCD tính theo mV
          4/ thời gian lấy mẫu tối thiểu của PIC là 2-6 us so với f_tinhieu lấy trước loa của e (16-20khz ~ 50u-0.0625s) là nhỏ hơn nên em nghĩ là nó đọc ok
          Đây là code của em
          Code:
          #include <16f877a.h>
          #device adc=10
          #fuses nowdt,hs,noput
          #use delay(clock=20M)
          #include <lcd_lib_4bitab.c>
          #use rs232(baud=9600,xmit=PIN_C6, rcv=PIN_C7, parity=N)
          
          unsigned int16 nghin, tram, chuc, donvi, adc;
          float value;
          void hienthi(unsigned int16 giatri)
                   {
                    nghin=giatri/1000;
                    tram=(giatri-nghin*1000)/100;
                    chuc=(giatri-nghin*1000-tram*100)/10;
                    donvi=giatri%10;
                    lcd_putchar(nghin+48);
                    lcd_putchar(tram+48);
                    lcd_putchar(chuc+48);
                    lcd_putchar(donvi+48);
                   }
          void doc_adc(void)
                   {
                    set_adc_channel(0);
                    delay_us(10);
                    value=read_adc();
                    adc=(value*5000)/1023;
                   }
          void main()
          {
             set_tris_a(0x01);
             set_tris_d(0x00);
             lcd_init();
             setup_adc_ports(all_analog);
             setup_adc(adc_clock_internal);
             while(true)
             {
                doc_adc();
                lcd_putcmd(0x80);
                lcd_putchar("dienap: ");
                hienthi(adc);
                lcd_putchar(" mV");
                printf("dien ap: %Lu mV\n\r",adc);
                delay_ms(500);
             }
          }
          Phần code em như thế này đã ổn chưa ạ?
          Em còn phân vân là điện áp đầu vào của adc.
          Đây là tín hiệu hình ảnh em đo được ở trước loa áng chừng là 1,5 V (nhưng có đoạn nó nhảy lên @@! )còn tần số em lại quên mất k xem cái nút time/div
          https://plus.google.com/photos/11343...722?banner=pwa

          https://plus.google.com/photos/11343...962?banner=pwa

          - với code kia thì chỉ đọc được mỗi giá trị dương thôi ạ?
          -Với loại tín hiệu dạng thế này em có cắm trực tiếp vào chân ADC được k ạ? em cũng đã thử mắc thêm 1 con dioe để tách lấy điện áp dương
          kết quả trên terminal đo được em có so sánh với 2 trường hợp: mắc và không mắt diode 1n4007 như sau
          https://plus.google.com/photos/11343...290?banner=pwa
          Em không biết hướng làm thế đã đúng chưa?
          Mong các tiền bối chỉ giáo.
          Em cảm ơn nhiều ạ.
          Chúc cả nhà dientuvietnam ngày mới nhiều vui vẻ và thành công

          Comment


          • #6
            [QUOTE=lovezero;709360]
            #include <16f877a.h>
            #device adc=10
            #fuses nowdt,hs,noput
            #use delay(clock=20M)
            #include <lcd_lib_4bitab.c>
            #use rs232(baud=9600,xmit=PIN_C6, rcv=PIN_C7, parity=N)

            unsigned int16 nghin, tram, chuc, donvi, adc;
            float value;
            void hienthi(unsigned int16 giatri)
            {
            nghin=giatri/1000;
            tram=(giatri-nghin*1000)/100;
            chuc=(giatri-nghin*1000-tram*100)/10;
            donvi=giatri%10;
            lcd_putchar(nghin+48);
            lcd_putchar(tram+48);
            lcd_putchar(chuc+48);
            lcd_putchar(donvi+48);
            }

            void doc_adc(void)
            {
            set_adc_channel(0);
            delay_us(10);
            value=read_adc();
            adc=(value*5000)/1023; // 0 ---> 1023 = 1024 !
            }
            void main()
            {
            set_tris_a(0x01);
            set_tris_d(0x00);
            lcd_init();
            setup_adc_ports(all_analog);
            setup_adc(adc_clock_internal);
            while(true)
            {
            doc_adc();
            lcd_putcmd(0x80);
            lcd_putchar("dienap: ");
            hienthi(adc);
            lcd_putchar(" mV");
            printf("dien ap: %Lu mV\n\r",adc);
            delay_ms(500);

            }
            }

            tín hiệu thì biến thiên theo thời gian thực .... Riêng mấy cái chỗ Đỏ Đỏ kia của cậu nó đã nuốt hết bao nhiêu thời gian rồi ,

            delay_ms(500); trong lúc thực hiện cái này thì tín hiệu có khi đã bị trôi mất ... do quá trễ

            - Tại 1 thời điểm tức thời , ADC chỉ đọc được duy nhất 1 giá trị... khi muốn vẽ đồ thị, dạng xung ... thì ADC phải đọc liên tục ( tổng thời gian đọc ADC , thời gian hiển thị , thời gian xử lý .v..v ) phải nhỏ hơn thời gian của xung ( tức là lấy mẫu phải lớn hơn rất nhiều lần ... đọc liên tục, liên tục , các giá trị để tập hợp thành " biểu đồ , đồ thị " ).
            Đó là xử lý theo thời gian thực.

            --- Một phương pháp khác như các Oscilloscope hay dùng ... đọc ADC tốc độ cao ... lưu các kết quả vào RAM ... lấy dữ liệu từ RAM ra hiển thị dần dần lên màn hình.

            ( nói cách khác RAM, bộ nhớ đệm ... làm nhiệm vụ " dịch chuyển chậm " dần dần để phù hợp với tốc độ xử lý, hiển thị.

            --- Để hiển thị được đồ thị cái bài trên ( khi tốc độ tín hiệu cao , tốc độ lấy mẫu cao ), tốc độ hiển thị lại chậm

            Bạn nên dùng bộ đệm ( RAM ) hoặc bộ đệm của MCU ( ví dụ tạo 1 mảng 1000 bytes - tức là ta có 1000 điểm ) ... đọc hết 1000 điểm đó ... Rồi hiển thị LCD , nối các điểm với nhau ta sẽ có Hình dạng sóng thôi.
            Số điểm càng nhiều thì dạng sóng càng mịn và chính xác ... lúc đó lại yêu cầu ADC có tốc độ đọc cao.

            --- để hiển thị 1 dạng sóng ... quan trọng nhất là tối ưu thời gian để tăng tốc độ , số lần đọc ADC . Để tối ưu thời gian thì ngoài linh kiện ( MCU ) tốc độ cao , ADC tốc độ cao ... lại có giải thuật, cách sắp xếp hợp lý ... thì nó mới RA được.

            Bài của bạn như trên ... thì ... chắc chỉ đo điện áp DC thôi chứ đo tín hiệu BIẾN THIÊN thì không sài nổi ( vì tất cả các nguyên tắc cơ bản bạn đều không có ( tốc độ, bộ đệm , tối ưu thời gian .v..v ).
            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


            • #7
              [QUOTE=queduong;709372]
              Nguyên văn bởi lovezero Xem bài viết
              #include <16f877a.h>
              #device adc=10
              #fuses nowdt,hs,noput
              #use delay(clock=20M)
              #include <lcd_lib_4bitab.c>
              #use rs232(baud=9600,xmit=PIN_C6, rcv=PIN_C7, parity=N)

              unsigned int16 nghin, tram, chuc, donvi, adc;
              float value;
              void hienthi(unsigned int16 giatri)
              {
              nghin=giatri/1000;
              tram=(giatri-nghin*1000)/100;
              chuc=(giatri-nghin*1000-tram*100)/10;
              donvi=giatri%10;
              lcd_putchar(nghin+48);
              lcd_putchar(tram+48);
              lcd_putchar(chuc+48);
              lcd_putchar(donvi+48);
              }

              void doc_adc(void)
              {
              set_adc_channel(0);
              delay_us(10);
              value=read_adc();
              adc=(value*5000)/1023; // 0 ---> 1023 = 1024 !
              }
              void main()
              {
              set_tris_a(0x01);
              set_tris_d(0x00);
              lcd_init();
              setup_adc_ports(all_analog);
              setup_adc(adc_clock_internal);
              while(true)
              {
              doc_adc();
              lcd_putcmd(0x80);
              lcd_putchar("dienap: ");
              hienthi(adc);
              lcd_putchar(" mV");
              printf("dien ap: %Lu mV\n\r",adc);
              delay_ms(500);

              }
              }

              tín hiệu thì biến thiên theo thời gian thực .... Riêng mấy cái chỗ Đỏ Đỏ kia của cậu nó đã nuốt hết bao nhiêu thời gian rồi ,

              delay_ms(500); trong lúc thực hiện cái này thì tín hiệu có khi đã bị trôi mất ... do quá trễ

              - Tại 1 thời điểm tức thời , ADC chỉ đọc được duy nhất 1 giá trị... khi muốn vẽ đồ thị, dạng xung ... thì ADC phải đọc liên tục ( tổng thời gian đọc ADC , thời gian hiển thị , thời gian xử lý .v..v ) phải nhỏ hơn thời gian của xung ( tức là lấy mẫu phải lớn hơn rất nhiều lần ... đọc liên tục, liên tục , các giá trị để tập hợp thành " biểu đồ , đồ thị " ).
              Đó là xử lý theo thời gian thực.

              --- Một phương pháp khác như các Oscilloscope hay dùng ... đọc ADC tốc độ cao ... lưu các kết quả vào RAM ... lấy dữ liệu từ RAM ra hiển thị dần dần lên màn hình.

              ( nói cách khác RAM, bộ nhớ đệm ... làm nhiệm vụ " dịch chuyển chậm " dần dần để phù hợp với tốc độ xử lý, hiển thị.

              --- Để hiển thị được đồ thị cái bài trên ( khi tốc độ tín hiệu cao , tốc độ lấy mẫu cao ), tốc độ hiển thị lại chậm

              Bạn nên dùng bộ đệm ( RAM ) hoặc bộ đệm của MCU ( ví dụ tạo 1 mảng 1000 bytes - tức là ta có 1000 điểm ) ... đọc hết 1000 điểm đó ... Rồi hiển thị LCD , nối các điểm với nhau ta sẽ có Hình dạng sóng thôi.
              Số điểm càng nhiều thì dạng sóng càng mịn và chính xác ... lúc đó lại yêu cầu ADC có tốc độ đọc cao.

              --- để hiển thị 1 dạng sóng ... quan trọng nhất là tối ưu thời gian để tăng tốc độ , số lần đọc ADC . Để tối ưu thời gian thì ngoài linh kiện ( MCU ) tốc độ cao , ADC tốc độ cao ... lại có giải thuật, cách sắp xếp hợp lý ... thì nó mới RA được.

              Bài của bạn như trên ... thì ... chắc chỉ đo điện áp DC thôi chứ đo tín hiệu BIẾN THIÊN thì không sài nổi ( vì tất cả các nguyên tắc cơ bản bạn đều không có ( tốc độ, bộ đệm , tối ưu thời gian .v..v ).
              Cảm ơn mod queduong.
              Thàm nào em thấy tín hiệu chả đúng tẹo nào
              @@! giờ em vẫn muốn dùng PIC để đọc thì có cách nào khắc phục không ạ? cái trường hợp dùng bộ đệm RAM thì dùng như thế nào ạ?
              Em học kém vi xử lý lắm ạ, mong anh chỉ dạy

              Comment


              • #8
                [QUOTE=lovezero;709384]
                Nguyên văn bởi queduong Xem bài viết

                Cảm ơn mod queduong.
                Thàm nào em thấy tín hiệu chả đúng tẹo nào
                @@! giờ em vẫn muốn dùng PIC để đọc thì có cách nào khắc phục không ạ? cái trường hợp dùng bộ đệm RAM thì dùng như thế nào ạ?
                Em học kém vi xử lý lắm ạ, mong anh chỉ dạy
                bạn thử đọc tốc độ ADC cao nhất ( max ).
                làm 1 mảng lưu trữ giá trị ADC VD ( 1024 bytes )

                for ( i = 0 ; i<1024; i++)
                {
                Read_ADC( buff[i]);
                }

                Hiển thị lên LCD .... ( hiển thị từng điểm , nối các điểm đó với nhau ) ở trên có 1024 giá trị


                --- cách với RAM tương tự ( bạn phải viết chương trình , điều khiển giao tiếp RAM ngoài )

                VD : RAM có thể chứa được 10000 bytes ... đọc ADC ... lưu vào RAM ( tốc độ lưu vào RAM rất nhanh nên khỏi lo )

                - hiển thị ... lại lôi ở trong ram ra và hiển thị dần dầ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


                • #9
                  [QUOTE=queduong;709389]
                  Nguyên văn bởi lovezero Xem bài viết

                  bạn thử đọc tốc độ ADC cao nhất ( max ).
                  làm 1 mảng lưu trữ giá trị ADC VD ( 1024 bytes )

                  for ( i = 0 ; i<1024; i++)
                  {
                  Read_ADC( buff[i]);
                  }

                  Hiển thị lên LCD .... ( hiển thị từng điểm , nối các điểm đó với nhau ) ở trên có 1024 giá trị


                  --- cách với RAM tương tự ( bạn phải viết chương trình , điều khiển giao tiếp RAM ngoài )

                  VD : RAM có thể chứa được 10000 bytes ... đọc ADC ... lưu vào RAM ( tốc độ lưu vào RAM rất nhanh nên khỏi lo )

                  - hiển thị ... lại lôi ở trong ram ra và hiển thị dần dần.
                  Em đang thử vất hết mấy cái hiển thị LCD để xem tốc độ thế nào.
                  Giao tiếp RAM ngoài nghĩa là em cần mua thêm 1 con Ram rồi kết nối với nó qua port của PIC ạ? Nếu là mua Ram ngoài thì em nên chọn con nào ạ?
                  Sao k dùng được bộ nhớ của PIC ạ?
                  Cảm ơn mod queduong đã rất nhiệt tình chỉ bảo

                  Comment


                  • #10
                    [QUOTE=lovezero;709407]
                    Nguyên văn bởi queduong Xem bài viết

                    Em đang thử vất hết mấy cái hiển thị LCD để xem tốc độ thế nào.
                    Giao tiếp RAM ngoài nghĩa là em cần mua thêm 1 con Ram rồi kết nối với nó qua port của PIC ạ? Nếu là mua Ram ngoài thì em nên chọn con nào ạ?
                    Sao k dùng được bộ nhớ của PIC ạ?
                    Cảm ơn mod queduong đã rất nhiệt tình chỉ bảo
                    Đúng vậy , giao tiếp ram để bạn lấy Bộ nhớ lưu trữ , ngoài ra tốc độ truy cập của RAM rất nhanh.
                    Nếu dùng bộ nhớ của PIC để lưu ( đệm ) ... thì lấy đâu ra bộ nhớ mà viết chương trình ( mà truy xuất lại chậm )

                    --- Ram ngoài thực sự hiệu quả khi có hệ thống clock , đọc ADC riêng bên ngoài ... khi kích hoạt giá trị sẽ tự động ... lưu vào các địa chỉ RAM ... MCU sẽ đọc từng địa chỉ , hiển thị.

                    --- Nếu sử dụng RAM ngoài ... vẫn dùng MCU để đọc ADC, xử lý tín hiệu đưa vào ram ... thì hiệu quả cũng không được cao lắm ( nhưng tận dụng được bộ nhớ RAM , tốc độ RAM )
                    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


                    • #11
                      [QUOTE=queduong;709420]
                      Nguyên văn bởi lovezero Xem bài viết

                      Đúng vậy , giao tiếp ram để bạn lấy Bộ nhớ lưu trữ , ngoài ra tốc độ truy cập của RAM rất nhanh.
                      Nếu dùng bộ nhớ của PIC để lưu ( đệm ) ... thì lấy đâu ra bộ nhớ mà viết chương trình ( mà truy xuất lại chậm )

                      --- Ram ngoài thực sự hiệu quả khi có hệ thống clock , đọc ADC riêng bên ngoài ... khi kích hoạt giá trị sẽ tự động ... lưu vào các địa chỉ RAM ... MCU sẽ đọc từng địa chỉ , hiển thị.

                      --- Nếu sử dụng RAM ngoài ... vẫn dùng MCU để đọc ADC, xử lý tín hiệu đưa vào ram ... thì hiệu quả cũng không được cao lắm ( nhưng tận dụng được bộ nhớ RAM , tốc độ RAM )
                      Em vừa mới hỏi được 1 bác nước ngoài, bác ấy bảo là PIC 8 bit dù có dùng Ram ngoài cũng đáp ứng được thời gian thực thay vào đó nên sử dụng PIC khác ví dụ DsPIC.
                      em còn 2 ngày trước khi báo cáo @@! Có khi em bảo vệ 'chay'

                      Comment

                      Về tác giả

                      Collapse

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

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

                      Collapse

                      Đang tải...
                      X