Thông báo

Collapse
No announcement yet.

ADC cho sensor

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

  • ADC cho sensor

    tôi đang lam với atmega16
    đang định dùng 8 kênh ADC của nó dùng cho bộ so sánh 8 sensor bắt vạch
    định phát huy thế mạnh của AVR vao robocon nhung hiện giờ vẩn chua hiểu cách dùng (điện thế đạt vào Vfe va Vacc) như thế nào cao thủ nào đã làm xin chỉ bảo .

  • #2
    không hiểu thế nào là điện thế so sánh trong, ngoài

    Comment


    • #3
      có thể hiểu nôm na là thế này:
      - Vref là quy định mức hay phân giải, tức là nếu thu được tại thanh ghi ADCH và ACHL một số Hexa quy đổi ra Decimal là XX thì ta sẽ có được: điện áp 1 chiều đó là Vin = XX*Vref/1024. Lưu ý, việc sử dụng ADC của AVR không được mềm dẻo như dùng thêm các IC ADC ngoài do các ADC có chung Vref. Nếu thiết lập Vref trong thì nó sử dụng luôn VCC của vi điều khiển hoặc VCC/2 để làm Vref.
      - Ngoài ra các chân có chức năng ADC còn cần có nguồn riêng xấp xỉ bằng nguồn nuôi cho vi điều khiển.

      Các chiêu thức trên đã được chỉ khá rõ trên kiếm phổ datasheet của AVR, các hạ nên xem kỹ. Có gì thì cứ hỏi tiếp. OK
      Nguy hiểm của tuổi già là cháy nổ gì chả có phản ứng!

      Comment


      • #4
        cảm ơn bác phd31183 điều tại hạ chưa hiểu đó là cách sử lý . nếu tại hạ sử Dụng cả 8 Kênh của nó, gần như là Phải so sánh tại cùng thời điểm cả 8 sensor thì cách sử lý tín hiệu vào ra như thế nào là tốt nhất SƯ HUYNH có kinh nghiệm giúp đở tai hạ với.
        Nếu có thể thì cho tại hạ xin bài mẫu.
        TRĂM HAY KHÔNG BẰNG TAY QUEN.
        TẠI HẠ CẢM ƠN NHIỀU !.

        Comment


        • #5
          Kiến trúc của AVR vẫn là xử lý tuần tự, chức năng ADC của AVR cũng vậy, cũng phải đọc tín hiệu lần lượt của từng kênh, do vậy các hạ không thể xử lý cùng 1 lúc nhiều tín hiệu được. vì mỗi thời điểm, AVR chỉ thực thi 1 lệnh của các hạ. AVR làm việc gần như 1 chu kỳ 1 lệnh, nhưng ADC của AVR mất đâu khoảng trên 10 chu kỳ 1 lần convert cho 1 kênh, vì vậy convert toàn bộ 8 kênh chỉ mất khoảng vài chục chu kỳ(vài chục us thôi) có thể coi là đồng thời được không, nếu muốn tại hạ sẽ post đoạn code này bằng cho các hạ. Còn tyệt đối đồng thời thì tại hạ chưa tu luyên j được. OK
          Nguy hiểm của tuổi già là cháy nổ gì chả có phản ứng!

          Comment


          • #6
            Cảm ơn bác phd31183 đã giúp đỡ ,thật sự thì tại hạ chưa quen với ADC tích hợp trong AVR thế nên nếu đã làm rồi thì các hạ post lên cho tại hạ , tại hạ đang rất cần .

            Comment


            • #7
              #include <mega16.h>

              unsigned int adc_data[8];
              #define ADC_VREF_TYPE 0x00
              // ADC interrupt service routine
              // with auto input scanning
              interrupt [ADC_INT] void adc_isr(void)
              {
              register static unsigned char input_index=0;
              // Read the AD conversion result
              adc_data[input_index]=ADCW;
              // Select next ADC input
              if (++input_index > 7)
              input_index=0;
              ADMUX=(0|ADC_VREF_TYPE)+input_index;
              // Start the AD conversion
              ADCSRA|=0x40;
              }

              // Declare your global variables here

              void main(void)
              {

              // ADC initialization
              // ADC Clock frequency: 125.000 kHz
              // ADC Voltage Reference: AREF pin
              // ADC High Speed Mode: Off
              // ADC Auto Trigger Source: None
              ADMUX=0|ADC_VREF_TYPE;
              ADCSRA=0xCE;
              SFIOR&=0xEF;

              // Global enable interrupts
              #asm("sei")

              while (1)
              {
              // Place your code here

              };
              }


              Trên đây là mẫu sử dụng ADC tạo bằng codewizard. Đơn giản phải không, sử dụng 1 dạng biến mảng 1 chiều, mỗi lần convert bạn chỉ việc nhớ nó nvào 1 phần tử của 1 mảng, 8 kênh tương đương với 8 phần tử của mảng. adc_data[0-7] vậy là cần lấy giá trị kênh nào thì chỉ việc gọi adc_data[số kênh] đố ra . OK. Chúc bạn thành công.
              Nguy hiểm của tuổi già là cháy nổ gì chả có phản ứng!

              Comment


              • #8
                Nếu sử dụng cả 8 đường ADC bạn nên dùng ở chế độ free-running tự động chuyển đổi đầu vào tiếp theo sau khi chuyển đổi xong đầu vào trước đó.

                Bàn thêm về vấn đề sử dụng ADC làm sensor trong robocon:

                Mình thấy ADC chỉ có tác dụng là bạn có thể đặt ngưỡng phân biệt vạch bằng phần mềm, sử dụng tốt khi bạn có giao diện lập trình bàn phím hiển thị LCD trên mạch (đặt lại giá trị ngay trên mạch). Tốt hơn nữa thì có thêm chức năng tự động điều chỉnh ngưỡng bằng phần mềm (cho phù hợp với sân thi đấu).

                Chỉ cần dùng ADC 8bit là đủ cho sensor vạch, khi đó bạn có thể tăng tần số lấy mẫu lên. Chẳng hạn tốc độ lấy mẫu của ADC 10 bit tối đa là 15,4ksps. AVR cần 13-14 chu kì ADC chứ không phải chu kì máy để thực hiện 1 chuyển đổi (lần chuyển đổi đầu tiên cần thêm khoảng 10 chu kì ADC nữa). Tần số ADC tối đa là 200kHz với ADC 10bit.

                Khi sử dụng 8bit ta có thể nâng tần số ADC lên cao hơn tới 500-700kHz. Lúc đó tốc độ lấy mẫu sẽ tăng lên tương ứng. Với tốc độ 500kHz ta có thể lấy mẫu 5 đầu vào với tốc độ lấy mẫu mỗi đầu là 10ksps.
                PNLab
                Mạch nạp/debug ULink2, Jlink ARM USB
                Mạch nạp AVR, PIC, 8051, MSP430 USB
                Mạch phát triển STM32, ARM9, ARM11
                more...www.pnlabvn.com

                Comment


                • #9
                  Đúng vậy, lâu không xài ADC quên mất, biến đổi ADC thì sử dụng clock của ADC không phải chu kỳ máy. Lần chuyển đổi đầug tiên cần 25 chu kỳ lận, nhưng không đáng kể.
                  Nguy hiểm của tuổi già là cháy nổ gì chả có phản ứng!

                  Comment


                  • #10
                    Cho tớ hỏi : Có phai khái niệm "kênh" dùng trong ADC được hiểu là chân của AVR đúng không?.
                    Khi AVR sử dụng ADC thi mỗi chân của nó (ADC0 -> ADC7) được xem là các kênh riêng rẽ. và mỗi chân này sẽ thực hiện việc chuyển đôi Analog Digital độc lập ?.
                    Bác sphinx bảo nên dùng chế độ free_running, tôi có thắc mắc : chế độ free_running sẽ liên tục chuyển đổi ADC (tức là ngay sau khi việc chuyển đổi ADC này hoàn thành, nó sẽ thực hiện việc chuyển đổi tiếp theo luôn). Nhưng trong đatasheet nói : phải mất một khoảng thời gian đọc ADC ( ADCL trước, ADCH sau), trong thời gian đọc thanh ghi ADC bị khóa lại, vậy việc thực hiện chuyển đổi ADC liên tục có gây khó khăn gì cho việc đọc dữ liệu ko?

                    Comment


                    • #11
                      Các kênh ở đây chính xác là các chân của PORT A. Trong khối ADC có một bộ MUX tương tự để chọn đầu vào cần chuyển đổi, đưa tới khối chuyển đổi ADC. Trong AVR chỉ có một khối chuyển đổi ADC do đó tại mỗi thời điểm chỉ có một kênh được biến đổi. AVR không thể thực hiện chuyển đổi cùng lúc tất cả các đầu vào Analog!

                      Chế độ Free_Running được sử dụng với một ngắt ADC, trình phục vụ ngắt sẽ khởi tạo 1 mảng dữ liệu để lưu các giá trị đã chuyển đổi tương ứng với các đầu vào mà bạn chọn (có thể là 0-->5 hoặc 0--->7 tùy ứng dụng của bạn có cần chuyển đổi tất cả các đầu vào hay không).

                      Khi quá trình chuyển đổi hoàn thành, trình phục vụ ngắt được gọi và lưu lại giá trị chuyển đổi, sau đó nó sẽ chuyển tới đầu vào kế tiếp.

                      Vì vậy quá trình lấy mẫu ADC sẽ là 1 tuyến trình độc lập. Trong thân chương trình bạn chỉ cần đọc mảng giá trị kết quả chuyển đổi.
                      PNLab
                      Mạch nạp/debug ULink2, Jlink ARM USB
                      Mạch nạp AVR, PIC, 8051, MSP430 USB
                      Mạch phát triển STM32, ARM9, ARM11
                      more...www.pnlabvn.com

                      Comment


                      • #12
                        oài, bác làm việc với con ATmega8 chưa, hình như không đặt cho 1cais delay nho nhỏ thì dừong như nó bị lộn tung phèo thế nào ý. theo tại hạ tốt nhất là hãy xử lý khi đã đọc xong các kênh ADC, đỡ nầm nẫm.
                        Nguy hiểm của tuổi già là cháy nổ gì chả có phản ứng!

                        Comment


                        • #13
                          lâu không vào thư mục này
                          thật sự sử dụng AVR cho robocon ma khai thac 3 tính năng của nó
                          WPM,ADC,LCD
                          thì thật là thú vị, mình thấy mạch của nó thật đơn giản .
                          khi sử dụng mạch 89 kích thước mạch gân 2 dc còn khi sử dụng mạch AVR kích thước chưa đến 1dc

                          Comment


                          • #14
                            Bác manh_th ở BK FIRE hở! Bác có lòng thì post một ít cái mạch robot tự động của bác lên cho bà con tham khảo, cả cái ảnh nữa! Hôm nọ nghé phòng bọn BIA thấy cái mạch của bác đẹp phết!
                            PNLab
                            Mạch nạp/debug ULink2, Jlink ARM USB
                            Mạch nạp AVR, PIC, 8051, MSP430 USB
                            Mạch phát triển STM32, ARM9, ARM11
                            more...www.pnlabvn.com

                            Comment


                            • #15
                              ok hôm nào rổi mình sẽ post lên cho mọi người xem và cho ý kiến,
                              mấy hôm nay vừa thi song nên mệt lắm

                              Comment

                              Về tác giả

                              Collapse

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

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

                              Collapse

                              Đang tải...
                              X