tuananh0589
Tài xế O-H
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
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).
Hình 2. Đo xung bằng AVR.
Hình 3. Edit tín hiệu mô phỏng
Code cho phiên bản 1 trong list sau:
Đ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.
Hình 4. Phiên bản 2, đo PWM.