Đang tải...

Vi điều khiển Góp Ý Làm Máy Đo Xung .

Thảo luận trong 'Điện - Điện tử' bắt đầu bởi tuananh0589, 20/2/14.

Thành viên đang xem bài viết (Users: 0, Guests: 0)

  1. tuananh0589
    Offline

    Tài xế O-H
    Expand Collapse

    Tham gia ngày:
    6/4/09
    Số km:
    596
    Được đổ xăng:
    330
    Mã lực:
    166
    Xăng dự trữ:
    798 lít xăng
    như các bác đã biết trong ô tô bây giờ có rất nhiều cảm biến có xung mà chúng ta muốn đo xem xung của nó ,kiểm tra xem nó đã chết hay bộ nhận tín hiệu của nó đã chết hay còn nhiều nguyên nhân khác ? em lần trên mạng thấy trang http://www.hocavr.com/index.php/vi/app/input-capture có bàn về vấn đề này .vậy tại sao chúng ta không tạo ra 1 máy đo xung để dùng nhỉ ? đó là suy nghĩ .vậy mọi người có thể chung tay làm ra em nó không ạ ?
    Máy đo xung bằng Input Capture
    Tuấn Kiệt

    • giải thích của admin trong phần thảo luận).

      II. Sử dụng Input Capture làm máy đo xung

      Nếu bạn muốn đo tần số và chu kỳ của một tín hiệu xung mà không có máy đo chuyên dụng hay Oscilloscope thì bạn có thể dùng chức năng Input Capture của AVR để làm một máy đo đơn giản. Bài viết này hướng dẫn thực hiện một máy đo xung đơn giản như vậy.

      Tôi làm giới thiệu 2 phiên bản chương trình, phiên bản 1 chỉ đo chu kỳ và tấn số tín hiệu, và phiên bản 2 đo được cả tỉ lệ phần mức cao của tín hiệu. Mạch điện mô phỏng tôi vẽ như trong hình 2. Chu kỳ và tần số đo sẽ hiển thị trên LCD. Một công tắc chuyển 3 chấu gắn ở chân CP1 để chọn 2 nguồn xung khác nhau. Khi chạy mô phỏng các bạn có thể chuyển để thấy kết quả hiển thị trên LCD. Có thể thay đổi tấn số, độ rộng mức cao...của tín hiệu bằng cách double click vào icon tín hiệu và sửa trong hộp thoại edit của nó (hình 3).

      [​IMG]

      Hình 2. Đo xung bằng AVR.

      [​IMG]

      Hình 3. Edit tín hiệu mô phỏng

      Code cho phiên bản 1 trong list sau:
      [​IMG]

      Đa số các phần trong đoạn code này đều quen thuộc (nếu bạn đọc các bài như timer, TextLCD...) nên tôi chỉ giải thích phần Input capture. Vì Input Capture là 1 phần của timer, vì thế để dùng Input capture thì chúng ta phải set Timer. Trong bài này tôi dùng Timer1 ở chế độ thường (định thì) nên chúng ta không set nhiều cho thanh ghi TCCR1A mà chỉ 2 thanh ghi TCCR1B và TIMSK như trong 2 dòng 22 và 23. Chú ý dòng 23 cho phép ngắt tràn Timer và ngắt Input capture xảy ra. Như thế Timer cứ tự đếm từ 0 đến 0xffff (16 bits), khi đếm quá 0xffff thì ngắt tràn xảy ra. Khi có tín hiệu trên chân ICP1 thì ngắt Input capture xảy ra.

      Khi ngắt Input Capture xảy ra thì thanh ghi đếm TCNT1 tự động được copy vào thanh ghi ICR1. Trong trình phục ngắt Input capture (dòng 57) chúng ta tính khoảng thời gian chu kỳ bằng cách lấy giá trị thanh ghi ICR1 trừ đi giá trị ICR1 trước đó (dòng 58). Vì giá trị của thanh ghi đếm TCNT1 có giới hạn là 16 bits, nếu trường hợp chu ký xung cần đo quá lớn (ví dụ T= 1s = 1,000,000us) thì công thức trên sai. Trường hợp này cần cộng thêm một số lần 0xffff ứng với mỗi lần tràn bộ đếm, đó là biến over_step trong dòng 58.

      Trong phiên bản 2 của ví dụ đo xung, tôi có thêm vào chức năng đo tỉ lệ mức cao (hay còn gọi là Pulse width ) của xung để các bạn có thể dùng đo các xung PWM (hình 4). Tuy nhiên, phiên bản 2 chỉ đo được xung có tần số thấp (khoảng 10kHz là cao) trong khi phiên bản 1 có thể đo được đến 100kHz.

      [​IMG]

      Hình 4. Phiên bản 2, đo PWM.
     
    Đã được đổ xăng bởi bangdung, mrthanhnguyenhpnguyenvuong .
  2. tuananh0589
    Offline

    Tài xế O-H
    Expand Collapse

    Tham gia ngày:
    6/4/09
    Số km:
    596
    Được đổ xăng:
    330
    Mã lực:
    166
    Xăng dự trữ:
    798 lít xăng
    I. Giới thiệu Input Capture trên AVR.

    Input Capture là một module được tích hợp theo các timer-counter 16 bit trong AVR. Mục đích chính của module này là dùng để đo tín hiệu ví dụ tần số hoặc độ rộng xung (duty). Cơ bản nó hoạt động như sau (tôi dùng Timer 1 của ATmega32 làm ví dụ):
    - Chân nhận tín hiệu vào là chân ICP1 (chân 20 - Input Capture Pin). Bit ICES (Input Capture Edge Select) trong thanh ghi TCCRB1 sẽ quyết định loại "cạnh" của tín hiệu vào kích Input Capture. Khi ICES=0, cạnh xuống của tín hiệu vào sẽ kích Input Capture, nếu ICES=1 thì cạnh lên sẽ kích. Thanh ghi ICR1 chứa giá trị chính của Input Capture.
    - Giả sử bit ICES=0, Input Capture có thể hoạt động ở bất kỳ mode nào của Timer1 mà trong đó thanh ghi ICR1 không được sử dụng (xem bảng 3 bài Timer-Counter). Khi có 1 tín hiệu cạnh xuống ở chân ICP1, Input Capture xảy ra, trong cùng 1 chu kỳ máy giá trị của thanh ghi TCNT1 (thanh ghi Timer) sẽ được tự động chép vào thanh ghi ICR1, đồng thời cờ ICF 1được set, ngắt Input Capture có thể xảy ra nếu được cho enable. Lợi dụng khả năng thanh ghi TCNT1 được tự động chép vào ICR1, chúng ta có thể tính được khoảng thời gian giữa 2 lần Input Caprture xảy ra, từ đó suy ra chu kỳ hay tần số tín hiệu cần đo. Ví dụ chúng ta muốn đo chu kỳ (hoặc tần số) một tín hiệu bằng Input Capture, chúng ta sẽ thực hiện như trong hình 1 bên dưới.
    [​IMG]

    Hình 1. Nguyên lý Input Capture cạnh xuống trên AVR.

    Cứ mỗi lần có một ngắt Input Capture xảy ra, chúng ta đọc thanh ghi ICR1, trừ giá trị này cho giá trị lần trước sẽ thu được chu kỳ tín hiệu cần đo.
     
    Đã được đổ xăng bởi bangdungmobilest.
  3. phanminhnhat
    Offline

    Học việc
    Expand Collapse

    Tham gia ngày:
    26/4/09
    Số km:
    4,131
    Được đổ xăng:
    1,002
    Mã lực:
    616
    Giới tính:
    Nam
    Xăng dự trữ:
    36,200 lít xăng
    Chế tạo thiết bị như trên chỉ thấy được tần số, chu kì xung vuông.
    Nếu chỉ dùng để kiểm tra cảm biến có xung hay không, tần số thay đổi như thế nào thì em nghĩ cách trực quan và đơn giản nhất là cho 1 bóng led nó nhấp nháy là đủ.
     
    Đã được đổ xăng bởi bangdung, mrthanhnguyenhp, tuananh05896 tài xế khác.

Chia sẻ trang này