Lecturas "acopladas" del ADC de un PIC

Estoy haciendo un proyecto en que ocupo dos sensores, un alcoholimetro (MQ-3 implementado con un divisor de tensión) y un micrófono (amplificado con un LM358 y algún filtro para producir solo voltaje positivo, sirve para detectar el ruido cuando están soplando).

Todo funciona perfecto, hasta que el sensor de alcohol es expuesto a una concentración alta de alcohol, lo que hace que su resistencia baje considerablemente, esto aumenta el voltaje en el divisor de tensión y como es de esperar la lectura del ADC es la esperada. Sin embargo la lectura del estado del micrófono aumenta casi al mismo valor que indica el alcoholimetro, sin cambiar nada :enfadado:. Por ejemplo el micrófono indica 100 y el alcohol 50, luego se exponer el alcoholimetro, el alcohol sube a 600, y el micrófono a 500. El rango del micrófono haciendo mucho ruido solo llega a 190.

Estoy ocupando PIC C y un PIC 16F873A. Les adjunto el código!

Código:
#include "prueba3.h"
#include "flex_lcd.c"
#include <STDLIB.H>

int16 alcohol,microfono;

//Retorna el maximo entre a y b
int16 max(int16 a, int16 b){
   if (a>b){
      return a;
   } else{
      return b;
   }
}

//Retorna un arreglo [minimo, maximo] con las medidas del ADC
int16 analogRead(int channel, int16 delayus){
   //Establecer el canal de lectura
   delay_us(1000); //Espero mas de lo debido, pensando que aca esta el error, pero sigue igual
   set_adc_channel(channel);
   delay_us(1000);
   int i=1;
   int16 n=0;
   for (;i<=5;i++){
      //Esperamos >6us al ADC (osc. interno) y un tiempo prudente de medicion
      delay_us(10+delayus*rand());   //Delay aleatorio para evitar ondas periodicas
      n=max(n,read_adc());
   }
   //Retornar el minimo y maximo de lectura
   return n;
}

void main()
{
   setup_adc_ports(AN0_AN1_AN3);
   setup_adc(ADC_CLOCK_INTERNAL);
   setup_spi(SPI_SS_DISABLED);
   setup_timer_0(RTCC_INTERNAL|RTCC_DIV_1);
   setup_timer_1(T1_DISABLED);
   setup_timer_2(T2_DISABLED,0,1);
   setup_comparator(NC_NC_NC_NC);
   setup_vref(FALSE);

   // PRINCIPAL
   
   lcd_init();
   while(1){
      microfono=analogRead(1,5);
      alcohol=analogRead(0,3);
      printf(lcd_putc, "\fRuido: %Lu\nAlcohol: %Lu %u", microfono, alcohol, abierto);
   }
}

Alguna idea de la falla? He medido con un multimetro los voltajes sin poner el PIC y los voltajes son los adecuados, uno no afecta al otro. Otro dato curioso, al poner el osciloscopio en uno de los pines del PIC mientras esta encendido la lectura de ese pin se va a cero, supongo que es un tema de impedancias.

Bueno desde ya doy las gracias!
 
Claro, el problema va por la parte hardware. Hoy estuve un rato con el circuito y conecte algunos condensadores entre VCC y GND cerca del regulador de voltaje y alimentación del PIC, para evitar cambios en el voltaje cuando se satura el alcoholimetro, ya que un cambio en el voltaje cambia los valores de referencia en el ADC. En primera instancia parece funcionar bien, ambas medidas son independientes, aunque haré un par de pruebas más para corroborar! :)
 
Atrás
Arriba