Autor Tema: Duda sobre periodo del modulo CCP en modo comparación(lenguaje CCS)  (Leído 2893 veces)

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

Desconectado Sesag

  • PIC10
  • *
  • Mensajes: 5
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.

Código: [Seleccionar]
#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.


 

anything