Kênh Tên Miền chuyên cung cấp tên miền đẹp, giá rẻ! Hãy liên hệ kỹ thuật: 0914205579 - Kinh doanh: 0912191357 để được tư vấn, hướng dẫn miễn phí, Cảm ơn quý khách đã ủng hộ trong thời gian qua!
Sunday, February 16, 2014



Chào các bạn hôm nay mình xin gới thiệu cách điều khiển động cơ servo RC sử dụng PIC16F877A 


Nhưng trước hết mình sẽ giới thiệu một chút về loại động cơ này:

Loại động cơ servo RC này được sử dụng rất nhiều trong các mô hình máy bay và robot
RC: nghĩ là radio controlled ( điều khiển bằng sóng vô tuyến )

Bên trong của động cơ gồm :
      1 động cơ DC
      1 chuỗi các bánh răng giảm tốc
      1 mạch điều khiển
      1 biến trở ( dùng để phản hồi vị trí của servo bằng điện áp )




Nguồn cấp cho động cơ servo RC thường từ 4.8V đến 7.2V
Một động cơ servo RC sẽ có 3 sợi cáp ( 2 sợi nguồn và 1 sợi xung điều khiển ) còn muốn biết đâu là sợi nguồn đâu là sợi xung thì bạn nên tìm trong datasheet của nó .
Động cơ servo RC được thiết kế để quay có giới hạn ( khoảng 270 độ theo datasheet của 1 số loại )

Trục của động cơ servo RC được định vị theo kĩ thuật điều biến độ rộng xung PWM
Mạch của động cơ chỉ đáp ứng một dãy xung có tần số 50Hz với độ rộng của xung (mức cao của xung) biến thiên từ 1ms đến 2ms, hình sau miêu tả đặc tính của xung điều khiển:




 20ms chính là chu kì của xung (50Hz)
1.5ms chính là độ rộng của xung tương ứng với vị trí của trục động cơ , ta cẩn phải điều điều khiển để thay đổi giá trị này để diều khiển động cơ quay tới góc quay mà ta mong muốn


 Hình sau chỉ sự tương quan giữa vị trí của trục servo với độ rộng của xung điều khiển:


Đa số các động cơ servo RC trên thị trường điều dùng xung có độ rộng từ 1ms -2ms để điều khiển
một số loại khác thì không nằm trong khoảng này.


OK thế là đủ một chút kiến thức cơ bản ,mình sẽ vào vấn đề chính, dùng cách nào để điều khiển loại động cơ này, theo mình thì có 3 cách:
 --Dùng IC chuyên dụng để điều khiển ( miễn bàn tới)
 --Dùng vi mạch NE555 để điều khiển ( cái này là kiến thức cơ bản cho dân điện tử ,mình không bàn tới )
--Dùng vi xử lý ( cái này thì quá tuyệt vời cho những ai thích khám phá và mày mò nghiên cứu)

Mình yêu vi xử lý!

Ở đây mình dùng dòng vi xử lý PIC và MSP430 ( MSP430 sẽ gới thiệu sau ) và dùng C để lập trình
 Cách 1: Bật tắt cổng xuất của PIC theo hàm delay_ms() hoặc delay_us() để tạo xung
   while(true) //vòng lặp
          {
             output_high(PIN_C0); //bật chân RC0
             delay_us(1500);        // chờ 1,5ms
             output_low(PIN_C0); //tắt chân RC0
             delay_ms(20);          //chờ 20ms
         }

( nói thật là cách này quá tệ!)

Cách 2: dùng ngắt timer để bật tắt các chân ra để tạo xung (cách này yêu cầu các bạn phải hiểu rõ về cấu tạo timer trong PIC16F877A) cách này trông PRO hơn

Mình chọn timer0 để tạo xung vì timer0 có thể tạo ra tần số thấp cho ứng dụng này
mình set timer0 sao cho timer0 tràn mỗi 0,1ms , khi timer0 tràn sẽ sinh ra 1 cờ ngắt và hàm set_servo sẽ chạy, sau khi kết thúc chương trình sẽ tự động xóa cờ ngắt và chương trình chờ cờ ngắt kế tiếp,
mình sử dụng các biến value , value1 , value2 , value3 để điều khiển độ rộng của xung tương ứng với 4 chân xuất xung RC0 , RC1 , RC2 , RC3.

Ví dụ như chọn value=10 thì xung ra sẽ là 10*0,1=1ms hoặc value3=15 thì xung ra là 15*0,1=1,5ms...

Sau đây là đoạn code demo(dùng CCS để viết) :

#use delay(clock=16000000)
char dem;
char value,value1,value2,value3;
#INT_TIMER0
void set_servo()
 {
   set_timer0(155);
   dem++;             //biến đếm tăng thêm 1 giá trị mỗi 0,1ms
   if (dem >= 200)  // 200*0,1=20ms (xung 50Hz)
    {
      dem=0;   // reset biến đếm
      RC1=1;   //bât cổng
      RC2=1;
      RC3=1;
      RC4=1;
    }
   if (dem >= value)RC1=0;  //tắt cổng
   if (dem >= value1)RC2=0; 
   if (dem >= value2)RC3=0; 
   if (dem >= value3)RC4=0; 
 }


void main()
{
set_tris_c(0x00);  //set các chân ở port C điều là chân xuất
portC = 0x00;
enable_interrupts(int_timer0); //cho phép ngắt timer0
enable_interrupts(global);
setup_timer_0(RTCC_INTERNAL|RTCC_DIV_4); //chon tần số cho timer0 từ clock chính (16MHz)
set_timer0(155); //cài đặt timer để timer0 tràn mỗi 0,1ms
while(true)      //vòng lặp
 {
 value=10;    //giá trị gán cho các biến để điều khiển độ rộng xung
 value1=18;
 value2=12;
 value3=20;
 }
}

Đây là dạng sóng ra trên các chân RC0 ,RC1 ,RC2 ,RC3 (dùng chương trình mô phỏng)


 

 Như vậy với code này thì mình có thể điều khiển 4 servo RC cùng 1 lúc hoặc có thể điều khiển nhiều động cơ servo RC hơn










                                                        
                                                                              Nguồn : http://phanhoangthach.blogspot.com/

0 comments:

Post a Comment

domain, domain name, premium domain name for sales

Popular Posts