Thông báo

Collapse
No announcement yet.

Chống nhiễu cho ADC

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

  • Chống nhiễu cho ADC

    Em đang làm với con ATmega16.con này có 8 đầu vào ADC0-ADC7.Giả sử e cần đọc đầu vào từ kênh ADC0 e kết nối phần cứng như sau:
    -chân AVCC và chân Vref e treo lên 5v(lấy từ nguồn máy tính)
    -chân ADC0 e đọc điện áp đầu vào từ chân Vin(đc nối với 1 biến trở 2,2k để thay đồi điện áp Vin)
    -ADC sử dụng chế độ 10bit
    -hiển thì kết quả lên LCD
    Kết quả:-khi e để Vin=5v => đọc đc là 1023
    -khi để Vin=0v =>đọc đc giá trị khác 0(nó khoảng 10-18 ko ổn định)
    -khi xoay biến trở thì giá trị đọc về thay đổi rất chậm
    Em thử chuyển sang đọc ở 1 kênh khác giả sử ADC1 thì nó vẫn cho kết quả(giá trị đọc đc nhảy linh tinh).mặc dù e ko đưa điện áp đầu vào cho kênh này???chỗ này thấy hơi củ chuối.
    Mong các cao thủ giúp tại hạ.

  • #2
    nguồn cho áp ref và nguồn AVCC cũng phải chuẩn, thường dùng tl431 để làm áp REF.

    b/r

    Comment


    • #3
      Chân Vref treo lên nguồn 5V còn chân Avcc bạn nối qua một con tụ rồi nối xuống mass là ngon lành mà. Mình thấy mọi người cũng đều làm thế.
      Muốn tăng tốc độ đọc từ ADC thì bạn tăng ADC clock fequency lên thôi.

      Comment


      • #4
        Để tránh nhiễu nên dùng điện áp tham chiếu 2.56V nội. Khi đó chân Vref chỉ cần nối qua tụ 100nF xuống GND. Nếu đầu vào ADC có điện áp lớn hơn 2.56V thì dùng cầu trở để cân chỉnh cho phù hợp là được.

        Comment


        • #5
          Nguyên văn bởi hungnp Xem bài viết
          Để tránh nhiễu nên dùng điện áp tham chiếu 2.56V nội. Khi đó chân Vref chỉ cần nối qua tụ 100nF xuống GND. Nếu đầu vào ADC có điện áp lớn hơn 2.56V thì dùng cầu trở để cân chỉnh cho phù hợp là được.
          Bạn có thể nói rõ hơn được không như với bài của bạn luong_k45 thì nên nối như thế nào thì được

          Comment


          • #6
            nói như bác hungnp em thấy ko ổn rồi, khi đo thì điện áp đầu vào nó cần thay đổi trong dải 0-5v mà .ứng với mỗi mức điện áp như bác nói thì có cách nối khác nhau thì e dùng làm sao đc.Mà chân Avcc thì phải treo lên 5v chứ?nối mass ko đc.E thấy các bác bảo 1 là dùng nguồn riêng cho ADC,hoặc dùng con tl431 thì ổn hơn.cũng có thể nối thêm cuộn cảm ở chân Vref......mấy cách này e chưa thử ko biết thế nào.Xin các bác cho ý kiến.

            Comment


            • #7
              Được mà, đầu vào bác có thây đổi từ 0 đến 10V, áp ref của bác dùng 2,5V thì bác làm cái câu phân áp chia xuống 4 lần là xong ah

              b/r

              Comment


              • #8
                Nguyên văn bởi hungnp Xem bài viết
                Để tránh nhiễu nên dùng điện áp tham chiếu 2.56V nội. Khi đó chân Vref chỉ cần nối qua tụ 100nF xuống GND. Nếu đầu vào ADC có điện áp lớn hơn 2.56V thì dùng cầu trở để cân chỉnh cho phù hợp là được.
                Để sử dụng điện áp tham chiếu 2,56V nội thì trong codeWizard chỉ cần setting thế này là được đúng không ạ các bạn xin chỉ giáo.
                Attached Files
                Last edited by dodanh; 13-04-2009, 00:05.

                Comment


                • #9
                  Ngoài việc chống nhiễu bằng phần cứng nếu vẫn ko giải quyết được như mong muốn thi bạn co thể lọc nhiễu bằng phần mềm, vi dụ như lấy giá trị trung bình của n sample, hoac dùng phương pháp lọc số. Lưu ý là các phương pháp mềm đều gây ra trễ hệ thống, bạn sẽ hiệu chĩnh các thông số sao cho tối ưu nhất.
                  *1 ví dụ đơn giản: adc_val[n]=adc_val[n]+ a0(adc_val[n]-adc_val[n-1]) +a1*(adc_val[n]-adc_val[n-2])
                  Ý nghĩa của hàm số trên được giải thích đơn giản như sau: giá tri cua adc_val ở thời điểm n ko chỉ phu thuộc vào thời điểm n, mà nó còn phụ thuộc vào các thời điểm trước đó thứ n-1, n-2,n-3...... Hệ số a0, a1... đại diên cho mức độ phụ thuộc của giá trị thời điểm hiện tại so với các thời điểm trước đó n-1,n-2...
                  -Code như sau:
                  float buff[2]={0,0},adc_val;
                  float a0=0.1, a1=0.01;

                  while(1)
                  {
                  buff[1]=buff[0];
                  buff[0]=adc_val;
                  adc_val=adc_data[0]+ a0*(adc_data[0]-buff[0]) + a1*(adc_data[0]-buff[1]);

                  //......Do something else
                  .......
                  delay_ms(1);// cần chinh delay cho phu hợp để ko bi trễ quá nhiều
                  }

                  Bạn cần test thật nhiều lần để tìm ra giá tri tối ưu nhất của a0 va a1 sao cho thỏa mãn trễ it nhất và nhiễu ít nhất!
                  Last edited by zinix; 24-04-2009, 23:24.

                  Comment


                  • #10
                    ADC của AVR có phân giải 10 bít tức gần 5mV một số ở Vref=5V. Trong hầu hết các ứng dụng đã dùng, mình thấy chỉ cần mắc đơn giản mà khá chính xác; đâu cần kì công chống nhiễu lắm!
                    Chẳng hạn chân Vref nối tụ 103 lên nguồn (7805), AVCC lên nguồn luôn. Khi đó ta có thể cđặt bằng phmềm để chọn Vref 2V56 (Vref bên trong) hoặc Vref 5V (AVCC).
                    Nếu hệ thống có rờ le, van hơi,... thì o nên dùng chung AVCC với VCC (thật ra dùng cũng o sao vì lúc mở rờ le, van hơi thường ta o đo ADC).
                    Nếu dùng nguồn máy tính (một số bộ có điện áp o ổn định) ta có thể cấp áp 5V cho AVCC qua 7805 lấy từ 12V.
                    Vì dải đo ADC khá rộng (tới 1024 đơn vị) nên có lẽ o nên đo những giá trị quá gần ngưỡng đầu cuối (gần 0V hay Vref).
                    Một số ứng dụng mà mạch của tín hiệu cần đo có trở kháng không phù hợp với đầu vào ADC thì cho qua OpAmp cho chắc.
                    Trên phần mềm, nếu đo 2 lần liên tiếp mà độ lệch lớn quá giá trị n nào đó thì bỏ đi, đo lại!
                    !e

                    Comment


                    • #11
                      Em chỉ thấy thiên hạ hay làm thế này thôi

                      Comment

                      Về tác giả

                      Collapse

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

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

                      Collapse

                      Đang tải...
                      X