QC

Servo Motor Interfacing with 8051 Microcontroller

 Servo Motor Interfacing with 8051 Microcontroller



Động cơ servo rất hữu ích trong điện tử và hệ thống nhúng. Bạn có thể tìm thấy việc sử dụng động cơ Servo ở khắp mọi nơi xung quanh bạn, chúng được sử dụng trong đồ chơi, rô bốt, khay đĩa CD của máy tính, ô tô, máy bay, v.v. Lý do của phạm vi rộng này là do động cơ servo rất đáng tin cậy và chính xác. Chúng tôi có thể xoay nó đến bất kỳ góc cụ thể nào. Chúng có sẵn trong phạm vi rộng, từ động cơ mô-men xoắn cao đến động cơ mô-men xoắn thấp. Trong hướng dẫn này, chúng ta sẽ giao diện động cơ servo với vi điều khiển 8051 (AT89S52).


Đầu tiên chúng ta cần hiểu nguyên lý hoạt động của động cơ servo. Động cơ servo hoạt động trên cơ chế chính PWM (Điều chế độ rộng xung), có nghĩa là góc quay của nó được điều khiển bởi khoảng thời gian xung áp dụng cho mã PIN điều khiển của nó. Về cơ bản động cơ servo được tạo thành từ động cơ DC được điều khiển bởi một biến trở (chiết áp) và một số bánh răng. Lực tốc độ cao của động cơ điện một chiều được chuyển thành mô-men xoắn bằng Bánh răng. Chúng ta biết rằng WORK = FORCE X DISTANCE, trong động cơ DC Lực nhỏ hơn và khoảng cách (tốc độ) cao và trong Servo, lực cao và khoảng cách nhỏ hơn. Chiết áp được kết nối với trục đầu ra của Servo, để tính toán góc và dừng động cơ DC ở góc yêu cầu.


Động cơ servo có thể xoay từ 0 đến 180 độ, nhưng nó có thể lên đến 210 độ, tùy thuộc vào nhà sản xuất. Mức độ quay này có thể được kiểm soát bằng cách áp dụng xung LOGIC mức 1 trong khoảng thời gian từ 1ms đến 2ms. 1 ms có thể xoay servo đến 0 độ, 1,5ms có thể xoay 90 độ và xung 2 ms có thể xoay nó đến 180 độ. Khoảng thời gian từ 1 đến 2 ms có thể xoay động cơ Servo đến bất kỳ góc nào từ 0 đến 180 độ.


Circuit Diagram and Working Explanation



Động cơ servo có ba dây Màu đỏ cho Vcc (nguồn điện), Màu nâu cho Mặt đất, và Màu cam là dây điều khiển. Dây điều khiển có thể kết nối với 8051, chúng ta đã kết nối nó với Chân 2.1 của 8051. Bây giờ chúng ta phải giữ chân này ở Logic 1 trong 1ms để xoay nó 0 độ, 1,5ms cho 90 độ, 2 ms cho 180 độ. Chúng tôi đã sử dụng trên chip Timers của 8051 để tạo ra độ trễ. Chúng tôi đã tạo độ trễ 50us thông qua hàm “servo_delay” và sử dụng vòng lặp “for” để tạo độ trễ theo bội số của 50us.


Chúng tôi đang sử dụng Bộ hẹn giờ 0 và ở Chế độ 1, vì vậy chúng tôi đã đưa 01H vào thanh ghi TMOD. Chế độ 1 là chế độ bộ định thời 16 bit và TH0 chứa byte Cao và TL0 chứa byte Thấp của bộ định thời 16 bit. Chúng tôi đã đặt FFD2 trong thanh ghi bộ định thời 16 bit, FF trong TH0 và D2 ​​trong TL0. Đặt FFD2 sẽ tạo ra độ trễ khoảng. 50 us với tinh thể 11.0592MHz. TR0 và TF0 là các bit của thanh ghi TCON, chân TR dùng để khởi động bộ định thời khi set và dừng khi reset (0). TF là cờ tràn, được thiết lập bởi phần cứng khi bị tràn và cần phải đặt lại bằng phần mềm. Về cơ bản TF cho biết sự hoàn thành của Timer, và được thiết lập bởi phần cứng khi 16 timer chuyển từ FFFFH đến 0000H. Bạn có thể đọc về “Bộ định thời 8051” để hiểu cách tính giá trị trong thanh ghi bộ định thời, để tạo ra độ trễ 50 us.


Bây giờ khi được đo từ CRO, 13 vòng của hàm servo_delay sẽ cho độ trễ là 1ms, vì vậy chúng tôi đã bắt đầu từ 1ms (13 vòng) và chuyển sang 2 ms (26 vòng) để xoay servo từ 0 đến 180 độ. Nhưng chúng tôi đã từ từ tăng độ trễ từ 1ms, chúng tôi đã chia cửa sổ 1ms đến 2 ms thành 7 phần như 1,14ms, 1,28 ms, 1,42ms, v.v., do đó, servo sẽ quay theo bội số khoảng. 26 độ (180/7). Sau 180 độ nó sẽ tự động trở về 0 độ.


// C program for interfacing servo motor with 8051 microcontroller

#include<reg51.h>
sbit output=P2^0;

void msdelay(unsigned int time)  // Function for creating delay in milliseconds.
{
    unsigned i,j ;
    for(i=0;i<time;i++)    
    for(j=0;j<1275;j++);
}

void servo_delay(int times)     // Creating Delay in multilple of 50us using 8051 Timers
{
    int m;
    for(m=0;m<times;m++)
    {
        TH0=0xFF;
        TL0=0xD2;
        TR0=1;
        while(TF0==0);
        TF0=0;
        TR0=0;
    }
}
void main()
{
    int n;
    TMOD=0x01;                // Selecting Timer 0, Mode 1
    output=0;
    while(1)
    {
        for(n=13;n<28;n=n+2)
        {
            output=1;
            servo_delay(n);     
            output=0;
            servo_delay(260);
            msdelay(200);
        }
    }
}








Hex

 :020000040800F2 :10000000000003200D3700085D3700085D37000849 :100010005D3700085D3700085D3700085D37000870 :100020000000000000000000000000005D...