- Động cơ Servo
- Điều khiển động cơ Servo bằng LPC2148 PWM & ADC
- Chân PWM & ADC trong ARM7-LPC2148
- Thành phần bắt buộc
- Sơ đồ mạch và kết nối
- Lập trình ARM7-LPC2148 để điều khiển động cơ Servo
Trong hướng dẫn trước của chúng tôi, chúng tôi đã giao tiếp động cơ bước với ARM7-LPC2148. Trong hướng dẫn này, chúng tôi sẽ điều khiển Động cơ Servo bằng ARM7-LPC2148. Động cơ servo có lợi thế tiêu thụ điện năng thấp hơn động cơ bước. Động cơ servo ngừng tiêu thụ điện khi đạt đến vị trí mong muốn nhưng động cơ bước tiếp tục tiêu thụ điện năng để khóa trục ở vị trí mong muốn. Động cơ servo hầu hết được sử dụng trong các Dự án Robot vì độ chính xác và dễ xử lý của chúng.
Trong hướng dẫn này, chúng ta sẽ tìm hiểu về Động cơ Servo và Cách giao tiếp Servo với ARM7-LPC2148. Một chiết áp cũng được giao tiếp để thay đổi vị trí của trục của động cơ servo và một màn hình LCD để hiển thị giá trị góc.
Động cơ Servo
Động cơ Servo là sự kết hợp của động cơ DC, hệ thống điều khiển vị trí và bánh răng. Vòng quay của động cơ Servo được điều khiển bằng cách áp dụng tín hiệu PWM cho nó, chiều rộng của tín hiệu PWM quyết định góc quay và hướng của động cơ. Ở đây chúng tôi sẽ sử dụng Động cơ Servo SG90 trong hướng dẫn này, nó là một trong những loại phổ biến và rẻ nhất. SG90 là một servo 180 độ. Vì vậy, với servo này, chúng tôi có thể định vị trục từ 0-180 độ:
- Điện áp hoạt động: + 5V
- Loại bánh răng: Nhựa
- Góc quay: 0 đến 180 độ
- Trọng lượng: 9gm
- Mô-men xoắn: 2,5kg / cm
Trước khi có thể bắt đầu lập trình cho động cơ Servo, chúng ta nên biết loại tín hiệu nào sẽ được gửi để điều khiển động cơ Servo. Chúng ta nên lập trình MCU để gửi tín hiệu PWM đến dây tín hiệu của động cơ Servo. Có một mạch điều khiển bên trong động cơ servo đọc chu kỳ làm việc của tín hiệu PWM và đặt trục động cơ servo ở vị trí tương ứng như thể hiện trong hình bên dưới
Cứ 20 mili giây động cơ Servo kiểm tra xung. Vì vậy, hãy điều chỉnh độ rộng xung của tín hiệu để quay trục của động cơ.
- Độ rộng xung 1 ms (1 mili giây) để xoay servo về 0 độ
- Độ rộng xung 1,5ms để xoay 90 độ (vị trí trung tính)
- Độ rộng xung 2 ms để xoay servo đến 180 độ.
Trước khi Kết nối Servo với ARM7-LPC2148, bạn có thể kiểm tra servo của mình với sự trợ giúp của Mạch kiểm tra động cơ Servo này. Ngoài ra, hãy kiểm tra cách một động cơ servo có thể được giao tiếp với các Bộ vi điều khiển khác:
- Điều khiển động cơ Servo bằng Arduino
- Giao diện động cơ servo với vi điều khiển 8051
- Điều khiển động cơ Servo bằng MATLAB
- Điều khiển động cơ Servo với Raspberry Pi
- Giao tiếp động cơ Servo với MSP430G2
- Giao diện động cơ Servo với STM32F103C8
Điều khiển động cơ Servo bằng LPC2148 PWM & ADC
Một động cơ Servo có thể được điều khiển bởi LPC2148 sử dụng PWM. Bằng cách cung cấp tín hiệu PWM đến chân PWM của SERVO với chu kỳ 20ms và tần số 50Hz, chúng ta có thể định vị trục của động cơ servo xung quanh 180 độ (-90 đến +90).
Một chiết áp được sử dụng để thay đổi chu kỳ làm việc của tín hiệu PWM và quay trục của động cơ servo, phương pháp này được thực hiện bằng cách sử dụng mô-đun ADC trong LPC2148. Vì vậy, chúng ta cần cả khái niệm PWM và ADC được triển khai trong hướng dẫn này. Vì vậy, vui lòng tham khảo các hướng dẫn trước của chúng tôi để tìm hiểu PWM và ADC trong ARM7-LPC2148.
- Cách sử dụng PWM trong ARM7-LPC2148
- Cách sử dụng ADC trong ARM-LPLC2148
Chân PWM & ADC trong ARM7-LPC2148
Hình ảnh bên dưới cho thấy các chân PWM và ADC trong LPC2148. Các hộp màu vàng biểu thị chân (6) PWM và hộp đen biểu thị chân (14) ADC.
Thành phần bắt buộc
Phần cứng
- ARM7-LPC2148
- Mô-đun hiển thị LCD (16x2)
- Động cơ Servo (SG-90)
- Bộ điều chỉnh điện áp 3.3V
- Chiết áp 10k (2 Nos)
- Breadboard
- Kết nối dây
Phần mềm
- Keil uVision5
- Flash Magic Tool
Sơ đồ mạch và kết nối
Bảng dưới đây cho thấy Kết nối giữa Động cơ Servo và ARM7-LPC2148:
PIN SERVO |
ARM7-LPC2148 |
ĐỎ (+ 5V) |
+ 5V |
NÂU (GND) |
GND |
ORANGE (PWM) |
P0.1 |
Chân P0.1 là đầu ra PWM của LPC2148.
Bảng dưới đây cho thấy các kết nối mạch giữa LCD & ARM7-LPC2148.
ARM7-LPC2148 |
LCD (16x2) |
P0.4 |
RS (Đăng ký Chọn) |
P0.6 |
E (Bật) |
P0.12 |
D4 (Chân dữ liệu 4) |
P0.13 |
D5 (Chân dữ liệu 5) |
P0.14 |
D6 (Chân dữ liệu 6) |
P0.15 |
D7 (Chân dữ liệu 7) |
GND |
VSS, R / W, K |
+ 5V |
VDD, A |
Bảng dưới đây cho thấy các kết nối giữa ARM7 LPC2148 và chiết áp với bộ điều chỉnh điện áp 3.3V.
IC điều chỉnh điện áp 3.3V |
Chức năng ghim |
ARM-7 LPC2148 Pin |
1. pin bên trái |
- Ve từ GND |
GND pin |
2.Centre Pin |
Đầu ra + 3.3V quy định |
Để chiết áp Đầu vào và đầu ra của chiết áp tới P0.28 của LPC2148 |
3. pin bên phải |
+ Ve từ 5V ĐẦU VÀO |
+ 5V |
Các điểm cần lưu ý
1. Một bộ điều chỉnh điện áp 3,3V được sử dụng ở đây để cung cấp giá trị đầu vào tương tự cho chân ADC (P0.28) của LPC2148. Vì chúng ta đang sử dụng nguồn 5V, chúng ta cần điều chỉnh điện áp với bộ điều chỉnh điện áp là 3.3V.
2. Một chiết áp được sử dụng để thay đổi điện áp giữa (0V đến 3,3V) để cung cấp đầu vào tương tự (ADC) đến chân LPC2148 P0.28
3. Chân P0.1 của LPC2148 cung cấp đầu ra PWM cho động cơ servo để điều khiển vị trí của động cơ.
4. Theo giá trị đầu vào tương tự (ADC), vị trí của động cơ servo thay đổi từ (0 đến 180 độ) thông qua chân đầu ra PWM tại P0.1 của LPC2148.
Lập trình ARM7-LPC2148 để điều khiển động cơ Servo
Để lập trình ARM7-LPC2148, chúng ta cần công cụ keil uVision & Flash Magic. Chúng tôi đang sử dụng Cáp USB để lập trình Thanh ARM7 qua cổng micro USB. Chúng tôi viết mã bằng Keil và tạo một tệp hex và sau đó tệp HEX được chuyển sang thanh ARM7 bằng Flash Magic. Để biết thêm về cách cài đặt keil uVision và Flash Magic cũng như cách sử dụng chúng, hãy truy cập liên kết Bắt đầu với Vi điều khiển ARM7 LPC2148 và Lập trình bằng Keil uVision.
Các bước liên quan đến việc cấu hình LPC2148 cho PWM & ADC để điều khiển Động cơ Servo
Bước 1: - Bao gồm các tệp tiêu đề cần thiết để mã hóa LPC2148
#include
Bước 2: - Điều tiếp theo là cấu hình PLL để tạo xung nhịp vì nó đặt xung nhịp hệ thống và xung nhịp ngoại vi của LPC2148 theo nhu cầu của người lập trình. Tần số xung nhịp tối đa cho LPC2148 là 60Mhz. Các dòng sau được sử dụng để cấu hình tạo xung nhịp PLL.
void startlizePLL (void) // Hàm sử dụng PLL để tạo xung nhịp { PLL0CON = 0x01; PLL0CFG = 0x24; PLL0FEED = 0xAA; PLL0FEED = 0x55; while (! (PLL0STAT & 0x00000400)); PLL0CON = 0x03; PLL0FEED = 0xAA; PLL0FEED = 0x55; VPBDIV = 0x01; }
Bước 3: - Việc tiếp theo cần làm là chọn các chân PWM và chức năng PWM của LPC2148 bằng cách sử dụng thanh ghi PINSEL. Chúng tôi sử dụng PINSEL0 vì chúng tôi sử dụng P0.1 cho đầu ra PWM của LPC2148.
PINSEL0 - = 0x00000008; // Đặt chân P0.1 của LPC2148 là PWM3
Bước 4: - Tiếp theo, chúng ta cần ĐẶT LẠI bộ định thời bằng PWMTCR (Timer Control Register).
PWMTCR = 0x02; // Đặt lại và tắt bộ đếm cho PWM
Và tiếp theo đặt giá trị tỷ lệ đặt trước quyết định độ phân giải của PWM được đặt.
PWMPR = 0x1D; // Giá trị thanh ghi theo tỷ lệ trước
Bước 5: - Tiếp theo, thiết lập PWMMCR (thanh ghi điều khiển đối sánh PWM) vì nó thiết lập hoạt động như thiết lập lại, ngắt cho PWMMR0 và PWMMR3.
PWMMCR = 0x00000203; // Đặt lại và ngắt trên khớp MR0, ngắt trên khớp MR3
Bước 6: - Khoảng thời gian tối đa của kênh PWM được đặt bằng PWMMR0 và Tấn của chu kỳ nhiệm vụ PWM ban đầu được đặt thành 0,65msec
PWMMR0 = 20000; // Khoảng thời gian của sóng PWM, 20msec PWMMR3 = 650; // Tấn của sóng PWM 0,65 msec
Bước 7: - Tiếp theo, chúng ta cần đặt Latch Enable cho các thanh ghi đối sánh tương ứng bằng PWMLER
PWMLER = 0x09; // Kích hoạt chốt cho PWM3 và PWM0
(Chúng tôi sử dụng PWMMR0 & PWMMR3) Vì vậy, hãy bật bit tương ứng bằng cách đặt 1 trong PWMLER
Bước 8: - Để kích hoạt đầu ra PWM tới chân, chúng ta cần sử dụng PWMTCR để kích hoạt bộ đếm PWM Timer và chế độ PWM.
PWMPCR = 0x0800; // Cho phép PWM3 và PWM 0, PWM điều khiển cạnh đơn PWMTCR = 0x09; // Bật PWM và bộ đếm
Bước 9: - Bây giờ chúng ta cần lấy các giá trị chiết áp để thiết lập chu kỳ nhiệm vụ của PWM từ chân ADC P0.28. Vì vậy, chúng tôi sử dụng mô-đun ADC trong LPC2148 để chuyển đổi đầu vào tương tự chiết áp (0 đến 3,3V) thành các giá trị ADC (0 đến 1023).
Bước 10: - Để chọn chân ADC P0.28 trong LPC2148, chúng tôi sử dụng
PINSEL1 = 0x01000000; // Đặt P0.28 là ADC INPUT AD0CR = (((14) << 8) - (1 << 21)); // Đặt xung nhịp và PDN cho Chuyển đổi A / D
Các dòng sau đây ghi lại đầu vào Analog (0 đến 3,3V) và chuyển nó thành giá trị kỹ thuật số (0 đến 1023). Và sau đó các giá trị kỹ thuật số này được chia cho 4 để chuyển chúng thành (0 đến 255) và cuối cùng được đưa vào dưới dạng đầu ra PWM trong chân P0.1 của LPC2148. Ở đây chúng tôi đang chuyển đổi các giá trị từ 0-1023 thành 0-255 bằng cách chia nó cho 4 vì PWM của LPC2148 có độ phân giải 8-Bit (28).
AD0CR - = (1 << 1); // Chọn kênh AD0.1 trong thanh ghi ADC delaytime (10); AD0CR - = (1 << 24); // Bắt đầu chuyển đổi A / D while ((AD0DR1 & (1 << 31)) == 0); // Kiểm tra bit DONE trong thanh ghi dữ liệu ADC adcvalue = (AD0DR1 >> 6) & 0x3ff; // Lấy KẾT QUẢ từ thanh ghi dữ liệu ADC dutycycle = adcvalue / 4; // công thức lấy giá trị của dutycycle từ (0 đến 255) PWMMR1 = dutycycle; // thiết lập giá trị của dutycycle thành thanh ghi đối sánh PWM PWMLER - = (1 << 1); // Bật đầu ra PWM với giá trị vòng tròn
Bước 11: - Tiếp theo, chúng ta hiển thị các giá trị đó trong module Hiển thị LCD (16X2). Vì vậy, chúng tôi thêm các dòng sau để khởi tạo mô-đun màn hình LCD
Void LCD_INITILIZE (void) // Hàm chuẩn bị sẵn sàng màn hình LCD { IO0DIR = 0x0000FFF0; // Đặt chân P0.12, P0.13, P0.14, P0.15, P0.4, P0.6 làm thời gian trễ OUTPUT (20); LCD_SEND (0x02); // Khởi tạo lcd ở chế độ hoạt động 4 bit LCD_SEND (0x28); // 2 dòng (16X2) LCD_SEND (0x0C); // Hiển thị trên con trỏ tắt LCD_SEND (0x06); // Con trỏ tăng tự động LCD_SEND (0x01); // Hiển thị rõ ràng LCD_SEND (0x80); // Dòng đầu tiên vị trí đầu tiên }
Khi chúng tôi kết nối LCD ở chế độ 4-Bit với LPC2148, chúng tôi cần gửi các giá trị để được hiển thị dưới dạng nibble bằng nibble (Upper Nibble & Lower Nibble). Vì vậy, các dòng sau được sử dụng.
void LCD_DISPLAY (char * msg) // Hàm in các ký tự được gửi lần lượt { uint8_t i = 0; while (msg! = 0) { IO0PIN = ((IO0PIN & 0xFFFF00FF) - ((msg & 0xF0) << 8)); // Gửi phần trên IO0SET = 0x00000050; // RS HIGH & ENABLE HIGH để in dữ liệu IO0CLR = 0x00000020; // RW LOW Thời gian trễ chế độ ghi (2); IO0CLR = 0x00000040; // EN = 0, RS và RW không đổi (tức là RS = 1, RW = 0) thời gian trễ (5); IO0PIN = ((IO0PIN & 0xFFFF00FF) - ((msg & 0x0F) << 12)); // Gửi Lower nibble IO0SET = 0x00000050; // RS & EN HIGH IO0CLR = 0x00000020; thời gian trễ (2); IO0CLR = 0x00000040; thời gian trễ (5); i ++; } }
Để hiển thị các giá trị ADC & PWM đó, chúng ta sử dụng các dòng sau trong hàm int main () .
LCD_SEND (0x80); sprintf (displayadc, "adcvalue =% f", dutycycle); LCD_DISPLAY (displayadc); // Hiển thị giá trị ADC (0 đến 1023) angle = (adcvalue / 5.7); // Công thức chuyển giá trị ADC thành góc (o đến 180 độ) LCD_SEND (0xC0); sprintf (giá trị góc, "ANGLE =%. 2f deg", góc); LCD_DISPLAY (giá trị góc);
Mã hoàn chỉnh và mô tả video của hướng dẫn được cung cấp bên dưới