RobotyPic son proyectos básicos de electrónica con microcontroladores PIC, de aplicación en el mundo de la robótica didáctica, con archivos fuente creados mediante el compilador CCS PIC C COMPILER en lenguajeC.

PIC controlador de servos por I2C

En el artículo "Control de 8 servos con PIC", se ha mostrado un procedimiento para controlar 8 servos mediante código en un PIC, ampliable a tantos servos como lineas de salida de puerto disponibles haya. Para según qué aplicaciones, en las que necesitamos además usar el PIC para otros menesteres, podemos encontrarnos con dos problemas. Por un lado, vamos a inutilizar para otras funciones tantos pines del PIC como servos conectemos, y esto puede ser un problema para un número alto de servos. Y por otro lado, las continuas llamadas a la interrupción por rebose del Timer para la generación de las señales de modulación de los servos, ralentiza la ejecución del resto del programa del PIC.
Para solucionar esto, en este artículo, se va a proponer el uso de un PIC secundario exclusivamente para el control de servos utilizando los conceptos  mostrados en el otro artículo. Concretamente el control de 20 servos con los 20 pines I/O disponibles de un 16F876A. Y un segundo PIC, como PIC principal, que ejecutará el programa genérico de la aplicación que se desee además de controlar los 20 servos. En resumen, con dos lineas de un PIC vamos a controlar 20 servos. Y como además, estas dos lineas son el bus I2C, también podrán ser utilizadas para cualquier otro dispositivo I2C.

Por tanto, en el PIC secundario controlador de los servos, empleamos todas las lineas de los puertos como salida a excepción de los pines RC3 y RC4 del puerto C que son necesarios para el bus I2C. Otra observación; en el 16F876A es necesario emplear una resistencia pull-up en el pin RA4 cuando este se emplea como puerto de salida.
Para obtener la señal de modulación, emplearemos la interrupción por rebose del Timer0. Previamente cargado con el valor 244 se irá incrementando hasta 255, momento en el que se ejecutará la interrupción y volveremos a iniciar la cuenta desde 244. 


set_timer0(244);             //Carga del contador

Obtendremos un incremento en 1 de su valor cada 4 ciclos de reloj con la configuración empleada:

setup_timer_0(RTCC_INTERNAL);//Configuración interrupción generación pwm

Cada acceso a la subrutina de interrupción, es decir, cada rebose del Timer0, incrementamos la variable "Control_PWM" hasta un valor máximo de 550, momento en el cual se reinicia desde cero. 

control_PWM=control_PWM+1;    //Incremento cada rebose del timer0

if (control_PWM==550) control_PWM=0;       
























Este valor será el que determine el periodo total de la señal de modulación, en este caso 20msg. Todas las señales de modulación individuales (Bit_PWM1, Bit_PWM2, Bit_PWM3, etc.) comienzan en estado alto cuando Control_PWM se reinicia.


if (control_PWM==0){  //inicio del ciclo con todos los pulsos pwm a 1
      Bit_PWMx=1;     //x = nº de modulación
}

La variable Control_PWM se compara con todas las variables individuales de control de cada servo (PWM1, PWM2, PWM3, etc.). A estas variables de control de los servos se les cargará los valores de control desde el PIC principal en un rango desde 20 a 60 (correspondientes a impulsos de 0.8 msg a 2.1 msg). Cuando son comparados a la modulación en cada interrupción de rebose del Timer0 y coincide con su respectiva señal de modulación  de su respectivo servo se termina el pulso de control de ese servo hasta reiniciar de nuevo el ciclo con la variable Control_PWM = 0.


if (control_PWM==PWM[x]) Bit_PWMx=0;  //x = nº de servo

Para ejecutar el control de los servos, simplemente habrá que enviar por I2C el valor de las variables de nº de servo, posición y velocidad.


void PicServos_I2C(direccion, servo, posicion, velocidad){

   i2c_start();            // Comienzo comunicación
   i2c_write(direccion);   // Dirección del esclavo en el bus I2C
   i2c_write(servo);       // Servo que se controlará en el esclavo
   i2c_write(posicion);    // Posición del servo controlado
   i2c_write(velocidad);   // Velocidad de cambio del servo
   i2c_stop();             // Fin comunicación
   delay_ms(10);
 }

[+/-] Ver / Ocultar programa PIC principal en C

[+/-] Ver / Ocultar programa PIC controlador servos en C

En la simulación, reflejada en este vídeo, se puede ver el resultado de todo lo explicado. Se intenta mostrar las señales moduladas de control de los 20 servos. En el display del PIC principal, se observa el último servo que se modifica. Esta variación de giro se puede ver en la variación del ancho de pulso de la señal de modulación del correspondiente servo en las gráficas de osciloscopio.

Al final del vídeo se detalla varios tiempos de variación de los pulsos de modulación según la velocidad elegida y que actuará directamente sobre la velocidad de giro del servo.


En el siguiente enlace se pueden descargar todos los archivos.

Descargar PIC controlador de servos


El proyecto contenido en el artículo ha sido diseñado y probado con éxito utilizando las siguientes versiones de software:
- Windows 7 32 bits
- Proteus V7.7 SP2
- CCS PIC C COMPILER v4.104

Última revisión del artículo marzo de 2017


No hay comentarios:

Related Posts Plugin for WordPress, Blogger...

CONTACTA - (Haz referencia del artículo sobre el que trata la consulta o comentario)