Servo conectado a PIC no funciona

-1

Tengo un PIC 12F629 y lo conecté a mi servo (TowerPro sg5010 motor ) según estos detalles:

  • PIC pin 1 a positivo
  • pin 8 a negativo
  • pin 2 al cable rojo (señal) servo
  • cable marrón servo a negativo
  • servo naranja a positivo (servo tiene tres colores: cables marrón, rojo y naranja)

Programé PIC con este código:

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

    void main(){
    TRISIO = 0b0000000;
    GPIO = 0b000000;
        while(1==1){
            GPIO = 0b000000;
            __delay_ms(1);
            GPIO = 0b111111;
            __delay_ms(19);
        }

}

Pero el servo no se mueve un poco. ¿Cuál es el problema?

Editar : descubrí que giraba el brazo del servo muy rápido hasta el final (el punto en el que no podía girar más entonces suena como tic tic tictac .....)

cambié mi código a esto (para revertirlo):

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

pero se comporta igual.

    
pregunta user3649714

2 respuestas

2

Algunas cosas:

  1. Tu pulso de salida está invertido. Cambia tus comandos GPIO para escribir un "1" para el pulso corto, y "0" para el tiempo restante en tu ciclo de 20 ms.
  2. Tienes los cables rojo y naranja intercambiados. El cable rojo va a la tensión de alimentación pos. El cable naranja es tu control. El cable marrón es CC común (cable negativo de la fuente de alimentación).
  3. Verifique la precisión de su rutina __delay_ms (). El compilador XC8 usa la constante _XTAL_FREQ para las rutinas de retardo. El oscilador interno del PIC12F629 funciona a 4Mhz (no 20Mhz). Debería redefinir _XTAL_FREQ a 4000000.
  4. En su segundo ejemplo, no ha dejado suficiente tiempo entre los comandos para que el motor se mueva. Intente ejecutar su bucle de 1 ms de alto / 19 ms por un segundo, y luego cambie a un bucle de 2 ms de alto / 18 ms de baja. Ejecute el segundo bucle durante tal vez un segundo, luego regrese al primer bucle. Prueba esto:

    #include <xc.h>
    #define _XTAL_FREQ 4000000
    #pragma config WDTE=OFF , BOREN=OFF , PWRTE=ON , MCLRE=OFF , FOSC=INTRCIO
    
    void main(){
    int i;
    TRISIO = 0b0000000;
    GPIO = 0b000000;
        while(1==1){
            for(i=0;i<50;i++){
                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);
            }
        }
    }
    
respondido por el Tut
1

enlace ....

cita ... El servomotor tiene tres conductores. El color de los cables varía entre los servomotores, pero el cable rojo es siempre 5V y el GND será negro o marrón. El otro cable es el cable de control y generalmente es de color naranja o amarillo. ....

    
respondido por el Spoon

Lea otras preguntas en las etiquetas