int ajusta_pwm (int servo) //Esta función fija los parámetros para el siguiente pulso de la PWM.
{
float escala=0;
switch (servo)
{
case 1: valor=conversion(0);
break;
case 2: valor=conversion(1);
break;
case 3: valor=conversion(3);
break;
}
escala=1024/(tmr_pulso_maximo-tmr_pulso_minimo); //Escala para convertir a un valor que se cargará a timer0
ancho_pulso=(int)(valor/escala); //y es proporcional al ancho de pulso deseado.
ancho_pulso=256-tmr_pulso_minimo-ancho_pulso; //El valor se carga en el timer.
return (ancho_pulso);
}
/* Función de interrupción por sobreflujo en timer 0 */
/* Esta función genera la PWM que controla los 3 servos */
#INT_RTCC
RTCC_isr ()
{
switch (i)
{
case 0:
output_high (servo_1);
tiempo = tiempo_s1;
flag_pulso=0;
i++;
break;
case 1:
output_low (servo_1);
tiempo = 255 - (tmr_pulso_maximo - tiempo_s1);
//tiempo = 255 - (tmr_pulso_maximo - tmr_pulso_medio);
i++;
break;
case 2:
output_high (servo_2);
tiempo = tiempo_s2;
//tiempo = 255 - tmr_pulso_maximo;
i++;
break;
case 3:
output_low (servo_2);
tiempo = 255 - (tmr_pulso_maximo - tiempo_s2);
//tiempo = 255 - (tmr_pulso_maximo - tmr_pulso_maximo);
i++;
break;
case 4:
output_high (servo_3);
tiempo = tiempo_s3;
//tiempo = 255 - tmr_pulso_minimo;
i++;
break;
case 5:
output_low (servo_3);
tiempo = 256 - (tmr_pulso_maximo - tiempo_s3);
//tiempo = 256 - (tmr_pulso_maximo - tmr_pulso_minimo);
i++;
break;
default:
tiempo = 256 - tmr_pulso_maximo;
flag_pulso=1;
i++;
break;
}
if (i==10) i=0;
set_rtcc(tiempo);
}
/* Programa principal */
main()
{
envio_serial(0); //Para mostrar el mensaje inicial por puerto serial
tiempo_s1=ajusta_pwm(1);
tiempo_s2=ajusta_pwm(2);
tiempo_s3=ajusta_pwm(3);
j=0; //contador para calcular DCM del acelerómetro
setup_adc(ADC_CLOCK_INTERNAL);
setup_adc_ports(RA0_RA1_RA3_ANALOG);
setup_counters(RTCC_INTERNAL,RTCC_DIV_64); //Configura el timer0 (RTCC), aquí uso pre-escala de 1:64
enable_interrupts(INT_RTCC); //Habilita interrupción por sobreflujo en timer0
enable_interrupts(GLOBAL); //Habilita interrupciones globales
i=0; //valor que debe tener "i" (contador) para que
RTCC_isr(); //cuando entre a esta función coloque la señal a 1 (inicia pulso).
while(TRUE) //Un ciclo infinito.
{
if (flag_pulso==1)
{
tiempo_s1=ajusta_pwm(1);
tiempo_s2=ajusta_pwm(2);
tiempo_s3=ajusta_pwm(3);
}
}
}