[Arduino cơ bản] Điều chế độ rộng xung PWM

Thảo luận trong 'Arduino' bắt đầu bởi VuPhat.MCA, 16/8/19.

Tags:
  1. VuPhat.MCA

    VuPhat.MCA New Member

    Bài này chúng ta sẽ tìm hiểu về PWM, các thông số, và cách điều chế chúng trên board Arduino.

    I. Sáng dần tắt dần (Fading) LED
    Chuẩn bị:

    a) Arduino UNO R3
    c) LED đơn 5mm
    d) Trở vạch 220Ω

    F Sơ đồ kết nối:
    Chân Anot của LED được nối với chân 6 thông qua trở hạn dòng 220Ω và chân Katot được nối với GND.
    [​IMG]


    Phương pháp điều chế PWM:
    PWM (Pulse Width Modulation) là một kỹ thuật thường được dùng để điều chế điệp áp với một mức xác định. Chúng thường được dùng trong các bộ điều khiển tốc độ đông cơ, điều áp, cách mạch boost, buck, nghịch lưu, điều khiển công suất, …
    Trước khi đi sâu hơn vào phần nội dung, mình sẽ giới thiệu cho các bạn một số thuật ngữ liên quan đến PWM.
    +) Ton: Là thời gian xung ở mức cao.
    +) Toff: Là thời gian xung ở mức thấp.
    +) T: Là chu kỳ của xung và T = Ton + Toff.
    +) DutyCycle: là % xung tín hiệu ở mức cao Ton so với chu kỳ T:
    [​IMG]
    [​IMG]
    Với DutyCycle biết trước, chúng ta có điện áp đầu ra thu được sau khi điều chế là:
    [​IMG]
    Trong Arduino đã hỗ trợ chúng ta hàm analogWrite() để tạo xung PWM (lưu ý rằng chỉ các chân có ký hiệu ~ mới hỗ trợ hàm này). Với tham số đầu tiên truyền vào là chân chỉ định đề xuất xung, và giá trị độ rộng xung có giá trị từ 0 đến 255 ứng với giá trị từ 0% đến 100%.
    [​IMG]

    Lưu ý:
    Tần số PWM có thể được điều chỉnh qua các ngắt của vi điều khiển ATmega. Thông số mặc định ở các chân 5, 6 là 1000 Hz và chân 9, 10, 11 là 500Hz.
    Dưới đây là chương trình điều khiển LED sáng dần tắt dần.

    Chương trình:
    Mã:
    const int ledPin = 6; // Chân Arduino nối với LED
    
    void setup() {
      // Cấu hình chân LED là đầu ra
      pinMode(ledPin, OUTPUT);
    }
    
    void loop() {
      // Hiệu ứng LED sáng dần
      for (int i = 0; i < 255; i++) {
        // Xuất giá trị PWM ra chân LED
        analogWrite(ledPin, i);
        // Trễ 5ms
        delay(5);
      }
      // Chờ 1s để chuyển hiệu ứng
      delay(1000);
    
      // Hiệu ứng LED tắt dần
      for (int i = 255; i > 0; i--) {
        // Xuất giá trị PWM ra chân LED
        analogWrite(ledPin, i);
        // Trễ 5ms
        delay(5);
      }
      // Chờ 1s để chuyển hiệu ứng
      delay(1000);
    }
    
    Kết quả:
    Quan sát đèn LED chúng ta thấy đèn LED sáng dần, sau khoảng 1s đèn LED tắt dần, và sau 1s đèn lại sáng dần, cứ lặp đi lặp lại như vậy.

    II. Điều chỉnh độ sáng LED bằng triết áp
    Chuẩn bị:

    a) Arduino UNO R3
    b) Triết áp đơn 10k
    c) LED đơn 5mm
    d) Trở vạch 220Ω

    Sơ đồ kết nối:
    Chân giữa của triết áp được nối với A0, hai chân còn lại được nối với GND và 5V, chân điều khiển LED được nối với chân 6 của Arduino.
    [​IMG]

    Chương trình:
    Mã:
    const int potPin = A0; // Chân Arduino nối với chân giữa triết áp
    const int ledPin = 6; // Chân Arduino nối với LED
    
    void setup() {
      // Cấu hình chân LED là đầu ra
      pinMode(ledPin, OUTPUT);
    }
    
    void loop() {
      // Đọc giá trị ADC tại chân của triết áp
      int adcValue = analogRead(potPin);
      // Giá trị ADC lớn nhất là 1023, trong khi đó
      // giá trị xuất PWM của analogWrite lớn nhất
      // là 255, do đó ta phải chia cho 4
      analogWrite(ledPin, adcValue/4);
    }
    
    Kết quả:
    Điều chỉnh chiết áp ta thấy cường độ sáng của đèn LED cũng được điều chỉnh theo.
     
    Last edited: 16/8/19

trang này