Autor Tema: Mini Controladora de Servomotores pic12F  (Leído 5764 veces)

0 Usuarios y 1 Visitante están viendo este tema.

Desconectado AKENAFAB

  • Colaborador
  • DsPIC30
  • *****
  • Mensajes: 3227
Mini Controladora de Servomotores pic12F
« en: 03 de Abril de 2010, 00:39:17 »
Hola amigos!

Como estoy retomando el proyecto de contorladora de nServos , tengo varias versiones a prueba , por el momento termine esta minicontroladora.

Ya la probe con 5 servos y la noto muy estable , por ahora no le he encontrado problemas.

Caracteristicas :

  • Controlador de servos tipo rc

    pic12F629 fácil migracion dentro de la familia 12F




    Frecuencia de Operacion = 50Hz

    Refresco aproximando cada 17.5ms

    Tmin= 0.5m    Tmed= 1.5ms  Tmax=2.5ms
              0             125             250  
              0°            90°             180°

                     250pasos
    Control Hasta 5 servomotores

    Recepción de Datos Serial
    19200bps,8bits,no paridad

Aqui les dejo el programa , porfavor si encuentran alguna problema postearlo aqui para corregir.
Código: C
  1. //+++   Mini Controladora de Servomotores +++//
  2. //+++++++++++  AKENAFAB ++++++++++++++++++++//
  3. //++ http://www.todopic.com.ar/foros/   ++++//
  4. //+++++++++++++++++++++++++++++++++++++++++//
  5. //Controla hasta 5 servomotores
  6. //Se recibe por el pin RA3 de manera serial
  7. //---  19200bps,8bits,sin paridad
  8. //++++++++++++++++++++++++++++++++++++++++++++++++++++++++//
  9. //El control consta de 2Bytes Servo y Posicion +++++++++++//
  10. // nServo-Posición  ++++++++++++++++++++++++++++++++++++++//
  11. // nServo = 255=S0 ,254=S1 , 253=S2 , 252=S3 ,251=S4  ++++//  
  12. // Posicion = 0-250  +++++++++++++++++++++++++++++++ ++++//
  13. // Ejemplo = 0xFF 0X80 = Servo0 Posicion 125=90°  +++++++//
  14. // 0x00=0.5ms - 0x80=1.5ms - 0XFA=2.5ms     +++++++++++++//
  15. //++++++++++++++++++++++++++++++++++++++++++++++++++++++//
  16. #include <12F629.h>
  17. #FUSES   INTRC_IO,NOWDT,PUT,NOMCLR,BROWNOUT,PROTECT,CPD
  18. #use     delay(clock=4M)
  19. #use     rs232(baud=19200,rcv=PIN_A3,BITS=8,sample_early)
  20. #use     fast_io(A)
  21. #zero_ram
  22. #priority timer1,int_ra
  23. //+++++++++++++++++++++++++++++++++++++++++//
  24. #Define Servo_1   PIN_A0
  25. #Define Servo_2   PIN_A1
  26. #Define Servo_3   PIN_A2
  27. #Define Servo_4   PIN_A4
  28. #Define Servo_5   PIN_A5
  29.  
  30. #Define n_servos  5        //Número de servomotores
  31. //+++++++++++++++++++++++++++++++++++++++++//
  32. int16  aux;                                            //variable auxiliar
  33. char indice;                                           //lleva el indice del servo a manipular
  34. char aux2;                                            // Control de actualizacion de los servos
  35. char  T_Servo[n_servos]={125,125,125,125,125};        //Tiempo activo del motor
  36. int1  flag_timer1;                                    //desborde timer0
  37. int1  flag_Supdate;                                   //Actualizar servi listo
  38. int1  flag_rx;                                        //dato recibido
  39. char  indice_rx;                                      // servomotor a manipular
  40. char dato_recibido;
  41. //+++++++++++++++++++++++++++++++++++++++++
  42.  
  43.  
  44. void main(){
  45.  
  46.    setup_comparator(NC_NC_NC_NC);      //Comparador deshabilitado
  47.  
  48.    output_A(0x00);                     //Latch
  49.    set_tris_A(0B001000);               //MCLR=A3= RX input Int_RA3 on Change
  50.  
  51.    enable_interrupts(GLOBAL);          //Interrupciones Habilitadas
  52.    enable_interrupts(INT_TIMER1);      //Habilitamos interrupcion desborde TMR1
  53.    SETUP_TIMER_1(T1_INTERNAL|T1_DIV_BY_1);
  54.    enable_interrupts(INT_RA3);         //Habilitamos interrupcion por cambio de estado
  55.                                        //en pin RA3
  56.  
  57.  
  58. //---------  PROGRAMA PRINCIPAL   -----------------------------\\\\
  59.  
  60.    while(1){  
  61.          
  62.          for(indice=0;indice<n_servos;indice++){      //Toma valor de n servos
  63.                aux=T_Servo[indice];      
  64.                aux=65091-(aux*8);
  65.                SET_TIMER1(aux);
  66.  
  67.                switch(indice){                  //1 Lógico a servo correspondiente
  68.                case 0:output_high(Servo_1);break;
  69.                case 1:output_high(Servo_2);break;
  70.                case 2:output_high(Servo_3);break;
  71.                case 3:output_high(Servo_4);break;
  72.                case 4:output_high(Servo_5);break;
  73.                }//switch
  74.  
  75.                while(flag_timer1==FALSE){}     //Loop Mientras no desborde TMR1
  76.                flag_timer1=FALSE;
  77.  
  78.                switch(indice){                  //0 lógico a servo correspondiente
  79.                case 0:output_low(Servo_1);break;
  80.                case 1:output_low(Servo_2);break;
  81.                case 2:output_low(Servo_3);break;
  82.                case 3:output_low(Servo_4);break;
  83.                case 4:output_low(Servo_5);break;              
  84.                }//switch
  85.  
  86.          }// for  
  87. //++++++++++++   ACTUALIZACION DE LOS SERVOMOTORES +++++++//
  88.    if(flag_rx==TRUE){
  89.          if(dato_recibido>=251){                    //Si es mayor a 250 es Servo,si Flag=TRUE es posicion
  90.            indice_rx=(0xFF-dato_recibido);          //operacion lógica AND solo servos de 0-5        
  91.            flag_Supdate=TRUE;                       // YA se puede actualizar el valor del servo
  92.             if(aux2==2)aux2=0;                      //corrigiendo posible error de recepcion
  93.             }
  94.       if(dato_recibido<=250&&flag_Supdate==TRUE){
  95.                   T_Servo[indice_rx]=dato_recibido;   //Actualizando valor del servo
  96.                   flag_Supdate=FALSE;                 //Reiniciamos varibles
  97.                   dato_recibido=0;                    //Tarea completada
  98.                   }
  99.    flag_rx=FALSE;
  100.    }//if--rx              
  101. //+++++++++++++++++++Pausa de 10 ms  +++++++++++++++++++//        
  102.                SET_TIMER1(55536);               //10ms
  103.                while(flag_timer1==FALSE){}     //Loop Mientras no desborde TMR1
  104.                flag_timer1=FALSE;
  105.        }//loop end while
  106.    
  107.  
  108. }//end main
  109.  
  110.  
  111. //+++++++++++++++   INTERRUPCIONES   +++++++++++++++++++//
  112. #INT_TIMER1
  113. desborde_TMR1(){                 //Interrupcion por desborde de timer
  114.    flag_timer1=TRUE;
  115. } // interrupcion TMR1
  116.  
  117. #INT_RA
  118. recepcion(){                    //Interrupcion por cambio de estado en pines
  119.    if(!input(PIN_A3)){          // Bit de inicio ???
  120.       dato_recibido=getc();     //Recibir dato
  121.       flag_rx=TRUE;            //Dato recibido
  122.       }//if
  123. } //int_ra3
  124.  
  125. //+++++++++++++++++++++++++++++++++++++++++++++++++++++++//


Más tarde subiré el pcb y esquemas de la misma , es una electronica muy sencillita

Saludos!

Adjunto archivo zip con código fuente


« Última modificación: 03 de Abril de 2010, 01:14:26 por AKENAFAB »

Desconectado groundman

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 1870
    • www.ingeniopic.com
Re: Mini Controladora de Servomotores pic12F
« Respuesta #1 en: 19 de Junio de 2010, 08:48:39 »
hola AKENAFAB.veo que estas bastante puesto en el tema.yo estoy interesado en hacer algo como lo que estas haciendo pero en asm.
tengo una duda.y es que estoy empezando con los servos.he adquirido un towerpro sg90 para realizar el proyecto.

mis dudas son:
para controlar el servo he entendido que el tiempo en estado alto debe de estar entre 0.5ms y 2ms segun que posicion queramos dejar el eje del servo.
pero segun he visto por ahi,el tiempo que debe de estar a nivel bajo varia entre 100 y 200ms.
mi pregunta es.es indiferente el tiempo que debe de estar a novel bajo la señal de control siempre que este entre esos dos tiempos?

supongo que en el caso de controlar el servo con un pic,lo importante es el tiempo que tiene que estar la señal a nivel alto y que no introduzcamos ninguna
señal a nivel alto hasta que no haya pasado un minimo de 100ms a nivel bajo.es en este tiempo donde podriamos controlar otros servos.

me he equivocado en algo?
Montando mi primera impresora 3D (Raprep Prusa i3)

Desconectado willynovi

  • Colaborador
  • PIC24F
  • *****
  • Mensajes: 546
Re: Mini Controladora de Servomotores pic12F
« Respuesta #2 en: 19 de Junio de 2010, 13:47:35 »
aja, te has equivocado  :mrgreen:
Como dice AKENAFAB, la frecuencia de operación es 50hz, lo que te da un tiempo de periodo de 20ms. Quiere decir entonces que cada 20ms tienes que refrescarle al servo el pulso con la correspondiente duración entre 0,5ms y 2,5ms.

Por ahi he visto un proyecto que maneja 8 servos, y la forma es justamente esa, en el tiempo que dejas de controlar el primer servo, configuras el timer para atender los demas servos.
Por qué 8? pues si haces 20ms / 8 = 2,5ms que es el tiempo del pulso, entonces irias haciendo servo por servo y cuando se repite el mismo servo pues habra pasado los 20ms con el pulso bajo.

AKENAFAB, No he mirado con detenimiento el código, pero serviria solo para 5 servos? o esa limitación es por la cantidad de salidas del 12F629?
Digo, si tuvieras un 16F877, cuantos servos podrias manejar con este firmaware?

Mi idea es poder manejar mínimo 16.

Saludos
Intento enseñarte a pescar, si solo quieres pescados, espera que un pescador te regale los suyos.

Desconectado AKENAFAB

  • Colaborador
  • DsPIC30
  • *****
  • Mensajes: 3227
Re: Mini Controladora de Servomotores pic12F
« Respuesta #3 en: 19 de Junio de 2010, 18:09:12 »
LA limitante es el numero de pines del pic con este procedimineto  y el tiempo de 20ms siendo 20ms/2.5ms = 8 servos max.
Todo lo que has comentado es correcto.

Saludos!

Desconectado groundman

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 1870
    • www.ingeniopic.com
Re: Mini Controladora de Servomotores pic12F
« Respuesta #4 en: 20 de Junio de 2010, 13:25:47 »
AKENAFAB.creo entender que el codigo que estas desarroyando activa los servos uno detras del otro.es decir cada 20ms los activas de modo secuencial.
asi que en activar los 8 servos dedicarias 0.1segundo.
la verdad que en 8 servos no se notaria el retraso.pero si utilizaramos 80 que es una burrada.tardaria 1 segundo desde que se da la primera orden hasta
activando el servo1 hasta que se activara el servo80.

yo iba a realizar este tipo de codigo.de activar los servos uno detras del otro.pero me he dado cuanta de que la orden puedo darsela a todos los servos a la vez
sin ningun retraso.almenos en activar las salidas,despues hay un retraso de 10 instrucciones si se diera la casualidad de que los valores para los servos fueran
los mismos.si no,no hay retraso alguno.
quizas este siendo muy preciso para el control de unos servos.pero si existe la posibilidad, siempre busco la precision. :)

Montando mi primera impresora 3D (Raprep Prusa i3)

Desconectado AKENAFAB

  • Colaborador
  • DsPIC30
  • *****
  • Mensajes: 3227
Re: Mini Controladora de Servomotores pic12F
« Respuesta #5 en: 20 de Junio de 2010, 17:36:16 »
HAy otro hilo de Nservos con el que trabajo de ratos

En ese programa activo todos los servos al mismo tiempo y voy apagando cada uno de acuerdo al tiempo alto  de menor a mayor.
Organizo todos los servos en menos de 0.5ms luego pasados los 2ms de posicion posible8.5-2.5ms) , tengo 17.5ms para hacer lo que se me antoje.

Me falta ajustar los tiempos de los timer etc....tal vez ese te sirva mejor.

Saludos!

Desconectado groundman

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 1870
    • www.ingeniopic.com
Re: Mini Controladora de Servomotores pic12F
« Respuesta #6 en: 20 de Junio de 2010, 19:37:24 »
entiendo.al pricipio del programa que estoy haciendo se me ocurrio ordenar los tiempos de menor a mayor.para luego ir apagando los servos cada cual le tocase.
pero vi que se perdia un tiempo en hacer esta organizacion.aparte de que se complicaba el programa.

de casualidad di con el sistema de hecerlo todo de una vez.activo a estado alto todas las señales.y se van poniendo a estado bajo tal cual le llegue antes.
sin tener que clasificar de mayor a menor.claro que esta en asm.

esto es un trozo de codigo.ya lo pondre completo cuando termine.
Código: [Seleccionar]
;<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<GESTION DE LOS TIEMPOS DE ESTADO ALTO DE SERVOS>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>

SR1 clrw ;borra W
xorwf TEMP_SERVO1,W ;comprueva si TEMP_SERVO1 esta a 0
btfsc STATUS,Z ;si es si salta a SR2
goto SR2
decfsz TEMP_SERVO1,f ;decrementa TEMP_SERVO1 y si es cero salta
goto SR2.1 ;salta a SR2.1
bcf GPIO,0 ;pon a cero la salida GPIO,0
incf TEST,F ;incrementa TEST.
SR2 nop ;retraso para corregir tiempo de estado alto en la fase de modulacion de anchura de puslso
nop ;

SR2.1 clrw
xorwf TEMP_SERVO2,W
btfsc STATUS,Z
goto SR3
decfsz TEMP_SERVO2,f
goto SR3.1
bcf GPIO,1
incf TEST,F
SR3 nop
nop

SR3.1 clrw
xorwf TEMP_SERVO3,W
btfsc STATUS,Z
goto SR4
decfsz TEMP_SERVO3,f
goto SR4.1
bcf GPIO,2
incf TEST,F
SR4 nop
nop

SR4.1 clrw
xorwf TEMP_SERVO4,W
btfsc STATUS,Z
goto SR5
decfsz TEMP_SERVO4,f
goto SR5.1
bcf GPIO,3
incf TEST,F
SR5 nop
nop


SR5.1
movlw 0x04 ;numero de servos a utilizar
xorwf TEST,W ;comprueva si todos los tiempos en estado alto de los servos han terminado
btfss STATUS,Z
goto SR1 ;si no han terminado,sigue comprovando

bcf INTERR,0 ;pon a cero el bit que controla si se ha terminado el ciclo completo
Montando mi primera impresora 3D (Raprep Prusa i3)

Desconectado AKENAFAB

  • Colaborador
  • DsPIC30
  • *****
  • Mensajes: 3227
Re: Mini Controladora de Servomotores pic12F
« Respuesta #7 en: 07 de Enero de 2011, 12:00:28 »
Aqui unas fotos de la la plaquita.

Falta el dc-jack y el molex

Saludos!!
« Última modificación: 07 de Enero de 2011, 12:07:03 por AKENAFAB »

Desconectado MGLSOFT

  • Moderador Local
  • DsPIC33
  • *****
  • Mensajes: 7907
Re: Mini Controladora de Servomotores pic12F
« Respuesta #8 en: 07 de Enero de 2011, 15:20:00 »
Con que tensión se alimentan los servos??
Pregunta de ignorante, ya se...!!
Todos los dias aprendo algo nuevo, el ultimo día de mi vida aprenderé a morir....
Mi Abuelo.


 

anything