TODOPIC
Microcontroladores PIC => Lenguaje C para microcontroladores PIC => Mensaje iniciado por: karr77 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?