15 C
Hanoi
Thứ Bảy, Tháng Mười Hai 4, 2021
Home LẬP TRÌNH VI ĐIỀU KHIỂN ARDUINO Xung PWM và PPM trong Arduino

Xung PWM và PPM trong Arduino

Giới thiệu chung

Xung PWM – Pulse Width Modulation

Tần số là gì?

Tần số là số lần lặp lại trong 1 đơn vị thời gian. Đơn vị tần số là Hz, tức là số lần lặp lại dao động trong 1 giây.
Ví dụ:
1Hz = 1 dao động trong 1 giây.
2Hz = 2 dao động trong 1 giây.
16MHz = 16 triệu dao động trong 1 giây.

Xung là các trạng thái cao / thấp (HIGH/LOW) về mức điện áp được lặp đi lặp lại. Đại lượng đặc trưng cho 1 xung PWM (Pulse Width Modulation) bao gồm tần số (frequency) và độ rộng xung (duty cycle).

Một dao động được xác định từ trạng thái bắt đầu và kết thúc ngay trước khi trạng thái bắt đầu được lặp lại.

Cách xác định 1 dao động

Như vậy thông thường, 1 dao động sẽ bao gồm 2 trạng thái điện: mức cao (x giây) và mức thấp (y giây). Tổng thời gian của 2 trạng thái điện này chính là chu kì xung (x+y) giây. Độ rộng xung = (x/(x+y))*100, đơn vị %.

Tóm lại, với 1 xung ta có:
Tần số: để tính toán ra được thời gian của 1 xung
Chu kì xung: bao nhiêu thời gian xung có mức áp cao, bao nhiêu thời gian xung có mức áp thấp.

  • Duty cycle : tỷ lệ phần trăm xung ở mức cao.
  • Period : là chu kì xung(bao gồm tổng thời gian mức cao + mức thấp).
  • Pulse width là giá trị của mức cao so với period.
  • Amplitude: Biên độ xung, là giá trị điện áp của xung khi ở mức cao

PWM hay còn gọi nôm na là “băm xung” hay “điều khiển độ rộng xung” là ứng dụng phổ biến và thường dùng trong lĩnh vực điều khiển động cơ. Một ví dụ đơn giản để hiểu về độ rộng xung là mức độ sáng tắt của LED, ở tần số mà mắt người có thể nhìn thấy thì nó là độ chênh lệch giữa mức sáng và tắt của 1 đèn khoảng thời gian lặp đi lặp lại(vd đèn sáng 5s, tắt 3s lặp đi lặp lại thì chu kì sẽ là 8 giây); với tần số cao mắt người không thể nhìn thấy thì ta sẽ thấy LED sáng mờ hay sáng rõ đó là do tổng thời gian sáng/ tổng thời gian tắt trong khoảng thời gian lớn hay nhỏ mà mắt người nhìn thấy(tính bằng đơn vị nhỏ như ms).

Liên hệ với Arduino

Với kiến thức cơ bản về xung, các bạn sẽ hiểu rõ hơn về xung trong thực tế như thế nào.

Xung khi sử dụng với hàm analogWrite trong Arduino, Giữa 2 vạch màu xanh lá cây là 1 xung.

analogWriteTỉ lệChu kì xung
analogWrite(0)0/2550%
analogWrite(64)64/25525%
analogWrite(127)127/25550%
analogWrite(191)191/25575%
analogWrite(255)255/255100%

Hàm analogWrite() trong Arduino giúp việc tạo 1 xung dễ dàng hơn. Hàm này truyền vào tham số cho phép thay đổi chu kì xung, bạn có thể tính toán ra được chu kì xung như ở bảng trên. Tần số xung được Arduino thiết lập mặc định.

Arduino Uno Pin Diagram, Specifications, Pin Configuration & Programming

Đối với board Arduino Uno, xung trên các chân 3,9,10,11 có tần số là 490Hz, xung trên chân 5,6 có tần số 980Hz. Làm thế nào để tạo ra các xung có tần số nhanh hơn? Bạn có thể tham khảo thêm các thư viện riêng hỗ trợ việc này trên mạng, về bản chất có thể thay đổi tần số PWM bằng cách thay đổi bộ đếm thời gian Timer.

Xung PPM – Pulse Position Modulation

Xung PPM được sử dụng để điều khiển servo.

Điều Khiển Động Cơ Servo Với Adruino

Servo là một dạng động cơ điện đặc biệt. Không giống như động cơ thông thường cứ cắm điện vào là quay liên tục, servo chỉ quay khi được điều khiển (bằng xung PPM) với góc quay nằm trong khoảng bất kì từ 0o – 180o. Mỗi loại servo có kích thước, khối lượng và cấu tạo khác nhau. Có loại thì nặng chỉ 9g (chủ yếu dùng trên máy bay mô mình), có loại thì sở hữu một momen lực bá đạo (vài chục Newton/m), hoặc có loại thì khỏe và nhông sắc chắc chắn,… 

Động cơ servo là loại động cơ cho phép ta điều khiển một cách cực kì chính xác. Vì vậy, khác với động cơ thông thường ta chỉ cần cấp nguồn cho động cơ là có thể vận hành được. Động cơ servo yêu cầu ta phải cấp nguồn (2 dây) và nhận điều khiển từ mạch chính (1 dây), mỗi dây thường được đánh màu như sau:

  • Đỏ: nhận điện nguồn, tuỳ vào loại động cơ mà giá trị này có thể khác nhau
  • Đen/Nâu: nối với cực âm của mạch
  • Vàng: nhận tín hiệu từ mạch điều khiển, tín hiệu này là tín hiệu PPM

Xung PPM khác với PWM ở chỗ:

  • Tần số thông thường có giá trị trong khoảng 50Hz (20 mili giây), không quan trọng
  • Thời gian xung ở mức cao chỉ từ 1ms đến 2ms, rất quan trọng.
  • Có thể có nhiều hơn 1 sự thay đổi trạng thái điện cao/thấp.

Nắm bắt được 3 ý trên ta đã có thể phân biệt được xung PPM và xung PWM giống nhau và khác nhau như thế nào.

Xung điều khiển động cơ servo
tín hiệu

Thời gian xung ở mức cao quy định góc quay của RC servo

Với thời gian 1ms mức cao, góc quay của servo là 0, 1.5ms góc quay 90 và 2ms góc quay là 180. Các góc khác từ 0-180 được xác định trong khoảng thời gian 1-2ms.

Lưu ý: Có thể ghép nhiều xung trong cùng 1 thời gian là 20ms để xác định vị trí góc của nhiều servo cùng 1 lúc. Tối đa là 10 servo.

ppm-servo-pulse

Code ví dụ

Động cơ servo sử dụng trong ví dụ này là loại Tower Pro MG90S. Động cơ này quay được 180° (trái 90° và phải 90°).

Lắp đặt động cơ theo sơ đồ sau:

  • Dây vàng nối với PIN 9 hay các PIN PWM tương đương (những PIN có kí hiệu ~ ở trước)
  • Dây đỏ nối với nguồn 5V
  • Dây đen nối vào chân GND
Sơ đồ lắp đặt

Arduino cung cấp sẵn một thư viện để hỗ trợ việc điều khiển hoạt động của động cơ, ra lệnh cho động cơ làm theo mong muốn. Minh hoạ việc sử dụng thư viện này để lập trình cho Arduino điều khiển servo như sau:

  1. Servo khởi đầu ở góc 0°
  2. Xoay tới góc 90° và dừng lại trong 1s
  3. Xoay tới góc 180° và dừng lại 1s
  4. Trở về góc 0° và lặp lại quá trình này

Đoạn code thực hiện công việc:

#include <Servo.h> //khai báo với hệ thống là trong chương trình ta có sử dụng thư viện servo
 
#define SERVO_PIN 9
 //do ở đây ta sử dụng PIN 9 để điều khiển servo, vì vậy tôi đặt một hằng số với tên gọi SERVO_PIN có giá trị là 9

Servo gServo;
 //khai báo đối tượng gServo, từ nay servo của chúng ta sẽ được điều khiển qua đối tượng này
 
void setup() 
{ 
    gServo.attach(SERVO_PIN); 
//servo của ta sẽ điều khiển động cơ ở SERVO_PIN.
}
 
void loop() 
{ 
    gServo.write(0);
 //điều chỉnh góc xoay của servo
    delay(1000);
	
    gServo.write(90);
//điều chỉnh góc xoay của servo
    delay(1000);
	
    gServo.write(180);
//điều chỉnh góc xoay của servo
    delay(1000);
}

Điều khiển động cơ Servo với biến trở

Sơ đồ mạch breadboard với động cơ Servo

Thư viện Servo đã có sẵn trong hệ thống thư viện mặc định của Arduino nên bạn không cần phải download một thư viện mới về.

#include <Servo.h>      // Thư viện điều khiển servo
 
// Khai báo đối tượng myservo dùng để điều khiển servo
Servo myservo;          

int bientro = A0;       // Khai báo chân analog đọc biến trở điều khiển servo
int servoPin = 9;       // Khai báo chân điều khiển servo
 
void setup ()
{
    ​// Cài đặt chức năng điều khiển servo cho chân servoPi
n
    ​myservo.attach(servoPin);
    ​Serial.begin(9600); // Mở giao tiếp Serial ở baudrate 960
0
}
void loop ()
{
    ​int value = analogRead(bientro);// Đọc giá trị biến tr
ở
    
    ​// Chuyển giá trị analog (0-1023) đọc được từ biến trở sang số đo độ (0-180độ
)
    ​// dùng để điều khiển góc quay cho serv
o
    ​int servoPos = map(value, 0, 1023, 0, 180)
;
    ​// Cho servo quay một góc là servoPos đ
ộ
    ​myservo.write(servoPos)
;
    ​Serial.println(servoPos)
;
    ​delay(100)
;
}

Nguồn: Arduino.vn, stdio.vn

6 COMMENTS

LEAVE A REPLY

Please enter your comment!
Please enter your name here

- Advertisment -

Most Popular

Tắt kính lúp hình vuông trong Altium

Tắt kính lúp của sổ PCB  trên Altium Sử dụng phím tắt: Shift+M Tham khảo thêm một số phím tắt khác trên phần mềm Altium Designer: Thiết...

Tổng hợp trang web liên quan thiết kế phần cứng điện tử

4 trang web tải thư viện SCH/PCB và 3D https://www.ultralibrarian.com/ https://componentsearchengine.com/ https://octopart.com/ https://www.snapeda.com/ https://componentsearchengine.com/ 2 trang tìm 3D cho thư viện của các bạn bao gồm: https://www.3dcontentcentral.com/ https://grabcad.com/library 4 trang cung cấp các...

Mạch đóng ngắt Relay sử dụng Transistor

Giới thiệu về Relay Rơ le (Relay) là một công tắc chuyển đổi hoạt động bằng điện. Dòng điện chạy qua cuộn dây của rơ...

Nạp Bootloader cho Arduino Pro Micro

Bootloader là một chương trình nhỏ được nạp sẵn vào chip vi điều khiển trên Arduino, nhờ đó bạn lập trình cho Arduino một...

Recent Comments