¿Cómo controlar el Servo motor RC usando 8051?

-3

Estoy usando una MCU 8051 y deseo controlar un servomotor RC con 2 botones para un carro de juguete RC.

Tengo un código para usar dos botones, uno para la derecha y otro para la izquierda.

Cuando hago clic en un botón, el servomotor se mueve en una dirección pero luego permanece en esta posición.

Lo que quiero es que cuando aprieto el botón, el servomotor se mueva en una dirección y vuelva a su posición inicial al soltar el botón.

Probé este código, pero no funcionó para mí.

#include<reg51.h>
sbit output=P1^0;  
sbit S1 = P2^0; 
sbit S2 = P2^1;       

void timer(int msec)     // Function for timer
{
    int i;

    for(i=0;i<msec;i++)
    {

        TMOD=0x20;         // Mode2
        TH1=0xFF;
        TL1=0xD1;
        //TH1= -23;        // 50usec timer
        TR1=1;
        while(TF1==0);
        TF1=0;
        TR1=0;
    }
}

void main()
{
    int i;

    output=0;

    while(1)
    {
        //move to LEFT
        if (S1==0)
        for(i=0;i<300;i++)
        {
            output=1;
            timer(20);
            output=0;
            timer(40);

            output=1;
            timer(40);
            output=0;
            timer(40);

        }
        //move to RIGHT
        if (S2 == 0)
        for(i=0;i<300;i++)
        {
            output=1;
            timer(40);
            output=0;
            timer(40);

            output=1;
            timer(20);
            output=0;
            timer(40);

        }
    }
} 
    
pregunta Maxtron

2 respuestas

0

La posición de un servo RC estándar se controla mediante un pulso cuyo ancho varía de 1 a 2 ms, y se repite aproximadamente cada 20 ms. Cuando el servo recibe pulsos, se moverá hacia la posición ordenada (por ejemplo, 1 ms = izquierda 45 °, 1,5 ms = centro, 2 ms = derecha 45 °) y se detendrá cuando llegue a él. Mientras se reciben pulsos, el servo intentará mantener su posición ordenada. Si los pulsos se detienen, entonces el servo se apagará y solo mantendrá su posición mecánicamente.

Su código parece producir una serie de pulsos de longitud alterna con pequeños espacios, por ejemplo. para la izquierda: - pulso de 1 ms, espacio de 2 ms, pulso de 2 ms, espacio de 2 ms (repetido 300 veces). El servo requiere un solo pulso de longitud de 1 ~ 2 ms, seguido de un largo espacio para hacer un total de 20 ms, por ejemplo: -

 output=1;
 timer(20);  // 1ms pulse
 output=0;
 timer(380); // 19ms gap

Este segmento de código debe ejecutarse siempre que se mantenga presionado el botón 'Izquierda'. Para moverse a la derecha, haga que el ancho de pulso sea de 2 ms y el espacio de 18 ms.

Para volver al centro, ejecute el siguiente código continuamente cuando se presionen los botones no : -

 output=1;
 timer(30);  //1.5ms
 output=0;
 timer(370); // 18.5ms

Nota: Esta es la sincronización correcta para controlar un servo directamente. Si está operando el automóvil a través de un transmisor RC estándar, es posible que tenga que codificar la señal en PPM (Modulación de la posición del pulso). Consiste en pulsos cortos (~ 400us) que marcan el inicio y el final de cada canal de servo. Una radio de 2 canales enviaría 3 pulsos por cuadro.

    
respondido por el Bruce Abbott
0

el siguiente código, para el PIC18, proporciona el algoritmo que necesita implementar en el 8051.

ciertos cálculos deben realizarse para obtener los números de retardo adecuados

aquí están los cálculos para la foto18

clock frequency = 20mhz = 20,000,000hz

PIC18F452 -> 1 instruct per 4 clock cycles
instruction frequency = (20/4)mhx = 5mhx = 5,000,000hx

1/5,000,000 seconds = (x) instructions = 18.5msec
-> 92,5000 instructions = 18.5msec delay

1/5,000,000 seconds * (x) instructions = 1.5msec
-> 7,500 instructions = 1.5msec delay

Este algoritmo produce un movimiento continuo entre 3 posiciones, pero muestra cómo mover el servo

Sugiera que no se presione ningún interruptor en la posición "inicio", el interruptor 1 presionado inicia el movimiento de una manera, el interruptor 2 presionado inicia el movimiento de la otra manera.

Sugiera un movimiento de inicio diciéndole al servomotor que se mueva a una posición final (lo más alejada posible, por ejemplo, 0 grados y 90 grados con la posición inicial sea 45 grados.

. Este código se extrajo de: enlace

    #include <p18f452.h>
    #include <delays.h>

    int main(void)
    {

            int count=0;

            TRISB = 0x00;
            PORTB = 0x00;

        while(1)
        {

            for(count=0;count<50;count++)
            {  //far counter-clockwise
                    PORTB = 0x01;
                    Delay1KTCYx(10);
                    PORTB = 0x00;
                    Delay1KTCYx(90);
            }


                //middle
                for(count=0;count<50;count++)
            {
                    PORTB = 0x01;
                    Delay1KTCYx(7);
                    Delay100TCYx(5);
                    PORTB = 0x00;
                    Delay1KTCYx(92);
                    Delay100TCYx(5);
            }


            for(count=0;count<50;count++)
            {  //far counter-clockwise
                    PORTB = 0x01;
                    Delay1KTCYx(5);
                    //Delay100TCYx(5);
                    PORTB = 0x00;
                    Delay1KTCYx(95);
                    //Delay100TCYx(5);
            }
        }
    }
    
respondido por el user3629249

Lea otras preguntas en las etiquetas