Hola buenas,
hoy probando, probando me he encontrado con un problema gordo:
tengo la salida de un filtro de Butterworth conectada directamente a la entrada de uno de los canales de conversión A/D de un microcontrolador 16F876. La cuestión es que cuando enciendo el sistema, la salida del filtro que en teoría debería dar un resultado cercano a 1,30v, me baja a aproximadamente 0,11 voltios. Si quito el PIC de su zócalo el filtro funciona bien, lo que me lleva a pensar que, viendo el valor que tengo en el pin del A/D, pudiera ser que tuviese ese pin configurado como salida y que estuviese sacándome por ahí un 0 lógico. Aunque no sé por qué, porque el programa en principio lo veo correcto. Ahí lo dejo, por si me quereís echar un cable:
#include <16F876.h>
#device ADC=10
#fuses XT, NOWDT, NOPROTECT, PUT
#USE DELAY(clock = 4000000)
#include <STDLIB.h>
#DEFINE FREC_PWM 3910
#DEFINE R_MAX 838 //resistencia máxima que pueden alcanzar
//los sensores a una temperatura de 450º
#DEFINE CTE_PROP 1
#DEFINE Ro 650.0 //resistencia inicial del sensor
#DEFINE Co 0.000679 //cte sensor
long lec_consigna, //Lectura de consigna
conv1, //valores de conversion
conv2;
int flag_timer = 0;
#int_rtcc
void clock_isr()
{
flag_timer = 1;
}
main()
{
long Temp, //temperatura de consigna
Adc1 = 1023;
//ciclo de trabajo de los PWM
//Adc_max = 4000000 / FREC_PWM = 1023
int16 R_consigna, //resistencia de heater consignada
R_medida1; //" " medida
float vh1 = 0; //tension heater1 y heater2
float ih1; //intensidad heater1 y heater2
int16 copia_ih1;
//set_tris_a(0xFF); <- (Nota: esto lo he añadido más tarde para asegurar pin como entrada)
setup_port_a(ALL_ANALOG);
setup_adc(ADC_CLOCK_DIV_32);setup_timer_0(RTCC_INTERNAL | RTCC_DIV_256);
set_rtcc(226); //195 si frec muestreo ~62.5 Hz
//226 si frec muestreo de ~130Hz
enable_interrupts(int_rtcc);
setup_ccp1(CCP_PWM);
setup_timer_2(T2_DIV_BY_16, 16, 1);
enable_interrupts(global);
while (1)
{
set_pwm1_duty(Adc1);
if(flag_timer)
{
//lazo de control: se obtienen tensión e intensidad del heater y se
//calcula la resistencia de heater. Después se procede a un control P
set_adc_channel(0);
delay_us(20);
lec_consigna = Read_ADC(); // <-el canal 0 es el que da problemas, a partir de ahí el resto no funciona //control P y actualización de DC
(...)
}
}
}
Gracias por llegar hasta aquí
