Đăng vào

Đo tần số xung PWM - Arduino

Bài viết này sẽ hướng dẫn đo tần số của xung vuông trên board Arduino Nano.

Thiết bị sử dụng

Arduino Nano

LCD 16x2

Biến trở

Module NE555

Mạch tạo xung NE555 được sử dụng để tạo xung vuông với tần số và biên độ có thể điều chỉnh được trên mạch, thích hợp cho các ứng dụng tạo xung, điều khiển động cơ nhanh chậm,... Thông số kỹ thuật:

  • Điện thế ngõ vào: từ 5 ~ 15VDC. Chú ý: khi nguồn cung là 5V, dòngngõ ra có thể xung quanh giá trị 15mA, khi nguồn cấp là 15VDC thì dòng ngõ ra có thể đạt xung quanh giá trị 35mA.
  • Độ lớn áp đỉnh ngõ ra: từ 4.2VPP – 11.4VPP (điện áp ngõ vào khác nhau thì độ lớn áp ngõ ra khác nhau)
  • Độ rộng xung ngõ ra (Duty Cycle) có thể điều chỉnh được.
  • Vùng tần số ngõ ra có thể chọn: • LF: 1Hz ~ 50Hz • IF: 50Hz ~ 1KHz • High-frequency: 1KHz ~ 10KHz • HF: 10KHz ~ 200KHz
  • LED chỉ thị ngõ ra: mức thấp: LED On, mức cao: LED Off, Mức bình thường: LED nhấp nháy
  • Độ lớn Maximum dòng ngõ ra : • >=15mA (khi nguồn ngõ vào 5V) • >=35mA(khi nguồn ngõ vào là 12V)
  • Tần số ngõ ra có thể điều chỉnh được thông qua công thức sau: • T = 0.7(RA + 2*RB) *C • Trong đó: RA, RB từ 010k. • LF khi C = 0.00uF • IF khi C = 0.1uF • HF khi C = 1uF • HF khi C = 100uF

Sơ đồ đấu dây

LCD – Arduino

  • GND – GND
  • VCC – +5V
  • V0 – Biến trở
  • RS – D12
  • RW – GND
  • E – D11
  • D4 – D5
  • D5 – D4
  • D6 – D3
  • D7 – D6
  • A – +3V3
  • K – GND

Module NE555 – Arduino

  • Output – D2

Giới thiệu về xung PWM

PWM điều chế độ rộng xung (Pulse-width modulation)

là ngoại vi phổ biến được hỗ trợ hầu hết trong các loại vi điều khiển, ứng dụng rộng rãi và nhất là trong lĩnh vực điều khiển động cơ. Một số thông số cơ bản của xung PWM:

  • Duty cycle: tỷ lệ phần trăm mức cao. Duty cycle được dung để tính giá trị trung bình của tín hiệu PWM
  • Period: chu kỳ xung (T) chính là khoảng thời gian giữa 2 lần xung cạnh lên (hoặc xung cạnh xuống) liên tiếp
  • Pulse width: độ rộng xung chính là thời gian giữ 1 xung cạnh lên và xung cạnh xuống liên tiếp.
  • Tần số xung f được tính f = 1/T

Trong ví dụ này, board NE555 được sử dụng để điều chế độ rộng xung và tín hiệu xung PWM ở chân output của NE555 được kết nối với chân D2 của Arduino để đo tần số xung.

Code Arduino

// 1. Su dung thu vien LCD cua Arduino
#include <LiquidCrystal.h>

// 2. Cai dat chan ket noi giua LCD voi arduino
const int rs = 12, en = 11, d4 = 5, d5 = 4, d6 = 3, d7 = 6;

// 3. Khai bao cac bien su dung trong chuong trinh
unsigned int PWM_T_us = 0;       // PWM Cycle Time: Bien dung de luu chu ky xung T
unsigned int PWM_f_Hz = 0;      // PWM Freq: Bien dung de luu tan so xung f
unsigned int TimerValue_us = 0; // Bien luu gia tri dem cua Timer (us)

// 4. Cai dat ket noi chan cua LCD voi Arduino
LiquidCrystal lcd(rs, en, d4, d5, d6, d7);
// 12. Chuong trinh ngat ISR_2 dung de do chu ky xung T
void ISR_2() {
    unsigned long now = micros();
    PWM_T_us = now - TimerValue_us; // Chu ky xung T
    TimerValue_us = now;
      // 10. Tinh toan tan so xung cua IC555
    PWM_f_Hz = 1000000.0/(double)(4*PWM_T_us);
}

// 5. Ham khoi tao ban dau cho mot chuong trinh Arduino
void setup() {
  // 6. Cai dat loai LCD su dung ( So cot va so hang)
  lcd.begin(16, 2);

  // 7. Luu gia tri ban dau cua Timer
  TimerValue_us = micros();

  // 8. Day la doan code ket noi chan xuat xung cua IC555 voi chan ngat ngoai cua Arduino
  //    Khi co xung canh len, timer se chay vao chuong trinh ngat ISR_2 de dem thoi gian cua chu ky xung T
   attachInterrupt(digitalPinToInterrupt(2), ISR_2, RISING);

}

// 9. Doan chuong trinh chinh cua Arduino
void loop() {
  // 11. Hien thi gia tri tan so xung len LCD
  lcd.clear(); // Xoa ma hinh LCD
  lcd.print("PWM Freq (Hz):"); // In len dong thu 1 cua LCD dong chu PWM Freq (Hz):
  lcd.setCursor(0, 1);
  lcd.print(PWM_f_Hz); // Hien thi tan so xung (Hz)
  delay(500); // Dung man hinh 200 mili s de de quan sat LCD
  delay(500);
}