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!
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!
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!