desktop

Problema al mover servomotor

Hola, compré unos servomotores y quiero hacer algunos proyectos con ellos, los estoy tratando de mover con PIC pero cuando los conecto solo se quedan vibrando y no realizan el giro que les programo, en realidad no llega el PWM porque solo con alimentarlo y conectarlo a algún pin cualquiera, hace lo mismo, simulé el código y funciona bien, llevo varios días intentando y ya no sé que pueda ser el problema, intenté también con TMR0 y no sirvió, la alimentación es externa al PIC y uso una fuente de 5v-1A, el servo es el MG90s. Adjunto el código más sencillo pero que tampoco sirve
Código:
list p=16f877A;
#include <P16F877A.inc>

__config _XT_OSC & _WDT_OFF & _PWRTE_ON & _BODEN_OFF & _LVP_OFF & _CP_OFF; ALL

Contador1    equ    0x20;
Contador2    equ    0x21;
Contador3    equ    0x22;
N    equ   .5;
L    equ   .5;
M    equ   .5;  500 MICRO SEGUNDOS
O    equ   .11; 1 MILISEGUNDO
A    equ   .19; 2 MILISEGUNDOS
Q    equ   .40; 4 MILISEGUNDOS
E    equ   .152; 15MILISEGUNDOS
I   equ    .160; 16MILISEGUNDOS

proga         equ b'111111';
progb         equ b'11111111';
progc         equ b'00000000';
progd         equ b'11111111';
proge         equ  b'011';

org 0x0000;
vec_reset     clrf PCLATH;
              goto prog_prin;
org 0x0004;
vec_int       nop;
              retfie;
                           
prog_ini      bsf STATUS, RP0;
              movlw 0x81;
              movwf OPTION_REG ^0x80;
              movlw proga;
              movwf TRISA ^0x80;
              movlw progb;
              movwf TRISB ^0x80;
              movlw progc;
              movwf TRISC ^0x80;
              movlw progd;
              movwf TRISD ^0x80;
              movlw proge;
              movwf TRISE ^0x80;
              movlw 0x06;
              movwf ADCON1 ^0x80;
              bcf STATUS, RP0;
              movlw b'00000000';
              movwf PORTC;
              return;
;==============PROGRAMA PRINCIPAL====================            
prog_prin    call prog_ini;  
loop_prin            
;CERO GRADOS      
ZER     bsf        PORTC, 0;
        call    _1_MILISEGUNDO;
        bcf        PORTC, 0;
        call    _15_MILISEGUNDOS;
        call    _4_MILISEGUNDOS;
       
        call retardo;
             
;CIENTO OCHENTA GRADOS
OCH     bsf PORTC,0;
        call    _2_MILISEGUNDOS
        bcf      PORTC,0;
        call    _16_MILISEGUNDOS;
        call    _2_MILISEGUNDOS;
       
        call retardo;
        goto loop_prin;
;================RETARDOS==================
_500_MICROSEGUNDOS      movlw M;
              movwf Contador3;
Loop1         movlw N;
              movwf Contador2;
Loop2         movlw L;
              movwf Contador1;
Loop3         decfsz Contador1, f;
              goto Loop3;
              decfsz Contador2, f;
              goto Loop2;
              decfsz Contador3, f;
              goto Loop1;
              return;
             
_1_MILISEGUNDO      movlw O;
              movwf Contador3;
Loop4         movlw N;
              movwf Contador2;
Loop5         movlw L;
              movwf Contador1;
Loop6         decfsz Contador1, f;
              goto Loop6;
              decfsz Contador2, f;
              goto Loop5;
              decfsz Contador3, f;
              goto Loop4;  
              return;
             
_2_MILISEGUNDOS     movlw A;
              movwf Contador3;
Loop7         movlw N;
              movwf Contador2;
Loop8         movlw L;
              movwf Contador1;
Loop9         decfsz Contador1, f;
              goto Loop9;
              decfsz Contador2, f;
              goto Loop8;
              decfsz Contador3, f;
              goto Loop7;
              return;
             
_4_MILISEGUNDOS        movlw Q;
              movwf Contador3;
Loop10         movlw N;
              movwf Contador2;
Loop11         movlw L;
              movwf Contador1;
Loop12         decfsz Contador1, f;
              goto Loop12;
              decfsz Contador2, f;
              goto Loop11;
              decfsz Contador3, f;
              goto Loop10;
              return;
             
             
_15_MILISEGUNDOS    movlw E;
              movwf Contador3;
Loop13         movlw N;
              movwf Contador2;
Loop14         movlw L;
              movwf Contador1;
Loop15         decfsz Contador1, f;
              goto Loop15;
              decfsz Contador2, f;
              goto Loop14;
              decfsz Contador3, f;
              goto Loop13;
              return;
             
_16_MILISEGUNDOS   movlw I;
              movwf Contador3;
Loop16         movlw N;
              movwf Contador2;
Loop17         movlw L;
              movwf Contador1;
Loop18         decfsz Contador1, f;
              goto Loop18;
              decfsz Contador2, f;
              goto Loop17;
              decfsz Contador3, f;
              goto Loop16;
              return;
             
retardo       movlw I;
              movwf Contador3;
Loop19         movlw E;
              movwf Contador2;
Loop20         movlw A;
              movwf Contador1;
Loop21         decfsz Contador1, f;
              goto Loop21;
              decfsz Contador2, f;
              goto Loop20;
              decfsz Contador3, f;
              goto Loop19;
              return;
              end;
[ICODE][/ICODE]
 
Explica que se supone que realice tu código paso a paso
 
Tengo entedido que los towerpro son DC
En PROGRAMA PRINCIPAL, lo unico que realiza el código es girar a 70 grados que calcule con retardos y después de un tiempo ir a -70 ( o lo que seria 160 y 20 grados) luego realiza eso infinitamente, en simulacion lo hace, pero en fisico el motor solo queda vibrando moviendose a lo mucho 5 grados.
 
Gracias a todos, ya solucione el problema, lo que pasa es que el servomotor tiene que estar conectado a la misma alimentación del PiC, ahora quiero intentar mover 2 o más, pero supongo que al demandar más corriente puedo dañar el PIC, lo alimento con 12v y está regulado con un LM705, ¿algún consejo?
 
Pues me parece mala idea conectar las cargas a la misma fuente que la lógica.

Mientras sean pequeñas, bien.

El terminal de control "no gasta", pero el consumo del motor perturba la línea de alimentación.
Yo alimentaria con dos fuentes y uniría solo las masas y el terminal de control.

Y más adelante dos fuentes con algún acoplamiento aislado, si es que hace falta.
 
Atrás
Arriba