Autor Tema: Convertidor D/A con PIC18F4550  (Leído 2637 veces)

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

Desconectado karr77

  • PIC10
  • *
  • Mensajes: 4
Convertidor D/A con PIC18F4550
« en: 23 de Octubre de 2018, 20:03:21 »
Buenos días a todos ustedes, cuento con un libro en donde explica esto de conversión Digital-Analógica usando la lectura ADC del pic, el texto es el siguiente:

Mediante la configuración del módulo CCP lanzar una conversión AD, automática cada 1ms. Con el valor obtenido se realizará una conversión DA utilizando el PWM y un filtro pasa-bajo(imagen adjunta).

Se configura el módulo CCP2 en modo comparación con acción especial de disparo, cuando se produce la igualdad se resetea el TMR1 y se lanza una conversión AD, si está habilitada. Cargando el registro de CCP2 con el valor adecuado se consigue que, cuando coincida con el valor de TMR1, se produzca una conversión AD, en este caso cada 1 ms. Dado que la frecuencia de trabajo es de 4 MHz (1 ms/1 us=1000), el registro CCP2 se carga a 1000.

Con el valor obtenido de la conversión se puede obtener una señal PWWm proporcional a este valor. Para ello se utiliza el módulo CCP1, dado que el valor de la conversión es de 10 bits y el registro del módulo PWM también es de 10 bits, el valor puede ser tranferido directamente.

El periodo de la señal PWM viene fijado por el TMR2, con un prescaler y un postcaler de valor 1 y un valor de registro PR2 de 224, lo que implica un periodo de 225 us (4444Hz).

Y el código es el siguiente:

#include <16F876.h>
#device adc= 10
#fuses XT, NOWDT


int16 valor;

#int_ad
void ad_init(){                                    //Función interrupción AD
valor=read_adc();                               //Valor de fuente analógica
set_pwm1_duty(valor);                       //A Duty de PWM
}
void main(){
   disable_interrupts(global);
   
   setup_adc_ports(AN0);                         //Habilitación RA0 analógico
   setup_adc(ADC_CLOCK_INTERNAL);      //Reloj interno RC
   set_adc_channel(0);                             //Canal 0
   
   setup_timer_2(T2_DIV_BY_1,224,1);    //PR2 224, Tpwm=225 us
   setup_ccp1(CCP_PWM);                       //CCP1 en modo PWM
   setup_ccp2(CCP_COMPARE_RESET_TIMER);         //CCP2 modo COMPARACION
                                                //y disparo especial
   setup_timer_1(T1_INTERNAL | T1_DIV_BY_1);    //Configuración TMR1
   set_timer1(0);                               //Puesto a 0
   ccp_2=1000       ;                           //Muestreo cada 1 ms a 4MHz
   enable_interrupts(INT_AD);                   //Habilitación Interrupción AD
   enable_interrupts(global);                   //Habilitación Interrupción global
   do{
   }While(TRUE);
}

He probado la simulación, pero este no me funciona correctamente, el problema no es eso, sino que lo que quiero es que me pueda funcionar con el PIC18f4550, no logro entender porque en el CCP2 pone 1000, en el caso del PIC usa #use delay(clock=48000000), cómo puedo hacer para que éste me funcione en dicho PIC y qué fórmula se necesita?


 

anything