Hola a todos,
estoy intentando sacar una señal PWM del PIC para controlar un servo que debe trabajar a 50 Hz, siendo el periodo de nivel alto entre 0,5 y 2,5 ms.
Creia tenerlo todo bastante claro, pero en la realidad la verdad es que la señal no sale todo lo precisa que imaginé, y no sé si es que tengo algo mal, o es un error de precisión del PIC como he podido leer en algun sitio.
Os adjunto el código que he calculado yo con la fórmula T= 4/Fosc * (CCPR1+1) pues no tengo prescaler ni postscaler ninguno configurado.
#use delay(clock=4000000)
int1 cambio=0; //Variable de control de cambio
#int_ccp1
void ccp1_int(){ //Función de interrupción
if(++cambio==1){
setup_ccp1(CCP_COMPARE_CLR_ON_MATCH); //Modo Comparación, cambio a 0
set_timer1(0); //Borrado de TMR1
CCP_1 = 1499;
} else{
setup_ccp1(CCP_COMPARE_SET_ON_MATCH); //Modo Comparación, cambio a 1
CCP_1 = 19999;
}
}
void main() {
disable_interrupts(global);
setup_timer_1(T1_INTERNAL | T1_DIV_BY_1); //Configuración TMR1
setup_ccp1(CCP_COMPARE_SET_ON_MATCH); //Configuración inicial modulo CCP
CCP_1 = 18499; //Inicialización del registro CCPR1
enable_interrupts(int_ccp1); //Habilitación interrupción modulo CCP1
enable_interrupts(global); //Habilitación interrupción general
do {
} while (TRUE);
}
Con los 4 MHz de clock, cada cuenta del TMR1 deberia ser 1 uS, con lo cual para conseguir 1500 uS = 1,5 mS, (CCPR1+1)=1500 y CCPR1=1499.
Y dejando correr el timer sin reiniciarlo, al llegar a 19999, por la misma regla habran pasado 20 mS.
El caso es que no consigo que los valores sean exactos simulando en proteus, la frecuencia me va oscilando entre 49 y 50 Hz, y en vez de posicionarseme en 0 grados en servo, se posiciona a 5,13º. Y montado en la protoboard me pasa exactamente lo mismo.
Si alguien ve algun fallo o le ha sucedido lo mismo, se lo agradecería.