Académique Documents
Professionnel Documents
Culture Documents
Lo lógico es que la fuente de energía de los robots sean baterías o similares. Cuando
intentamos hacer funcionar varios ejes del brazo a la vez, puede pasar que se produzcan
bajadas de tensión momentaneas que ocasione el reset del PIC e impidan el movimiento
del brazo. Para evitarlo hay que indicar en la configuración del programa:
Mediante interrupción por desborde del Timer 0 generaremos las señales de control de
los servos. Y mediante el valor numérico contenido en una variable la posición de giro.
Estas variables las hemos denominado 'pinza' , 'muneca' , 'brazo' y 'hombro', e
identifican a cada uno de los ejes. Con otra variable, 'velocidad' especificaremos la
rapidez de los movimientos.
Y la forma de indicar las posiciones del servo mediante dos procedimientos. Por un lado
indicando numéricamente las nuevas posiciones de los servos que han de cambiar:
O tener unas posiciones preestablecidas definidas por una opción que se envía para
obtener la nueva posición:
switch (brazo_pos){
//Brazo recogido
case0:muneca=8;pinza=8;brazo=5;hombro=21;break;
//Brazo recogido
case1:muneca=pwm_muneca;pinza=pwm_pinza;brazo=5;hombro=21;break;
//Brazo levantado
case2:muneca=pwm_muneca;pinza=pwm_pinza;brazo=16;hombro=16;break;
|
|
|
//Brazo abajo extendido
case9:muneca=pwm_muneca;pinza=pwm_pinza;brazo=16;hombro=11;break;
}
La generación de las señales pulsatorias para el control de los servos se realiza mediante
la interrupción por rebose del timer 0. Con cada rebose del timer 0 se accede a la función
de interrupción donde se incrementa la variable "Ancho_pulso" y comparandola con cada
una de las variables que contienen la posición de los servos se decide cuando la señal
de control correspondiente a cada servo debe pasar a cero. Cuando la variable
"Ancho_pulso" incrementandose pasa de 0xff a 0x00, comienza un nuevo ciclo y por
tanto un nuevo pulso para todos los servos. De esta forma se consigue un pulso cíclico
para los servos de entre unos 0,9 ms a 2,1 ms cuando establecemos valores de la
variable del servo de entre unos 7 y 21, correspondientes a las posiciones extremas.
¡Ojo! Todos estos valores corresponden al uso de un cristal de cuarzo de 4 MHz y un
preescaler de 32 del timer 0.
El proyecto contenido en el artículo ha sido diseñado con la versión v4.084 de CCS PIC
C COMPILER
control_pwm++;
if (control_pwm==0) bit_pwm0=1;
if (control_pwm==pwm0) bit_pwm0=0;
x=kbd_getc();
el valor obtenido está en codificación ASCII por lo que habrá que pasarlo a su valor
numérico decimal
tecla=x-48;
if (x!=0&&x!='*'&&x!='#'){
y conforme se van pulsando números el último pulsado será las unidades y los anteriores
van pasando a decenas y centenas
centenas=decenas;
decenas=unidades;
unidades=tecla;
angulo=(centenas*100)+(decenas*10)+unidades;
El proyecto contenido en el artículo ha sido diseñado y probado con éxito utilizando las
siguientes versiones de software:
- Windows xp y windows 7
- Proteus V7.7 SP2
- CCS PIC C COMPILER v4.084