Giới thiệu PWM

Một phần của tài liệu Giáo trình vi điều khiển (Trang 120)

118

- 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à chu kì xung (duty cycle).

- 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.

Lấ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.

- Nhƣ vậy theo quy tắc tam suất: 16 triệu dao động - 1 giây --> 1 dao động tốn 1/16.000.000 (giây) = 0,0625 (micro giây)

- Cách xác định 1 dao động nhƣ thế nào? Đa phần chúng ta mới nghiên cứu điện tử

thƣờng mắc sai lầm ở việc xác định 1 dao động. 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.

Hình 12.1 Xung Vuông

* 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ỉ lệ phần trăm thời gian giữa 2 trạng thái điện này chính là chu kì xung.

Với x/y = 0% ta có xung chứa toàn bộ điện áp thấp (khái niệm xung nên hiểu mở rộng)

Với x/y = 50% thì 50% thời gian đầu, xung có điện áp cao, 50% sau xung có điện áp thấp.

Với x/y=100% ta có xung chứa toàn bộ điện áp cao. - 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.

1.2.Liên hệ với Arduino:

Với kiến thức cơ bản về xung, chúng ta sẽ hiểu rõ hơn về xung trong thực tế nhƣ thế nào.

119

Hình 12.2 Đồ thị dạng xung điều chế PWM (Pulse Width Modulation)

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.

analogWrite tỉ lệ chu kì xung

analogWrite(0) 0/255 0%

analogWrite(64) 64/255 25%

analogWrite(127) 127/255 50%

analogWrite(191) 191/255 75%

analogWrite(255) 255/255 100%

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, ta 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.

Đố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? ta có thể tham khảo

thêm các thƣ viện riêng hỗ trợ việc này. Trong mã nguồn Arduino gốc không hỗ trợ phần này.

Lưu ý: xung điều khiển servo có tên gọi PPM (Pulse Position Modulation) khác

120

Phương pháp để chuyển đổi thông tin thành những xung để truyền dẫn - PWM (Pulse Width Modulation): Độ rộng xung tỷ lệ với biên độ tín hiệu tƣơng tự.

- PPM (Pulse Position Modulation): Vị trí xung thay đổi theo biên độ tín hiệu tƣơng tự trong một khe thời gian.

- PAM (Pulse Amplitude Modulation): Biên độ xung thay đổi theo biên độ của tín hiệu tƣơng tự.

- PCM (Pulse Code Modulation): chuyển đổi chuỗi xung điều chế biên độ thành dạng tín hiệu nhị phân. PCM là phƣơng pháp phổ biến trong hệ thống viễn thông, chủ yếu là trong mạng PSTN 2. Phần cứng - Chuẩn bị: + 1 Arduino Uno r3 + 1 Breadboard + Dây cắm breadboard

+ 1 điện trở 560 Ohm (hoặc 220 Ohm hoặc 1kOhm) + 1 đèn LED siêu sáng.

- Lắp mạch:

121

3. Lập trình và giải thích

int led = 9; // khai báo chân sử dụng int brightness = 0; // khai báo độ sáng

int fadeAmount = 5; // khai báo mức thay đổi độ sáng // sau khi cấp nguồn thì hàm setup() chạy 1 lần duy nhất: void setup() {

// khai báo chân 9 là lối ra pinMode(led, OUTPUT); }

// vòng lặp thực hiện các đoạn mã tuần tự là lặp lại: void loop() {

// đặt độ sáng ban đầu:

analogWrite(led, brightness);

// thay đổi độ sáng sau từng vòng lặp: brightness = brightness + fadeAmount;

// đảo chiều độ sáng khi hết vòng tối --> sáng và sáng --> tối if (brightness <= 0 || brightness >= 255) { fadeAmount = -fadeAmount; } //chờ 30 milliseconds để quan sát delay(30); }

Câu hỏi ôn tập

Câu 1: Thế nào là điều chế PWM ?

122

BÀI 13: GIAO TIẾP I2C -ĐỌC THỜI GIAN THỰC.

* Giới thiệu: Đầu năm 1980 Phillips đã phát triển một chuẩn giao tiếp nối tiếp 2 dây đƣợc gọi là I2C. I2C là tên viết tắt của cụm từ Inter-Intergrated Circuit. Đây là đƣờng Bus giao tiếp giữa các IC với nhau. I2C mặc dù đƣợc phát triển bới Philips, nhƣng nó đã đƣợc rất nhiều nhà sản xuất IC trên thế giới sử dụng. I2C trở thành một chuẩn công nghiệp cho các giao tiếp điều khiển, có thể kể ra đây một vài tên tuổi ngoài Philips nhƣ: Texas Intrument(TI), MaximDallas, analog Device, National Semiconductor ... Bus I2C đƣợc sử dụng làm bus giao tiếp ngoại vi cho rất nhiều loại IC khác nhau nhƣ các loại Vi điều khiển 8051, PIC, AVR, ARM... chip nhớ nhƣ: RAM tĩnh (Static Ram), EEPROM, bộ chuyển đổi tƣơng tự số (ADC), số tƣơng tự(DAC), IC điểu khiển LCD, LED...

*Mục tiêu: Sau khi học xong bài học này, ngƣời học có khảnăng:

- Trình bày đƣợc cấu tạo, chức năng và nguyên lý hoạt động của I2C trong

Arduino.

- Vẽ đƣợc sơ đồ nguyên lý mạch của I2C

- Mô phỏng đƣợc chƣơng trình mạch của I2C bằng phần mềm mô phỏng - Kết nối đƣợc phần cứng mạch của I2C đúng yêu cầu kỹ thuật.

- Viết, nạp và chạy đƣợc chƣơng trình của I2C

*Nội dung: 1. Giới thiệu I2C 1.1.Khái niệm:

I²C, viết tắt của từ tiếng Anh “Inter-Integrated Circuit”, là một loại bus nối tiếp đƣợc phát triển bởi hãng sản xuất linh kiện điện tử Philips. Ban đầu, loại bus

này chỉ đƣợc dùng trong các linh kiện điện tử của Philips. Sau đó, do tính ƣu việt

và đơn giản của nó, I²C đã đƣợc chuẩn hóa và đƣợc dùng rộng rãi trong các mô đun truyền thông nối tiếp của vi mạch tích hợp ngày nay.

1.2 Cấu tạo và nguyên lý hoạt động:

I²C sử dụng hai đƣờng truyền tín hiệu:

 Một đƣờng xung nhịp đồng hồ(SCL) chỉ do Master phát đi ( thông thƣờng ở 100kHz và 400kHz. Mức cao nhất là 1Mhz và 3.4MHz).

 Một đƣờng dữ liệu(SDA) theo 2 hƣớng.  Sơ đồ kết nối nhƣ hình dƣới.

123

Hình 13.1 Đường dữ liệu(SDA) theo 2 hướng

lƣu ý: về xung clock. Bản chất của I2C là dữ liệu trên đƣờng SDA chỉ đƣợc ghi

nhận ở sƣờn lên của chân CLK. Do vậy xung clock có thể không cần chính xác tốc độ là 1MHz hay 3.4Mhz. Lợi dụng điểm này có thể sử dụng 2 chân GPIO để làm chân giao tiếp I2C mềm mà không nhất thiết cần một chân CLK tạo xung với tốc

độ chính xác (có thể chỉ cần dùng delay và bật tắt mức logic) SCL và SDA luôn

đƣợc kéo lên nguồn bằng một điện trở kéo lên có giá trị xấp xỉ 4,7 KOhm (tùy vào từng thiết bị và chuẩn giao tiếp, có thể dao động trong khoảng 1KOhm đến 4.7 Kohm.

Chú ý: theo cấu hình này, một thiết bị có thể ở mức logic LOW hay cao trở nhƣng ko thể ở dạng HIGH => Chính trở pull up tạo ra mức logic HIGH).

2. Phần cứng - Chuẩn bị: Arduino UNO Module RTC DS1307 - Lắp mạch : Sơ đồđấu nối

Arduino UNO Module RTC DS1307

GND GND

5V GND

A4 SDA

124

Hình 13.2 Giao tiếp bo Arduino UNO với Module RTC DS1307

3. Lập trình và giải thích - Code:

#include <LiquidCrystal_I2C.h> #include "RTClib.h"

RTC_DS1307 rtc;

char daysOfTheWeek[7][12] = {"Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat"}; void setup () { Serial.begin(9600); if (! rtc.begin()) { Serial.print("Couldn't find RTC"); while (1); } if (! rtc.isrunning()) {

Serial.print("RTC is NOT running!"); Serial.println();

125 rtc.adjust(DateTime(F(__DATE__), F(__TIME__))); //rtc.adjust(DateTime(2014, 1, 21, 3, 0, 0)); } void loop () {

DateTime now = rtc.now(); if(now.hour()<=9) { Serial.print("0"); Serial.print(now.hour()); } else { Serial.print(now.hour()); } Serial.print(':'); if(now.minute()<=9) { Serial.print("0"); Serial.print(now.minute()); } else { Serial.print(now.minute()); } Serial.print(':'); if(now.second()<=9) { Serial.print("0"); Serial.print(now.second()); } else { Serial.print(now.second()); } Serial.println(); Serial.print(daysOfTheWeek[now.dayOfTheWeek()]); Serial.print(",");

126 if(now.day()<=9) { Serial.print("0"); Serial.print(now.day()); } else { Serial.print(now.day()); } Serial.print('/'); if(now.month()<=9) { Serial.print("0"); Serial.print(now.month()); } else { Serial.print(now.month()); } Serial.print('/'); if(now.year()<=9) { Serial.print("0"); Serial.print(now.year()); } else { Serial.print(now.year()); } Serial.println(); delay(1000); } - Giải thích code RTC_DS1307 rtc;

char daysOfTheWeek[7][12] = {"Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat"};

Ban đầu chúng ta tạo một đối tƣợng của thƣ viện RTClib là rtc và xác định mảng ký tự daysOfTheWeek để lƣu trữ thông tin ngày trong tuần.

127

Hàm rtc.begin() là hàm khởi tạo để đảm bảo module RTC đƣợc kết nối.

Hàm rtc.isrunning() là hàm đọc các thanh ghi bên trong I2C của DS1307 để kiểm

tra xem chip có trả về thời gian hay không. Nếu hàm trả về giá trị False thì đặt lại thời gian.

- Hàm rtc.adjust()

Hàm rtc.adjust() là hàm đặt ngày và giờ. Chúng ta có 2 cách đặt ngày giờ:

DateTime(F(__DATE__), F(__TIME__)) cách này chúng ta cập nhật thời

gian tự động từ máy tính.

DateTime(YYY, M, D, H, M, s) cách này chúng ta thiết lập giờ thủ công.

Ví dụ: Đặt ngày 12 tháng 5 năm 2019 vào lúc 14:07 thì chúng ta sẽ gọi hàm DateTime(2019, 5, 12, 14, 07, 00).

Một sốhàm khác:

Hàm rtc.now() Trả về ngày & giờ hiện tại. Giá trị trả về của nó thƣờng đƣợc lƣu trữ trong biến của kiểu dữ liệu DateTime.

Hàm year() Trả về năm hiện tại.

Hàm month() Trả về tháng hiện tại.

Hàm day() Trả về ngày hiện tại.

Hàm daysOfTheWeek() Trả về ngày hiện tại trong tuần.

Hàm hour() Trả về giờ hiện tại.

Hàm minute() Trả về phút hiện tại.

Hàm second() Trả về giây hiện tại.

Câu hỏi ôn tập:

Câu 1:Trình bày nguyên lý hoạt động của I2C?

Câu 2: Kết nối phần cứng và viết chƣơng trình điều khiển Đọc nhiệt độ - độ ẩm và xuất ra màn hình LCD?

128

BÀI 14: ĐIỀU KHIỂN ĐỘNG CƠ DC *Giới thiệu

Điều khiển động cơ DC (DC Motor) là một ứng dụng thuộc dạng cơ bản nhất của điều khiển tự động vì DC Motor là cơ cấu chấp hành (actuator) đƣợc dùng nhiều nhất trong các hệ thống tự động (ví dụ robot). Điều khiển đƣợc DC Motor là ta đã có thể tự xây dựng đƣợc cho mình rất nhiều hệ thống tự động.

*Mục tiêu: Sau khi học xong bài học này, ngƣời học có khảnăng:

- Trình bày đƣợc cấu tạo, chức năng và nguyên lý hoạt động của mạch L298. - Vẽ đƣợc sơ đồ nguyên lý mạch điều khiển động cơ DC

- Mô phỏng đƣợc chƣơng trình mạch điều khiển động cơ DC bằng phần mềm mô phỏng

- Kết nối đƣợc phần cứng mạch điều khiển động cơ DC đúng yêu cầu kỹ thuật.

- Viết, nạp và chạy đƣợc chƣơng trình điều khiển động cơ DC

- Rèn luyện tính tƣ duy và tác phong công nghiệp , đảm bảo an toàn cho

ngƣời và thiết bị

*Nội dung:

1. Giới thiệu động cơ DC

Động cơ điện 1 chiều là thiết bị ngoại vi đƣợc sử dụng rất rộng rãi do điều

khiển đơn giản, giá cả phải chăng.

Hình 14.1. Động cơ DC

1.1. Định nghĩa

Động cơ một chiều DC ( DC là từ viết tắt của "Direct Current Motors") là Động cơ điều khiển bằng dòng có hƣớng xác định hay nói dễ hiểu hơn thì đây là loại động cơ chạy bằng nguồn điện áp DC- điện áp 1 chiều(Khác với điện áp AC xoay chiều). Đầu dây ra của đông cơ thƣờng gồm hai dây (dây nguồn- VCC và dây tiếp đất- GND). DC motor là một động cơ một chiều với cơ năng quay liên tục. Khi ta cung cấp năng lƣợng, động cơ DC sẽ bắt đầu quay, chuyển điện năng

129

vòng quay/ phút). Tốc độ không tải của động cơ DC nếu không giảm tốc có thể đạt từ 1000RPM tới 40.000RPM.

Ví dụ: Một động cơ DC RS775-9009 có tốc độ quay 22.000RPM cùng với

hộp giảm tốc Planet.

Ứng dụng của động cơ DC cũng rất đa dạng và hầu hết trong mọi lĩnh vực của đời sống. Trong tivi, trong đài FM, ổ đĩa DC, máy in- photo, máy công nghiệp...v...v.

Đối với động cơ điện 1 chiều có loại không chổi than (Brussless DC Motor-

BLDC) và động cơ có chổi than (Brush DC Motor- DC Motor). Do động cơ BLDC

thực chất là động cơ điện 3 pha không đồng bộvì vậy mình chỉ xét động cơ điện 1

chiều có chổi than.

1.2. Phân loại động cơ điện một chiều (đây là cách phân loại theo cách kích từ)

Động cơ điện 1 chiều phân loại theo kích từthành những loại sau:

-Kích từđộc lập.

-Kích từ song song.

-Kích từ nối tiếp.

-Kích từ hỗn hợp.

Với mỗi 1 loại động cơ điện 1 chiều nhƣ trên thì có các ứng dụng khác nhau.

Nhƣng trên thực tế, ta chủ yếu tiếp xúc với loại động cơ DC công suất thấp có phần

Stator sử dụng nam châm vĩnh cửu nên thông thƣờng là không cần đến phần kích từ

cho động cơ. Ta nói đến và quan tâm tới kích từ cho động cơ DC khi nói đến các

loại động cơ DC công suất lớn, Stator của động cơ không phải là nam châm vĩnh

cửu mà là nam châm điện. Phần nam châm điện này cũng gồm lõi thép kỹ thuật và

các bó dây. Để Stator biến thành nam châm điện ta cần phải cấp điện cho phần

Startor của nó, khi đó ta gọi nó là kích từ. Nhƣ vậy với những loại động cơ DC

chúng ta tiếp cận không cần phải quan tâm tới "kích từ" của nó.

1.3. Cấu tạo và nguyên tắc hoạt động

- Cấu tạo:

Gồm có 3 phần chính stator( phần cảm), rotor ( phần ứng), và phần cổgóp- chỉnh

lƣu

130

Cấu tạo chi tiết động cơ DC với phần than lộ và phần rotor dây đồng

- Stator của động cơ điện 1 chiều thƣờng là 1 hay nhiều cặp nam châm vĩnh

cửu, hay nam châm điện.

- Rotor có các cuộn dây quấn và đƣợc nối với nguồn điện một chiều.

- Bộ phận chỉnh lƣu, nó có nhiệm vụlà đổi chiều dòng điện trong khi chuyển

động quay của rotor là liên tục. Thông thƣờng bộ phận này gồm có một bộ cổgóp

và một bộ chổi than tiếp xúc với cổ góp.

- Nguyên lý hoạt động

Pha 1: Từ trƣờng của rotor cùng cực với stator, sẽ đẩy nhau tạo ra chuyển

động quay của rotor.

Pha 2: Rotor tiếp tục quay

Pha 3: Bộ phận chỉnh điện sẽ đổi cực sao cho từ trƣờng giữa stator và rotor

cùng dấu, trở lại pha

1.4.Điều chỉnh tốc độđộng cơ điện một chiều

131

-Thay đổi điện áp phần ứng.

-Thay đổi điện trở mạch rotor.

-Thay đổi từ thông.

Trên thực tế phƣơng pháp đƣợc sử dụng nhiều nhất là thay đổi điện áp phần ứng.

Trong đó điển hình là phƣơng pháp thay đổi độ rộng xung PWM.

2. Phần cứng * Chuẩn bị:

- Động cơ DC 12 V - Board Arduino

- Breadboard và dây nối

- Bộ điều khiển L298N

Hình 14.3. Bo mạch L298 - Thông số kỹ thuật:

Driver: L298N tích hợp hai mạch cầu H. Điện áp điều khiển: +5 V ~ +12 V

Dòng tối đa cho mỗi cầu H là: 2A (=>2A cho mỗi motor) Điện áp của tín hiệu điều khiển: +5 V ~ +7 V

Dòng của tín hiệu điều khiển: 0 ~ 36mA (Arduino có thể chơi đến 40mA nên khỏe re nhé các bạn)

Công suất hao phí: 20W (khi nhiệt độ T = 75 ℃)

132

- L298 chức năngcác chân:

- 12V power, 5V power.: Đây là 2 chân cấp nguồn trực tiếp đến động cơ. Ta có thể cấp nguồn 9-12V ở 12V.

- jumper 5V, nếu để nhƣ hình ở trên thì sẽ có nguồn 5V ra ở cổng 5V power, ngƣợc lại thì không. Ta để nhƣ hình thì ta chỉ cần cấp nguồn 12V vào ở 12V power là có 5V ở 5V power, từ đó cấp cho Arduino

- Power GND chân này là GND của nguồn cấp cho Động cơ.

Chú ý: Nếu dùng Arduino thì nối với GND của Arduino - 2 Jump A enable và B enable, để nhƣ hình

Một phần của tài liệu Giáo trình vi điều khiển (Trang 120)

Tải bản đầy đủ (PDF)

(154 trang)