Hoy estuve haciendo pruebas con el conversor sigma-delta.
Antes había leído sobre el, pero nunca lo había probado.
Es INCREIBLE. Con dos resistencias de 47k y un condensador de 100nF he conseguido una resolución de 50000 puntos de 0 a 5 voltios.
Eso es una
resolución de 0.1 milivoltios!!!
Las resistencias pueden ser del 5% porque luego ajustas los valores correctos con el offset y la ganancia del conversor.
En tu caso deberías utilizar otro rango distinto, por ejemplo de 1.2 a 2.2 voltios y luego "arreglas" la lectura con un offset.
Si quieres medir pasos de 1 metro necesitas medir pasos de (2.06-1.39)/3600 =
0.18 milivoltios/metro. Con el conversor que te comento lo consigues sin problema.
También puedes limitar el rango de medición utilizando otra referencia de tensión externa y diferentes resistencias.
No necesitas operacional, la ganancia la consigues directamente con el conversor.
El hardware es sencillo, el que aparece en la nota de aplicación de microchip (figura 2):
http://ww1.microchip.com/downloads/en/AppNotes/00700a.pdfAquí dejo el código que he utilizado. Sólo hay que cambiar dos números:
ADC_SIGMA_OFFSET Es el valor que devuelve la conversión cuando entran 0 voltios. Es el offset.
ADC_SIGMA_MAX Es el valor que debe devolver la conversión a fondo de escala. Es la ganancia.
/****************************************************************************
Sigma-Delta analog to digital conversion
PICUINO APPLICATION BOARD
https://sites.google.com/site/picuino
****************************************************************************/
#include <p18cxxx.h>
#include <stdio.h>
/****************************************************************************
HARDWARE DEFINITIONS
****************************************************************************/
#define FOSC 20000000
#define BAUD 57600
/****************************************************************************
RS232 FUNCTIONS
****************************************************************************/
/*
Initialize USART for RS232 comunications
*/
void rs232_init(void) {
PIE1bits.TXIE = 0; // Disable RS232 interrupts
BAUDCONbits.BRG16 = 0; // BRG16: 16-Bit Baud Rate Register Enable bit
SPBRGH = 0;
SPBRG = (FOSC/(16*BAUD))-1; // Real Baud = FOSC/(16*(SPBRG+1))
TXSTA = 0b00100110;
RCSTA = 0b10010000;
TRISCbits.TRISC6 = 0; // Enable TX output
}
/****************************************************************************
SIGMA DELTA CONVERSION
****************************************************************************/
#define ADC_SIGMA_OFFSET (212) // ADC value obtained at min input voltaje
#define ADC_SIGMA_MAX (49575) // ADC value at max voltaje
unsigned int adc_sigma(void) {
unsigned int count, v_adc;
// Inits ADC conversion
TRISAbits.TRISA0 = 1; // comparator input
TRISAbits.TRISA2 = 1; // Vref output
TRISAbits.TRISA3 = 0; // Sigma-Delta output
CVRCON = 0b11101100;
CMCON = 0b00000110; // configure 2 comparators with common reference
// ADC Conversion
v_adc = -ADC_SIGMA_OFFSET;
count = ADC_SIGMA_MAX + ADC_SIGMA_OFFSET;
do {
if (CMCONbits.C1OUT == 1){
Nop();
LATAbits.LATA3 = 1;
}
else {
LATAbits.LATA3 = 0;
Nop();
Nop();
}
} while (--count != 0);
count = ADC_SIGMA_MAX + ADC_SIGMA_OFFSET;
do {
if (CMCONbits.C1OUT == 1) {
Nop();
LATAbits.LATA3 = 1;
Nop();
Nop();
Nop();
}
else {
LATAbits.LATA3 = 0;
v_adc++;
}
} while (--count != 0);
return v_adc;
}
/****************************************************************************
MAIN PROGRAM
****************************************************************************/
void main(void) {
unsigned int v;
// Initialize
rs232_init();
// ADC CONVERSION
while(1) {
v = adc_sigma();
printf("V=%u\r\n", v);
}
}
También puedes hacer el soft por tu cuenta a partir de la nota de aplicación de Microchip, que viene en ensamblador y es sencillo.
Si necesitas ayuda te echo un cable.
Saludos.