Thông báo

Collapse
No announcement yet.

Cách xử lý áp trước khi đưa về chân adc0 của atmega 16

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

  • #16
    Nguyên văn bởi hoacucvang Xem bài viết
    Với hệ thống công nghiệp cần độ chính xác cao thì người ta không sử dụng tín hiệu ra analog bằng ADC nữa mà dùng dạng số 01100000............ . Đơn cử như con DS1820 .NHIỆT ĐỘ ĐO ĐƯỢC LÀ -55 tới 128 ĐỘ.ĐỘ CHÍNH XÁC TUYỆT ĐỐI (0.001 ĐỘ).

    Còn nếu đòi hỏi chịu nhiệt độ cao hơn thì cũng có thôi mà .
    Bạn nên tìm hiểu ý nghĩa của chữ resolution và chữ accuracy.
    Độ phân giải KHÔNG đồng nghĩa với độ chính xác.

    Bạn có biết các tiêu chuẩn về nhiệt độ làm việc của linh kiện bán dẫn không:
    - Dân dụng: 0C đến 70C
    - Công nghiệp: -55C đến 85C
    - Y tế và quân đội: -55 đến 125C
    Con IC DS1820, cũng là 1 linh kiện bán dẫn, chỉ là bên trong có thêm nhiệt trở để đo nhiệt độ . Thì nhiệt độ nó đo chính là nhiệt độ môi trường làm việc của nó. Khi tôi nghe bạn nói nó có thể đo tới 128C thì lấy làm lạ và xem datasheet của nó. Đúng theo như tôi đoán, datasheet nói nhiệt độ đo tối đa là 125C. Nếu muốn đo nhiệt độ cao hơn 125C thì không thể dùng những con IC loại này mà phải dùng cảm biến bên ngoài như nhiệt trở chẳng hạn.

    Nói đến độ phân giải, resolution, thì là 9-bit tức là (55+125)/512 = 0.35C. Nghĩa là nó có thể đo cho bạn những số liệu như -55, -54.65, -54.30, ...

    Còn độ chính xác, accuracy, là +-0.5C. Thí dụ như nó đọc là 10.35 thì nhiệt độ thực sự có thể là 9.85 hoặc 10.85

    Cám ơn đã tìm dùm con IC này.
    Electronic Engineers do everything with less resistance.

    Comment


    • #17
      Sorry , con đó mình copy trên web thấy 1 ông nào đó bàn luận về con này . AI ngờ trình độ tiếng Anh của ổng dở tệ luôn .
      Dù sao ứng dụng của nó xuất ra dạng digital cũng khá hay , không phụ thuộc nhiều vào điện áp chuẩn như ADC .

      Comment


      • #18
        Cám ơn bạn nhiều.Mình sẽ thử xem sao.

        Comment


        • #19
          sensor của minh la Thermo couple,còn LM35 để bù nhiệt môi trường thôi.opam thì mình dùng OP07 vì có offset thấp.Mình lấy nhiệt độ của nước về để điều khiển theo thuật toán PID nên cần phải có độ chính xác cao.nhưng vì nhiệt độ đọc về cứ dao động quá nên khó điều khiển.Mong các bạn chỉ giáo thêm.

          Comment


          • #20
            Nguyên văn bởi gaigu Xem bài viết
            sensor của minh la Thermo couple,còn LM35 để bù nhiệt môi trường thôi.opam thì mình dùng OP07 vì có offset thấp.Mình lấy nhiệt độ của nước về để điều khiển theo thuật toán PID nên cần phải có độ chính xác cao.nhưng vì nhiệt độ đọc về cứ dao động quá nên khó điều khiển.Mong các bạn chỉ giáo thêm.
            Theo mình bạn ko nên cho tụ nối song song với trở ở đầu vào của ADC, như thế thì chúng lại là một mạch dao động. Bạn cứ nối thẳng vào ADC. Lọc nguồn bạn nên lọc 1000u, 100u, 104.(kinh nghiệm của mình thôi) Trong chương trình chính bạn làm một phép toán trung bình, ví dụ:
            //============================================
            unsigned int temp, adc_data;
            for(i=1;i<=50;i++)
            {
            ADMUX=0x40; //chanel 0
            ADCSRA=0xEF;
            while(!ADCSRA.4);
            ADCSRA=0;
            temp=(temp+ADCW)/2;
            }
            // giả sử bị nhiễu trong vùng (data-1,data+1) thì ta bỏ qua vùng này
            if((temp>=adc_data+2)||(temp<=adc_data-2)) adc_data=temp;
            //============================================

            nếu bạn dùng ngắt thì đếm số lần ngắt, sau N lần ngắt ta mới lấy dữ liệu trung bình.

            Bạn thử nhé, chúc bạn thành công!!!

            Comment


            • #21
              Nguyên văn bởi gaigu Xem bài viết
              sensor của minh la Thermo couple,còn LM35 để bù nhiệt môi trường thôi.opam thì mình dùng OP07 vì có offset thấp.Mình lấy nhiệt độ của nước về để điều khiển theo thuật toán PID nên cần phải có độ chính xác cao.nhưng vì nhiệt độ đọc về cứ dao động quá nên khó điều khiển.Mong các bạn chỉ giáo thêm.
              Nếu bạn dùng opamp the kiểu differential thì tốt, còn kiểu single-ended (1 chân của thermocouple nối xuống gnd) thì không tốt.

              Kiểu gì thì cũng nên để 1 con tụ nhỏ khoảng 0.1uF ngang 2 đầu của thermocouple.
              Electronic Engineers do everything with less resistance.

              Comment


              • #22
                Mình nối theo kiểu thứ 2, nhưng có tụ 10uf giữa 2 đầu rồi.Chắc có lẽ cách nhanh nhất là chia trung binh thôi.

                Comment


                • #23
                  Nguyên văn bởi lucas Xem bài viết
                  Bạn có dùng AGND không? Đừng nối AGND (Analog GrouND) chung với GND.
                  Bạn Lucas ơi, nói vậy tức là AGND, AVCC, AREF và nguồn cung cho cảm biến k xài chung với vdk à ?

                  Đọc Hardware consideration appnote của Atmel nó nói AGND và DGND "should be separated" và 2 thằng này chỉ "connected at one point" mà k hiểu lắm.. separated khác với isolated ?

                  Mong các bạn giải thích rõ hơn giúp. Phải xong cái nhiễu này thì mới tính đến chuyện lập trình chứ..

                  Comment


                  • #24
                    Nguyên văn bởi thechinhcdt Xem bài viết
                    Bạn Lucas ơi, nói vậy tức là AGND, AVCC, AREF và nguồn cung cho cảm biến k xài chung với vdk à ?

                    Đọc Hardware consideration appnote của Atmel nó nói AGND và DGND "should be separated" và 2 thằng này chỉ "connected at one point" mà k hiểu lắm.. separated khác với isolated ?

                    Mong các bạn giải thích rõ hơn giúp. Phải xong cái nhiễu này thì mới tính đến chuyện lập trình chứ..
                    Nhiều khi bạn làm mạch khuyết đại tín hiệu nhỏ như thermocouple thì mạch khuyết đại kén nguồn lắm. Độ nhấp nhô (ripple) thường phải rất thấp, vài mV (bạn có thể đo ripple bằng cách để đồng hồ đo về mV AC rồi đo ngang nguồn DC) . Trong khi đó mạch digital như vđk thì không kén nguồn, ripple có thể lên cả chục mV mà vẫn không sao.

                    Nếu bạn dùng 8-bit ADC thì ít khi gặp rắc rối này, nhưng 10-bit trở lên thì sẽ thấy. Thí dụ như sau phần opamp khuyết đại, tín hiệu tối đa là 5V, độ phân giải, resolution, sẽ là 5V/256 = 19.5mV. Trong khi đó, nếu dùng 10-bit ADC thì độ phân giải sẽ là 5V/1024 = 4.9mV.

                    Bạn đọc được Application Note là rất tốt. Nó nói AGND and DGND should be seperated. Thì giống như tôi đã giải thích trong post trên: các chân GND từ AGND của vđk đến phần cảm biến phải nối chung với nhau, không nối với chân DGND của vđk. Nhưng cái khó hiểu là nó nói 2 thằng đó phải connect at 1 point. Điểm connect đó phải là tại nguồn vào. Không được nối "masse" của nguồn vào phần digital rồi lấy "masse" của phần digital nối vào "masse" của analog ở chỗ nào đó (thí dụ như rẽ 1 đường từ chân GND của 1 con 74xx nào đó nối vào AGND)

                    Nếu bạn có ráp ampli thì cũng có 1 điểm nối masse chung với mục đích tránh ù nhiễu.

                    Một số tài liệu gọi điểm nối masse chung này là "Mecca point". Mecca là thánh địa của Hồi Giáo, mọi tín đồ về đó.
                    Electronic Engineers do everything with less resistance.

                    Comment


                    • #25
                      bac nao co the giup em cai cách chia trung bình nhiệt độ dc không, em làm mà chẳng dc mới vào nghề nên trình dịch còn kém quá em gủi code các bác xem thêm cho em xem chạy có dc ko,tình trạng của em giống hệt bác gaigu ấy khác cái em dùng con atmegal 32 thi nó ko khác nhiều so với 16- em hiển thị nhiệt độ trên 2 ld 7 thanh
                      ************************************************** ***/

                      #include <mega32.h>
                      #include<delay.h>

                      //-----dat ten cac chan cua LED cho cong C---------
                      #define a1 PORTC.0 //dat ten PORTC.0 la a1, de su dung a1 thay cho PORTC.0
                      #define b1 PORTC.1
                      #define c1 PORTC.2
                      #define d1 PORTC.3
                      #define e1 PORTC.4
                      #define f1 PORTC.5
                      #define g1 PORTC.6
                      //--------------------------------------------------

                      //----dat ten cac chan cua LED 2 cho cong B va d
                      #define a2 PORTB.0
                      #define b2 PORTB.1
                      #define c2 PORTB.2
                      #define d2 PORTB.3
                      #define e2 PORTB.4
                      #define f2 PORTD.5
                      #define g2 PORTD.6

                      char b;
                      // Declare your global variables here
                      void HamHienThiLed1(char a);
                      void HamHienThiLed2(char a);
                      void main(void)
                      {
                      char so; //bien nay chay tu 0 den 99
                      char chuc,donvi; //de hien thi hang chuc va don vi cua so
                      DDRC.0=1; DDRC.1=1; DDRC.2=1; DDRC.3=1; DDRC.4=1; DDRC.5=1; DDRC.6=1;
                      DDRB.0 =1; DDRB.1 =1;DDRB.2 =1;DDRB.3 =1;DDRB.4 =1;
                      DDRD.6 =1;
                      DDRD.5 =1;
                      so = 0;
                      chuc =0;
                      donvi =0;
                      while (1)
                      {

                      chuc = so/10; //lay phan nguyen cua so/10;
                      donvi = so%10; //lay phan du cua so chia cho 10;
                      HamHienThiLed1(donvi);
                      HamHienThiLed2(chuc);
                      so = so+1;
                      delay_ms(1500);
                      if (so == 100) so =0;
                      /*
                      HamHienThiLed1(b);
                      b= b+1;
                      if (b==10) b=0;
                      delay_ms(3000); */


                      }
                      }
                      void HamHienThiLed1(char a)
                      { //ham hien thi led1 duoc ket noi voi cong C, khi cho mot gia chi a chay tu 0 den 9
                      switch (a)
                      {
                      case 0:
                      a1=0; b1=0; c1=0; d1=0; e1=0; f1=0; g1=1; break;
                      case 1:
                      a1=1; b1=0; c1=0; d1=1; e1=1; f1=1; g1=1; break;
                      case 2:
                      a1=0; b1=0; c1=1; d1=0; e1=0; f1=1; g1=0; break;
                      case 3:
                      a1=0; b1=0; c1=0; d1=0; e1=1; f1=1; g1=0; break;
                      case 4:
                      a1=1; b1=0; c1=0; d1=1; e1=1; f1=0; g1=0; break;
                      case 5:
                      a1=0; b1=1; c1=0; d1=0; e1=1; f1=0; g1=0; break;
                      case 6:
                      a1=0; b1=1; c1=0; d1=0; e1=0; f1=0; g1=0; break;
                      case 7:
                      a1=0; b1=0; c1=0; d1=1; e1=1; f1=1; g1=1; break;
                      case 8:
                      a1=0; b1=0; c1=0; d1=0; e1=0; f1=0; g1=0; break;
                      case 9:
                      a1=0; b1=0; c1=0; d1=0; e1=1; f1=0; g1=0; break;
                      }
                      }

                      void HamHienThiLed2(char a)
                      { //ham hien thi led1 duoc ket noi voi cong C, khi cho mot gia chi a chay tu 0 den 9
                      //ham nay danh cho den Led 7 thanh co chung 5V
                      switch (a)
                      {
                      case 0:
                      a2=0; b2=0; c2=0; d2=0; e2=0; f2=0; g2=1; break;
                      case 1:
                      a2=1; b2=0; c2=0; d2=1; e2=1; f2=1; g2=1; break;
                      case 2:
                      a2=0; b2=0; c2=1; d2=0; e2=0; f2=1; g2=0; break;
                      case 3:
                      a2=0; b2=0; c2=0; d2=0; e2=1; f2=1; g2=0; break;
                      case 4:
                      a2=1; b2=0; c2=0; d2=1; e2=1; f2=0; g2=0; break;
                      case 5:
                      a2=0; b2=1; c2=0; d2=0; e2=1; f2=0; g2=0; break;
                      case 6:
                      a2=0; b2=1; c2=0; d2=0; e2=0; f2=0; g2=0; break;
                      case 7:
                      a2=0; b2=0; c2=0; d2=1; e2=1; f2=1; g2=1; break;
                      case 8:
                      a2=0; b2=0; c2=0; d2=0; e2=0; f2=0; g2=0; break;
                      case 9:
                      a2=0; b2=0; c2=0; d2=0; e2=1; f2=0; g2=0; break;
                      }
                      }
                      |

                      Comment


                      • #26
                        Các anh có thể giúp e phân biệt mấy cái khái niệm Earth Ground, Source Ground (zero volt), Digital Ground, Analog Ground, và Signal Ground được không ạ?. Thanks.
                        Last edited by pdsu; 23-08-2012, 21:19.

                        Comment

                        Về tác giả

                        Collapse

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

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

                        Collapse

                        Đang tải...
                        X