Hướng dẫn cách giao tiếp Mô tơ SG-90 với TM4C123

Hướng dẫn cách giao tiếp Mô tơ SG-90 với TM4C123

Trong bài viết hướng dẫn này, chúng ta sẽ học cách giao tiếp động cơ servo SG-90 với TM4C123 Tiva Launchpad.

Để giao tiếp các thiết bị truyền động như động cơ servo với TM4C123, chúng ta nên sử dụng các chân đầu vào-đầu ra vi điều khiển TM4C123GH6PM làm digital output pins.

Bởi vì chúng ta sẽ cung cấp tín hiệu điều khiển từ Tiva Launchpad đến động cơ servo để điều khiển chuyển động quay. Chúng ta sẽ sử dụng Keil uvision để viết một chương trình TM4C123 sẽ điều khiển động cơ servo SG-90.

Hướng dẫn cách giao tiếp Mô tơ SG-90 với TM4C123

Giới thiệu mô tơ Servo SG-90

SG90 là mô tơ servo giá rẻ và công suất đầu ra cao. Nó có thể xoay lên đến 180 độ và mỗi bước có thể tối đa là 90 độ.

Hơn nữa, nó đủ nhỏ để có thể dễ dàng lắp vào ARM robot hoặc các dự án robot tránh chướng ngại vật. Trên hết, nó chỉ yêu cầu một tín hiệu xung đầu ra để điều khiển chuyển động.

Giới thiệu mô tơ Servo SG-90

Sơ đồ chân SG90 (PIN)

Hình dưới đây mô tả sơ đồ chân của mô tơ servo SG90. Nó chỉ bao gồm ba chân như PWM, nối đất và chân Vcc.

Dây nâu, cam và đỏ lần lượt là chân GND, Vcc và PWM. Chi tiết và chức năng của từng pin được liệt kê trong phần tiếp theo.

Sơ đồ chân SG90 (PIN)

Chi tiết cấu hình PIN

Vcc và nối đất, như tên gọi của chúng cho thấy, là các chân cấp nguồn được sử dụng để cấp nguồn cho động cơ servo. Chỉ cần tín hiệu nguồn 5 vôn để cấp nguồn cho động cơ này.

Chủ yếu là các bộ vi điều khiển hoặc bảng phát triển có nguồn cung cấp 5 volt trên bo mạch mà chúng ta có thể sử dụng để cấp nguồn cho các servo SG90.

Nhưng vấn đề duy nhất với TM4C123 Tiva Launchpad là nó không chứa nguồn điện 5 volt trên bo mạch.

Do đó, bạn nên sử dụng nguồn điện 5 volt bên ngoài để cấp nguồn cho động cơ servo SG90. Nhưng hãy đảm bảo các đầu cuối nối đất chung của TM4C123, nguồn điện 5 volt bên ngoài và động cơ servo.

PWM Pin là một chân đầu vào của động cơ servo. Chúng tôi cung cấp tín hiệu đầu ra PWM từ bộ vi điều khiển TM4C123 để điều khiển động cơ servo thông qua chân này.

Bảng này mô tả ngắn gọn tất cả ba chân:

Dây động cơ Màu sắc có thể có của mỗi dây
Vcc pin Red
GND pin Black, or brown
Control Signal / PWM pin Yellow, orange, or white

Làm thế nào để điều khiển chuyển động động cơ Servo?

Vị trí của bộ quay servo liên quan trực tiếp đến xung độ rộng được áp dụng cho tín hiệu PWM của động cơ.

Để điều khiển quay, chúng tôi áp dụng xung vào chân PWM của động cơ servo. Tần số của tín hiệu PWM phải là 50Hz. Điều đó có nghĩa là xung tín hiệu điều khiển nên được áp dụng cho chân PWM sau mỗi 20ms. Độ rộng của xung có quan hệ trực tiếp với vị trí góc của động cơ.

Đối với động cơ servo loại SG90, độ rộng xung 1ms trên giây để quay 0 độ, 1,5ms đến 90 độ và quay 2ms đến 180 độ.

Do đó, độ rộng xung từ 1ms đến 2ms điều khiển vị trí trục của động cơ servo trong khoảng từ 0 đến 180 độ.

Sơ đồ kết nối TM4C123 và SG-90

Bây giờ hãy kết nối với động cơ servo TM4C123 và SG-90 theo sơ đồ này. Trong hướng dẫn này, chúng tôi sử dụng PA4 của Tiva Launchpad để cung cấp tín hiệu xung cho động cơ servo. Hơn nữa, bạn nên cấp nguồn cho SG-90 bằng nguồn điện 5 volt riêng biệt.

Sơ đồ kết nối TM4C123 và SG-90

Mã trong Keil uvision để kết nối TM4C123 và SG-90

Trong mã demo này, chúng tôi tạo ba chức năng như servo0, servo90, servo180, xoay động cơ servo tương ứng 0, 90 và 180 độ. Tín hiệu xung được cung cấp thông qua một chân PA4 của vi điều khiển TM4C123.

Mã này được viết bằng Keil uvision. Bạn chỉ cần sao chép mã này và tạo một dự án mới trong keil uvision. Nếu bạn là người mới bắt đầu với TM4C123 và không sử dụng Keil IDE trước đó, bạn có thể đọc các hướng dẫn bắt đầu sau:

/*header files for TM4C123 device*/
#include "TM4C123GH6PM.h"
#include <stdio.h>


#define two_second 1000000 // two second delay from micro second delay function 

/*Function prototype for microsecond delay function and servo rotation*/
void Delay_MicroSecond(int time); // generates delay in microseconds
void Servo_0_Degree(void);  // 3% duty cycle of 50Hz pulse
void Servo_90_Degree(void); // 7% duty cycle of 50Hz pulse
void Servo_180_Degree(void);// 12% duty cycle of 50Hz pulse

/* main code to control servo motor angular movement */
int main(void)
{
 /* PA4 as a digital output signal to provide trigger signal */
      SYSCTL->RCGCGPIO |= 1;      /* enable clock to PORTA */
      GPIOA->DIR |=(1<<4);         /* set PA4 as a digial output pin */
      GPIOA->DEN |=(1<<4);         /* make PA4 as digital pin */
      while(1)
    {
            
      Servo_0_Degree();
      Delay_MicroSecond(two_second);
      Servo_90_Degree();
      Delay_MicroSecond(two_second);
      Servo_180_Degree();
       Delay_MicroSecond(two_second); 
    }
    
}

/* This function generate a 3% duty cycle from 20ms PWM signal or 50Hz*/
void Servo_0_Degree(void)
{
   int i=0;  	 
    for(i=0; i<50; i++) 
    {
      /* Given 10us trigger pulse */
      GPIOA->DATA |= (1<<4); /* make control  pin high */
      Delay_MicroSecond(600); /*0.6ms seconds delay */
      GPIOA->DATA &= ~(1<<4); /* make control  pin low */
      Delay_MicroSecond(19400); /*1.94ms seconds delay */
  }
}
/* This function generate a 7% duty cycle from 20ms PWM signal or 50Hz*/
void Servo_90_Degree(void)
{
   int i=0; 
     for(i=0; i<50; i++) 
    {	
    /* Given 10us trigger pulse */
      GPIOA->DATA |= (1<<4); /* make control  pin high */
      Delay_MicroSecond(1400); /*1.4ms seconds delay */
      GPIOA->DATA &= ~(1<<4); /* make control  pin low */
      Delay_MicroSecond(18600); /*1.86ms seconds delay */
        }
}
/* This function generate a 12% duty cycle from 20ms PWM signal or 50Hz*/
void Servo_180_Degree(void)
{
   	int i=0; 
      for(i=0; i<50; i++) 
    {
      /* Given 10us trigger pulse */
      GPIOA->DATA |= (1<<4); /* make control  pin high */
      Delay_MicroSecond(2400); /*2.4ms seconds delay */
      GPIOA->DATA &= ~(1<<4); /* make trigger  pin high */
      Delay_MicroSecond(17600); /*1.76ms seconds delay */
        }
}


/* Create one microsecond second delay using Timer block 1 and sub timer A */

void Delay_MicroSecond(int time)
{
    int i;
    SYSCTL->RCGCTIMER |= 2;     /* enable clock to Timer Block 1 */
    TIMER1->CTL = 0;            /* disable Timer before initialization */
    TIMER1->CFG = 0x04;         /* 16-bit option */ 
    TIMER1->TAMR = 0x02;        /* periodic mode and down-counter */
    TIMER1->TAILR = 16 - 1;  /* TimerA interval load value reg */
    TIMER1->ICR = 0x1;          /* clear the TimerA timeout flag */
    TIMER1->CTL |= 0x01;        /* enable Timer A after initialization */

    for(i = 0; i < time; i++)
    {
        while ((TIMER1->RIS & 0x1) == 0) ;      /* wait for TimerA timeout flag */
        TIMER1->ICR = 0x1;      /* clear the TimerA timeout flag */
    }
}

/* This function is called by the startup assembly code to perform system specific initialization tasks. */
void SystemInit(void)
{
    __disable_irq();    /* disable all IRQs */
    
    /* Grant coprocessor access */
    /* This is required since TM4C123G has a floating point coprocessor */
    SCB->CPACR |= 0x00F00000;
}

Code hoạt động như thế nào?

Như đã thảo luận trước đó, để điều khiển vị trí góc của động cơ servo, chúng tôi áp dụng các xung của các chu kỳ nhiệm vụ khác nhau để điều khiển chân cho mỗi 20ms.

Điều đó có nghĩa là tần số của tín hiệu PWM phải là 50Hz. Chu kỳ làm việc của tín hiệu PWM 50Hz xác định vị trí góc của động cơ.

Kiểm soát thực tế của động cơ này là giữa +90 độ và -90 độ. Do đó, để điều khiển vị trí trục, chúng ta cần áp dụng chu kỳ làm việc có độ rộng xung từ 0,6ms đến 2,4ms.

Do đó, chúng tôi tạo ra ba chức năng để áp dụng các xung chu kỳ làm việc 3%, 7% và 12% từ TM4C123 để điều khiển chân của động cơ servo.

/* This function generate a 3% duty cycle from 20ms PWM signal or 50Hz*/
void Servo_0_Degree(void)
{
   int i=0;  	 
    for(i=0; i<50; i++) 
    {
      /* Given 3% duty cycle trigger pulse */
      GPIOA->DATA |= (1<<4); /* make control  pin high */
      Delay_MicroSecond(600); /*0.6ms seconds delay */
      GPIOA->DATA &= ~(1<<4); /* make control  pin low */
      Delay_MicroSecond(19400); /*1.94ms seconds delay */
  }
}
/* This function generate a 7% duty cycle from 20ms PWM signal or 50Hz*/
void Servo_90_Degree(void)
{
   int i=0; 
     for(i=0; i<50; i++) 
    {	
    /*  Given 7% duty cycle trigger pulse */
      GPIOA->DATA |= (1<<4); /* make control  pin high */
      Delay_MicroSecond(1400); /*1.4ms seconds delay */
      GPIOA->DATA &= ~(1<<4); /* make control  pin low */
      Delay_MicroSecond(18600); /*1.86ms seconds delay */
        }
}
/* This function generate a 12% duty cycle from 20ms PWM signal or 50Hz*/
void Servo_180_Degree(void)
{
   	int i=0; 
      for(i=0; i<50; i++) 
         {
      /*  Given 12% duty cycle trigger pulse */
      GPIOA->DATA |= (1<<4); /* make control  pin high */
      Delay_MicroSecond(2400); /*2.4ms seconds delay */
      GPIOA->DATA &= ~(1<<4); /* make trigger  pin high */
      Delay_MicroSecond(17600); /*1.76ms seconds delay */
         }
}

Để có được độ trễ chính xác một micro giây từ vi điều khiển TM4C123GH6PM, chúng tôi sử dụng Timer1 và sunblock A là Timer1A của TM4C123.

Hàm Delay_MicroSecond () này tạo ra độ trễ theo bội số của một micro giây. Đối số đầu vào cho hàm này xác định số lượng thời gian trễ micro giây.

* Create one microsecond second delay using Timer block 1 and sub timer A */

void Delay_MicroSecond(int time)
{
    int i;
    SYSCTL->RCGCTIMER |= 2;     /* enable clock to Timer Block 1 */
    TIMER1->CTL = 0;            /* disable Timer before initialization */
    TIMER1->CFG = 0x04;         /* 16-bit option */ 
    TIMER1->TAMR = 0x02;        /* periodic mode and down-counter */
    TIMER1->TAILR = 16 - 1;  /* TimerA interval load value reg */
    TIMER1->ICR = 0x1;          /* clear the TimerA timeout flag */
    TIMER1->CTL |= 0x01;        /* enable Timer A after initialization */

    for(i = 0; i < time; i++)
    {
        while ((TIMER1->RIS & 0x1) == 0) ;      /* wait for TimerA timeout flag */
        TIMER1->ICR = 0x1;      /* clear the TimerA timeout flag */
    }
}

Bên trong mã chính, chúng ta cấu hình chân PORTA PA4 của TM4C123 làm digital output pin bằng cách bật đồng hồ hệ thống thành PORTA. Ngoài ra, thiết lập PA4 làm digital output pin.

* PA4 as a digital output signal to provide trigger signal */
SYSCTL->RCGCGPIO |= 1;      /* enable clock to PORTA */
GPIOA->DIR |=(1<<4);         /* set PA4 as a digial output pin */
GPIOA->DEN |=(1<<4);         /* make PA4 as digital pin */

Mã bên trong while (1) sẽ tiếp tục thực thi lặp đi lặp lại. Hơn nữa, bên trong vòng lặp while (1), chúng ta gọi các hàm Servo_0_Degree (), Servo_90_Degree () và Servo_180_Degree () để điều khiển vị trí góc của động cơ theo chức năng của các hàm này như đã định nghĩa ở trên.

while(1)
{
            
Servo_0_Degree();
Delay_MicroSecond(two_second);
Servo_90_Degree();
Delay_MicroSecond(two_second);
Servo_180_Degree();
Delay_MicroSecond(two_second); 
}

Tóm lại, mã này đầu tiên đặt vị trí góc thành 0 độ, tiếp theo là 90 độ và quay lại vị trí bắt đầu của dịch chuyển 180 độ, tức là một góc giữa +90 và -90 độ.

Demo phần cứng SG-90

Trong bản demo này, như bạn có thể thấy rằng động cơ servo quay từ +90 đến -90 độ. Chân PA4 của TM4C123 Tiva Launchpad cung cấp tín hiệu điều khiển tới servo SG-90.

https://www.youtube.com/watch?v=dkVDchK_2WQ

Bài viết cùng chuyên mục

NHANH

NHANH

Vì Đổi mới liên tục nên Nhanh hơn

ĐÚNG

ĐÚNG

Coi trọng và ưu tiên việc làm Đúng

ĐỦ

ĐỦ

Tìm và mua Đủ Đơn hàng hơn

KỊP THỜI

KỊP THỜI

Hiệu suất tối ưu bởi Kịp Thời hơn