El servo no se mueve cuando es controlado por un microcontrolador PIC [duplicado]

0

Tengo un PIC12F629 y un servo sg5010 (para el cual no he encontrado ninguna hoja de datos) Así que construí este circuito:

simular este circuito : esquema creado usando CircuitLab

El LED es para verificar si se envía un pulso y el interruptor SW1 es para habilitar el servo.

Y he escrito este programa para el PIC:

#include <xc.h>
#define _XTAL_FREQ 40000000
#pragma config WDTE=OFF , BOREN=OFF , PWRTE=ON , MCLRE=OFF , FOSC=INTRCIO

void main(){
    TRISIO = 0b0000000;
    GPIO = 0b000000;
    int i;
    while(1==1){

            GPIO = 0b111111;
            __delay_ms(1);
            GPIO = 0b000000;
            __delay_ms(19);

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

        }

            GPIO = 0b111111;
            __delay_ms(2);
            GPIO = 0b000000;
            __delay_ms(18);

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

        }
    }

}

Aquí intenté girar el brazo del servo grados hacia adelante y hacia atrás y el for loop está aquí para dar tiempo al actuador y _XTAL_FREQ está aquí para configurar su frecuencia.

Incluso intenté transferir la configuración de GPIO a para bucles y agregar un bucle para después de ellos.

Cuando ejecuto el circuito, me enfrento a problemas críticos:

  1. Cuando presiono el interruptor, el servo retrocede unos 10 grados hacia adelante y hacia atrás (cada vez que se enciende, incluso sin ningún comentario conectado). Luego, si no alcanza los 360 grados, gira 20 grados por 20 grados hasta el final y luego se detiene y emite sonidos como clic para cada pulso enviado por el PIC. (Vi LED parpadea). Esto no es lo que quiero implementar.

  2. Si elimino todos los bucles en él (para los bucles while y while) y solo escribo esto en main:

    GPIO = 0b111111;
    __delay_ms(2);
    GPIO = 0b000000;
    __delay_ms(18);
    

El programa se enlaza y el LED parpadea. ¿Por qué se enrolla sobre sí mismo?

    
pregunta user3649714

1 respuesta

0

Para la primera pregunta, sus "bucles for" no hacen nada. Sé que están aquí para agregar retrasos, pero existe una alta probabilidad de que el compilador los elimine por completo porque no están haciendo nada por ellos. Para remediar esto, agregue una palabra clave volátil en su variable i. Esto le diría al compilador que no optimice las cosas relacionadas con la variable i, como los bucles de retardo. Este podría ser el problema.

¿Y por qué no usar una función __delay_ms () aquí, en lugar de un bucle for?

Para tu segunda pregunta:

el programa se repite en sí mismo porque la MCU se reiniciará cuando vuelva su función principal.

Por lo tanto, ejecutará su main de nuevo y se restablecerá, y se ejecutará de nuevo, y se restablecerá, ....

    
respondido por el Blup1980

Lea otras preguntas en las etiquetas