Nick Chung gửi vào
- 39929 lượt xem
Ở phiên bản này, máy hiện sóng AVR-OSCILLOSCOPE của mình có thể được hiển thị lên 2 lcd thông dụng là NOKIA5110 hoặc lcd ST7565 Homephone .
Đây là thiết bị hiện sóng đa năng, mạnh mẽ và vô cùng gọn nhẹ. Các bạn hoàn toàn tự làm nó ngay lại công xưởng chế tạo tại nhà của mình với giá thành cực rẻ (chưa đến 300k - tính luôn Arduino Uno).
Chuẩn bị
- Vi điều khiển: 1 arduino uno R3 (hoặc 1 arduino promini hoặc 1 arduino nano)
- Hiển thị: 1 lcd Nokia5110 hoặc 1 lcd ST7565 homephone.
- Giao tiếp: 4 nút ấn thường.
- Loa: 1 còi buzzer ( loại tự kêu khi cấp điện).
- Mạch đệm:
- Nguồn đơn: 1 pin 9v. (9v => 12v – (Không dưới 6v và không quá 15V))
- Ic: 1 ic thuật toán LM358 ( hoặc LM393 hoặc LM 324 cũng thế).
- Điện trở: 1 điện trở 10k. 1 điện trở 1k.
- Công tắc 3 cực : 1 chiếc. ( Công tắc đồ chơi)
- Chiết áp: 1 biến trở xoay giá trị 10kOhm ( 10kOhm => 100kOhm tùy ý).
Ráp mạch
Còn đây là module của mình.
Sơ đồ nối với lcd.
Giới thiệu firmware
Sau khi nối mạch và nạp code arduino thành công. Xin chúc mừng, bạn đã trong tay một máy đo OSILLO thực sự.
Chú ý: Ở lần cài đặt đầu tiên, chương trình hỏi “ Continue with old data ?” –Bạn có muốn dùng các đặt cũ không. Chọn “No". Rồi nhấn “OK” ( Vì chúng ta chưa có dữ liệu nào trên bộ nhớ EEPROM).
Ở các lần tiếp theo, bạn có thể chọn “Yes "hoặc " No" để tiếp tục với các cài đặt ưa thích của mình.
Tính năng Frequency
- Chương trình đo tần số của xung đặt lên chân port PD5 (pin 5).
- Điện áp đặt max (Max vol) : 0v -> 5v.
- Tần số đo (Frequency): 0hz -> 20mhz. (còn tùy vào tốc độ chuyển mạch của ngắt, có thể lên đến 40mhz).
- Công tắc (Switch): ở chế độ thường bên Phải (Normal – to the Right).
Test:
Code test phát xung tần số ra các pin (~3,~5,~6,~9,~11). Trên arduino promini.
void setup() { TCCR1A = 0; TCCR1B = 0; // RESET lại 2 thanh ghi DDRB |= (1 << PB1); // Đầu ra PB1 là OUTPUT ( pin 9) TCCR1A |= (1 << WGM11); TCCR1B |= (1 << WGM12) | (1 << WGM13); // chọn Fast PWM, chế độ chọn TOP_value tự do ICR1 TCCR1A |= (1 << COM1A1); // So sánh thường( none-inverting) ICR1 = 1; // xung răng cưa tràn sau 1 P_clock OCR1A = 0; // xuất mọi lúc TCCR1B |= (1 << CS10); // F_clock=16mhz, P_clock=16/1=16mhz. //F_pwm=16mhz/(ICR1+1)=8mhz pinMode(3, OUTPUT); pinMode(5, OUTPUT); pinMode(6, OUTPUT); pinMode(11, OUTPUT); analogWrite(3, 25); // 25/256=10% analogWrite(5, 128); //128/256=50% analogWrite(6, 64); // 64/256=25% analogWrite(11, 192); // 192/256=75% } void loop() { }
Đo mô phỏng trên PROTEUS
Hãy tham khảo bài viết này để tạo xung theo sở thích nhé:
http://arduino.vn/tutorial/1416-avr-xuat-xung-voi-tan-so-va-do-rong-theo-y-muon
Tính năng DIGITAL CAPTRUE (CAPTURE AND RECORD)
Sử dụng chức năng digitalRead để đọc liên tục giá trị của xung vào (HIGH/LOW). Chương trình sẽ đợi (Watting..) cho đến khi có tín hiệu xung cao thì mới bắt đầu lấy mẫu.
Mỗi lần lấy mẫu cách nhau một khoảng thời gian DELAY (Có giá trị trong khoảng 0us - > 10000000 us (0us -> 10s)). Dữ liệu lấy mẫu gọi là Samples, bạn có thể tăng giá trị của Samples để lấy được nhiều mẫu hơn (Samples max = 1000, tương đương 1000 bytes RAM !).
- Điện áp đặt max (Max vol) : 0v -> 5v.
- Tần số đo (Frequency): 0hz -> 20khz.
- Công tắc (Switch): ): ở chế độ thường bên Phải (Normal – to the Right).
Tính năng PULSE WIDTH
Tìm độ rộng của xung.
- Điện áp đặt max (INPUT Max vol) : 0v -> 5v.
- Tần số đo (Frequency): 0hz -> 1mhz.
- Công tắc (Switch): ): ở chế độ thường bên Phải (Normal – to the Right).
Tính năng Oscilloscope
Máy đo tín hiệu dạng bất kì.
Mỗi lần lấy mẫu cách nhau một khoảng thời gian DELAY (Có giá trị trong khoảng 0us - > 10000000 us (0us -> 10s)).
Nếu không biết tần số của dao động là bao nhiêu, bạn có thể chọn AUTO DELAY, chương trình này sẽ giúp bạn tìm DELAY tự động.
Gạt công tắc (switch): ): ở chế độ OSCILLOSCOPE bên TRÁI (to the LEFT).
Điện áp đặt max (INPUT Max vol) : 0v => 5v.
Sử dụng biến trở để đặt giá trị điện áp so sánh với giá trị đầu vào.
- Nếu Urv < Input : Xung ra OA = 1. Arduino bắt đầu lấy mẫu analog.
- Nếu Urv >= input : Xung ra OA= 0. Arduino không lấy mẫu.
Do đó: Input min < Urv < Input max.
Trong video mình nói nhầm, sửa đúng phải là : độ cao hiển thị từ trục hoành đến trên cùng của màn hình tương ứng với mức điện áp từ 0v ->5v
Tính năng Realtime analog
Vẽ đồ thị theo thời gian thực (each 1 second).
- Điện áp đặt max (INPUT Max vol) : 0v -> 5v.
- Công tắc (Switch): ): ở chế độ thường bên Phải (Normal – to the Right).
Tính năng Setting
Save data | Lưu TẤT CẢ các cài đặt vào thẻ nhớ EEPROM trên arduino. |
Contrast | Cài đặt độ tương phản của màn hình. |
Negative | HIển thị âm bản. |
Tone | Bật tắt loa. |
Reset | Đặt lại tất cả các cài đặt về trạng thái mặc định. (Không bao gồm dữ liệu đã lưu trên EEPROM). |
Về tác giả
Thông tin về phiên bản, ngày hoàn thành, tác giả….
Tải về, cài đặt và chạy thử
Bạn hãy cài đủ 3 thư viện sau
- Thư viện đồ họa Game (Nhớ tải bản mới nhất) :
- Thư viện Eeprom đa năng:
Kiểm tra đủ 3 thư viện nhé
Đối với các bạn mới làm quen với 2 thư viện dành cho LCD trên, mình khuyên bạn nên NỐI DÂY và test hiển thị một vài ví dụ trong mục Examples có sẵn trong thư viện. Hãy biết cách làm cho nó hiển thị trước khi đọc tiếp. (Cách này sẽ giúp bạn thành công đến 99% trong các phần còn lại). Nếu chưa hiển thị thành công thì hãy tìm đến bài viết của lcd đó, mình sẽ cố gắng trả lời ở đó.
Nạp code
Tải file: https://drive.google.com/file/d/0BzMEcyRK_uUFTkU0cGRXYi1IUUE/view?usp=sharing
Toàn bộ file HEX botloader cho 3 loại arduino NANO - UNO - PRO MINI (mỗi loại đều có Code dành 2 lcd ST7565 và NOKIA5110), cộng thêm phần mềm nạp chuyên dụng đều có trong file zip, bạn hãy xem lại video nếu quên cách nạp nhé.
(Nhớ chọn cổng COM (cổng USB) thích hợp nhé)'
(cập nhật 13/10/2017) FIX lỗi "The code execution cannot proceed because libusb0.dll was not found" do thiếu file libsub.dll. : Đối với những bạn tải lần trước thì sẽ gặp lỗi này khi upload file hex, mình đã thêm file libsub.dll vào file tải xuống, hãy tải lại file zip nhé, mọi thứ sẽ hoạt động.
Tạm kết
Về độ chính xác: độ chính xác của phép đo tần số ở điều kiện mô phỏng (chương trình mô phỏng proteus) là 99.9% với tần số thạch anh 16.000.000 hz. Trên thực tế thạch anh trên arduino có tần số 16.000.xxx.hz , do đó kết quả thu được ( từ 10khz trở lên) là tương đối .
1. Về mạch đệm
Mạch OA1 để lặp tín hiệu, tăng trở kháng vào.
Mạch OA2 so sánh giá trị điện áp trên biến trở và tín hiệu vào. Khi Urv < input, cấp một xung đến arduino để bắt đầu đo. Chú ý nguồn cấp cho OA cần ổn định trong khoảng 9v => 12v,dòng chỉ cần 10mA là đủ (PIN 9V là lựa chọn hợp lý, bạn có thể sài vài tháng).
Cả 2 mạch còn có tác dụng bảo vệ Arduino trong trường hợp điện áp ngõ vào tăng đột ngột, thậm chí nếu điện áp tăng quá cao, ic sẽ cháy mà vẫn đảm bảo an toàn cho Arduino giống với hiệu ứng "cầu chì".
Điện trở R2 có 2 chức năng: Giảm cường độ dòng điện từ ngõ ra của OA2, kết hợp với điện trở R1 phân áp xuống khoảng 0=>7v. Điện trở R1 còn có chức năng của điện trở kéo âm, giúp tín hiệu ổn định ở chế độ chờ.
Do tần số làm việc của ic lm358 chỉ dưới 1mhz nên sẽ không thích hợp để đo tần số yêu cầu độ chính xác cao, do đó ta sẽ chuyển mạch trực tiếp ra 2 đầu đo bằng 1 công tắc. Khi đó điện áp đặt phải từ 0v -> 5v để đảm bảo an toàn cho Arduino
Nguồn cấp cho lcd là 3,5 v (Nhiều bạn đặt luôn là 5v thế là nó bị nhòe mà không để ý ).
2. Quá trình thiết kế
Mất nhiều sức… nhưng thành quả thu được cũng giúp mình có tinh thần hơn, đặc biệt là nghĩ đến việc sẽ chia sẻ thành quả với cộng đồng cũng là một động lực lớn giúp mình sớm hoàn thiện sản phẩm.
Đây sẽ là một trong số đồ án tốt nghiệp của mình, nên mình chưa thể public mã nguồn được.
Đừng lo, mình sẽ gửi bạn những học liệu mà mình đã tham khảo trên INTERNET trong quá trình làm dự án này.
Đầu tiên phải kể đến phương pháp pháp đo tần số bằng 2 timer quen thuộc.
- https://www.gammon.com.au/forum/?id=11504
- http://www.hocavr.com/index.php/app/input-capture
- http://www.serasidis.gr/circuits/mini_logic_analyzer/miniLogicAnalyzer.htm
- https://www.youtube.com/watch?v=122pIu_VeXA
- http://www.thingiverse.com/thing:1759380
- http://www.mathias-wilhelm.de/arduino/projects/dso096/
Yeah, hi vọng món "đồ chơi " này sẽ giúp ích cho bạn.
Tác giả: Thái Sơn