Động cơ servo là một dạng động cơ đặc biệt chỉ quay khi được điều khiển bằng xung PWM với góc quay nằm trong khoảng từ 0 --> 180 độ. Khác với động cơ dc thông thường chỉ cần cấp điện vào 2 đầu dây là chạy, động cơ servo có thể điều khiển chính xác góc quay.

servo_motor

Nguyên lý điều khiển động cơ servo motor :

Stator của động cơ được cuốn các cuộn dây riêng biệt và Rotor của động cơ là một thanh nam châm vĩnh cửu có từ trường mạnh, nếu thời điểm và dòng điện cấp đến các cuộn dây là chính xác thì chuyển động quay của rotor phụ thuộc hoàn toàn vào tần số và pha.

Như vậy để điều khiển động cơ chúng ta sẽ cấp vào chân điều khiển xung PWM có tần số 50Hz hay chu kì là 20ms, còn độ rộng của xung mới chính là nhân tố thay đổi góc quay. Nếu độ rông xung là 1ms ( có động cơ là 0.5ms) thì động cơ ở vị trí 0 độ, khi độ rộng là 1.5ms ( hoặc 2ms tùy vào từng động cơ) thì động cơ ở vị trí 90 độ, khi độ rộng xung là 2ms ( có động cơ là 2.5ms) thì động cơ ở vị trí 180 độ.

Tóm lại nếu muốn động cơ quay từ 0 độ --> 180 độ thì độ rộng xung sẽ từ  1ms -->2ms ( hoặc 0.5 -->2.5ms) và chu kì luôn là 20ms.

Như vậy muốn điều khiển động cơ dùng vi điều khiển chúng ta chỉ cần tạo ra xung vuông với chu kì 20ms và độ rộng thay đổi từ 1ms-->2ms. Với vi điều khiển PIC chúng ta có thể có 3 cách tạo ra xung như vậy : Các bạn có thể xem lại bài 3 cách tạo xung vuông dùng vi điều khiển PIC

- Dùng hàm delay_us() và delay_ms().

- Dùng Timer

- Dùng PWM.

Trong bài tập này mình chỉ dùng 2 cách là dùng hàm delay và dùng timer còn dùng PWM trong một ví dụ khác về dsPIC mình sẽ trình bày sau.

Lập trình điều khiển động cơ servo motor dùng vi điều khiển PIC  16F887:

Nguyên lý hoạt động trong bài tập này mình sẽ tạo ra xung vuông tần số 50Hz và độ rông xung thay đổi từ 1ms-->2ms, đồng thời lấy mẫu ADC từ một biến trở để điều khiển chính xác góc quay có nghĩa là khi mình xoay biến trở thì động cơ sẽ quay theo.

Cách thứ nhất dùng hàm delay : Cách này dùng hàm delay_us() với adc là thông số đọc từ biến trở

adc = read_adc (); // Đọc giá trị từ biến trở
if(adc>1000) adc=1000;
output_high(PIN_C0);
delay_us(1000);
delay_us(adc);
output_low(PIN_C0);
delay_us(19000-adc);

Cách thứ hai dùng timer : Dùng timer 1 có độ dài là 16 bit tạo một khoảng thời gian trễ là 20ms các bạn có thể tham khảo bài  Bộ định thời Timer và Counter của vi điều khiển PIC 

Độ rộng xung vẫn được xác định bằng các hàm delay_us() và giá trị adc được lấy mẫu từ biến trở 

#INT_TIMER1
void isr_timer1(void){
set_timer1(58035);    // nạp cho giá trị 20ms
output_high(PIN_C0);
delay_us(1000);
delay_us(adc);
output_low(PIN_c0);
}

Các bạn vào Proteus vẽ mạch như hình bên dưới hoặc có thể download bài tập từ link ở cuối bài viết về thực hành mô phỏng nhé !

servo motor

Nguyên lý hoạt động của mạch cũng khá đơn giản khi chân PIN A4 đọc vào có giá trị là mức 1 thì chạy theo cách thứ nhất là dùng hàm delay, còn đọc giá trị logic là 0 thì chạy theo cách thứ 2 là dùng Timer. Các bạn điều chỉnh biến trở để thấy được chuyển động của Motor.

Tóm lại : Động cơ servo DC với ưu điểm là kiểm soát tốc độ chính xác, đặc điểm tốc độ mô-men xoắn rất khó, nguyên tắc điều khiển vận hành đơn giản, dễ sử dụng, giá lại rẻ rất phù hợp trong các ứng dụng làm robot, việc hiểu rõ nguyên lý điều khiển sẽ giúp các bạn làm chủ được thiết bị này.

Download bài tập Điều khiển động cơ servo motor học lập trình vi điều khiển PIC

DƯỚI ĐÂY LÀ MỘT VÀI LINK MUA SẮM CHO VIỆC HỌC PIC :

Mua động cơ Servo motor : Link mua servo motor tại shopee

Mua mạch nạp cho PIC : 

Link mua mạch nạp cho PIC tại shopee

Link mua mạch nạp cho PIC tại sendo

Mua KIT PIC :

Link mua KIT PIC tại shopee

Link mua KIT PIC tại sendo

Mua các dòng vi điều khiển PIC : 

Link mua PIC 12F675 tại shopee

Link mua PIC 12F675 tại sendo

Link mua PIC 16F876A tại shopee

Link mua PIC 16F876A tại sendo

Link mua PIC 16F877A tại shopee

Link mua PIC 16F877A tại sendo

Link mua PIC 16F887 tại shopee

Link mua PIC 16F887 tại sendo

Link mua PIC 18F4550 tại shopee

Link mua PIC 18F4550 tại sendo

Xem video mô phỏng Servo Motor 

Nếu bạn thấy hay hãy đăng ký , chia sẻ giúp tôi nhé chúng tôi sẽ thường xuyên cập nhật kiến thức mới về vi điều khiển PIC tại đây