Wednesday 28 November 2018

Giao Tiếp Động Cơ Servo

Giới thiệu

Động cơ Servo
Động cơ servo là một thiết bị điện được sử dụng để điều khiển chính xác góc quay. Nó được sử dụng khi cần điều khiển chính xác, như trong trường hợp điều khiển cánh tay robot.
  • Nó bao gồm một động cơ phù hợp với mạch điều khiển để điều khiển vị trí chính xác của trục động cơ.
  • Nó là một hệ thống vòng khép kín.
  • Góc quay của mô tơ servo được điều khiển bằng cách áp dụng tín hiệu PWM cho nó.
  • Bằng cách thay đổi độ rộng của tín hiệu PWM, chúng ta có thể thay đổi góc quay và hướng của động cơ.

Tạo PWM bằng 8051 (H1)
Servo SG90 có thời gian chu kỳ nhiệm vụ thực tế cho -90 ° đến +90 xoay khác với lý tưởng.
Tại ~ 0,54ms (chu kỳ nhiệm vụ 2,7%), chúng tôi nhận được vị trí trục ở -90 ° vòng quay của nó.
Tại ~ 1.4ms (chu kỳ nhiệm vụ 7%), chúng tôi nhận được vị trí trục ở 0 ° (trung tính) của vòng quay của nó.
Tại ~ 2.4ms (chu kỳ nhiệm vụ 12%), chúng tôi nhận được vị trí trục tại + 90 ° vòng quay của nó.

Để điều khiển động cơ servo ở giữa -90 ° đến + 90 ° xoay. Chúng ta cần tạo ra dạng sóng PWM là 50Hz với chu kỳ làm việc thay đổi từ ~ 0,54ms đến ~ 2,4ms. Chúng ta có thể tạo PWM bằng Timer trong 8.051.

Interfacing SG90 Micro Servo Motor với 8051

Giao diện động cơ servo với 8051
Giao diện động cơ servo với 8051
Thí dụ
Bây giờ hãy lập trình AT89S52 để tạo ra 50Hz PWM để điều khiển Động cơ Servo ở góc giữa -90 ° đến + 90 ° xoay.
Ở đây chúng tôi đã tạo ra PWM trên pin P2.0 của AT89S52.

Chương trình cho Servo


#include <reg52.h>
#include <intrins.h>

/* Define value to be loaded in timer for PWM period of 20 milli second */
#define PWM_Period 0xB7FE

sbit Servo_Motor_Pin = P2^0;

unsigned int ON_Period, OFF_Period, DutyCycle;

/* Function to provide delay of 1ms at 11.0592 MHz */
void delay(unsigned int count)
{
    int i,j;
    for(i=0; i<count; i++)
   for(j=0; j<112; j++);
}

void Timer_init()
{
 TMOD = 0x01;  /* Timer0 mode1 */
 TH0 = (PWM_Period >> 8);/* 20ms timer value */
 TL0 = PWM_Period;
 TR0 = 1;  /* Start timer0 */
}

/* Timer0 interrupt service routine (ISR) */
void Timer0_ISR() interrupt 1 
{
 Servo_Motor_Pin = !Servo_Motor_Pin;
 if(Servo_Motor_Pin)
 {
  TH0 = (ON_Period >> 8);
  TL0 = ON_Period;
 } 
 else
 {
  TH0 = (OFF_Period >> 8);
  TL0 = OFF_Period;
 } 
   
}

/* Calculate ON & OFF period from duty cycle */
void Set_DutyCycle_To(float duty_cycle)
{
 float period = 65535 - PWM_Period;
 ON_Period = ((period/100.0) * duty_cycle);
 OFF_Period = (period - ON_Period); 
 ON_Period = 65535 - ON_Period; 
 OFF_Period = 65535 - OFF_Period;
}

int main()
{
   EA  = 1;  /* Enable global interrupt */
   ET0 = 1;          /* Enable timer0 interrupt */
   Timer_init();
   while(1)
    {
 Set_DutyCycle_To(2.7);/* 0.54ms(2.7%) of 20ms(100%) period */
 delay(1000);
 Set_DutyCycle_To(7);/* 1.4ms(7%) of 20ms(100%) period */
 delay(1000);
 Set_DutyCycle_To(12);/* 2.4ms(12%) of 20ms(100%) period */
 delay(1000);
    }
}

Code mô phỏng


2 comments:

  1. This comment has been removed by the author.

    ReplyDelete
  2. AD ơi, động cơ Servo quay 360 độ thì sao ạ.
    Cho em xin code với ạ

    ReplyDelete