Intentando obtener la fórmula de conversión ADC de 8 a 10 bits adecuada para Arduino con sonda de temperatura

1

Tengo un Arduino Diecimila y un montón de viejos Sensores de temperatura Phidgets 1114.

Quiero poder obtener una temperatura algo estable / precisa de estos sensores dentro de mis bocetos de arduino.

La fórmula de phidgets para el 1114 es tempC = (SensorValue / 4) - 50.

Tengo entendido que los Phidgets tienen un ADC de 8 bits y Arduino tiene un ADC de 10 bits.

Lee también una publicación anterior aquí que describe el uso de una fórmula más como esta tempC = (SensorValue * 0.0625) - 50. Debido a que 10bit dac necesita dividirse por 4 nuevamente para obtener este resultado en un ADC de 10bit.

Usando el ejemplo analógico en el sitio web, he encontrado esto:

const int analogInPin = A5;  // Analog input pin that the potentiometer is attached to
const int analogOutPin = 9; // Analog output pin that the LED is attached to

int sensorValue = 0;        // value read from the pot
int outputValue = 0;        // value output to the PWM (analog out)
float temperature = 0.0;
void setup() {
  // initialize serial communications at 9600 bps:
  Serial.begin(9600); 
}

void loop() {
  // read the analog in value:
  sensorValue = analogRead(analogInPin);            
  // map it to the range of the analog out:
  outputValue = map(sensorValue, 0, 1023, 0, 255);  
  // change the analog out value:
  analogWrite(analogOutPin, outputValue);           

  // print the results to the serial monitor:
  Serial.print("sensor = " );                       
  Serial.print(sensorValue);      
  Serial.print("\t Temperature = ");
  temperature = ((float)sensorValue/4) - 50.0;
  Serial.println(temperature);   

  // wait 10 milliseconds before the next loop
  // for the analog-to-digital converter to settle
  // after the last reading:
  delay(10);                     
}

Esto produce una salida de monitor en serie de este modo:

sensor = 303     Temperature = 25.75
sensor = 305     Temperature = 26.25
sensor = 306     Temperature = 26.50
sensor = 307     Temperature = 26.75
sensor = 303     Temperature = 25.75
sensor = 310     Temperature = 27.50
sensor = 308     Temperature = 27.00
sensor = 305     Temperature = 26.25
sensor = 306     Temperature = 26.50
sensor = 307     Temperature = 26.75
sensor = 303     Temperature = 25.75
sensor = 304     Temperature = 26.00
sensor = 302     Temperature = 25.50
sensor = 305     Temperature = 26.25
sensor = 304     Temperature = 26.00
sensor = 305     Temperature = 26.25
sensor = 307     Temperature = 26.75
sensor = 303     Temperature = 25.75
sensor = 305     Temperature = 26.25
sensor = 306     Temperature = 26.50

Lo que muestra que la temperatura es aproximadamente 2-3 grados C más alta de lo que actualmente es, tengo un indicador de temperatura aquí que muestra 24.5C

He intentado usar el * 0.0625 y eso solo lleva el valor a -30, rango -31 ...

    
pregunta William Dwyer

4 respuestas

3

Probablemente estés viendo un error de calibración absoluto. La tolerancia de +/- 4C del sensor de temperatura sugerido es ... bastante horrible, y es lo que está viendo aquí. En realidad, si miras más allá. La especificación típica es +/- 2C para todos los sensores, pero puede variar de -4C a + 6C (!!). Eso es básicamente un rango de desconocido de casi 10 grados. Podría calibrar el sensor y, mientras la pendiente sea precisa, seguirá obteniendo una medición bastante absoluta. ¿Qué tan preciso? Bueno, ¿qué tan preciso puede calibrar la temperatura?

Si asume que su referencia le dice que las mediciones siempre están desactivadas con + 3C, entonces asegúrese .. reste -3C de la salida y déjela ahí. Puede que no sea muy preciso porque está asumiendo que su referencia es correcta y exactamente a la misma temperatura que su sensor. Incluso si lograba hacer eso, el sensor probablemente también tendría una deriva terrible con el tiempo ...

De todos modos, en la fórmula de la entrada. Si tienes el MCP9701, entonces:

$$ V_ {0C} = 400mV $$

$$ T_C = 19.5mV / C $$

$$ V_ {OUT} = T_C \ cdot T_A + V_ {0C} $$

$$ \ implica 19.5 \ cdot T + 400 = salida $$

Si desea medir entre 45 y 50 ° C aproximadamente, puede usar la referencia interna del controlador Arduino. Esto es 1.1V para un ATMEGA328. Lo útil de esto es que no está utilizando la fuente de alimentación como referencia , que es bastante peor si quieres lecturas algo precisas.

En 1.1V, puedes calcular una nueva fórmula: El desplazamiento es de 400mV. ADC de 10 bits significa que 1.1V se dividirá en \ $ 2 ^ {10} \ $ pasos, que es 1024. \ $ \ frac {1.1V} {1024} = 1.07mV \ $ por paso 400 mV significa que tiene un código de bytes 373.8 si el sensor de temperatura está leyendo 0C. Este es tu código de código de compensación.

La pendiente es de 19.5mV. Una vez más, 19.5 / 1.07 es 18 (.2) por grado. Entonces, podría decir que el código de muestreo se deriva de:

$$ samplecode = 373.8 + 18.2 \ cdot T $$

$$ T = \ frac {samplecode-373.8} {18.2} $$

    
respondido por el Hans
3

Estoy un poco confundido por lo que realmente está haciendo y de lo que se habla en la hoja de datos, pero ... La hoja de datos se refiere a si está utilizando el Valor de RawSensor que necesita dividir por 4.095. Hacer esto en tus números parece reducir tu temperatura más cerca de lo que crees que debería ser. También puede haber algunas diferencias de precisión entre los dos sensores. Sospecho que una vez que se divide por el número más grande estará en especificaciones de lo que esperaría entre dos sensores diferentes.

    
respondido por el Kellenjb
2

Parece que su sensor podría ser el MCP9701 , que ofrece una salida de 19.5 mV / grados C. (¿Puedes leer la impresión en el sensor?). Se permite que una de ellas esté a 4 grados en cualquier dirección, pero si calibra su sensor individual (por ejemplo, reste otros 3 grados para ese sensor en particular), puede hacerlo mejor.

    
respondido por el joeforker
0

Aquí está el código que estoy usando en mi arduino con un sensor de temperatura phidget 1114, que me da los mismos valores que mi termómetro de referencia. El valor no se estabilizó hasta que empecé a promediar 15 lecturas

int tempCount = 15;

int getTempF() {
    float temps[tempCount];
    for (int i = 0; i < tempCount; i++) {
        temps[i] = (analogRead(tempPin)/4.095) - 50.5; // datasheet says 50
        delay(10);
    }

    float totalC;

    for (int i = 0; i < tempCount; i++) {
        totalC += temps[i];
    }

    float tempC = totalC / tempCount;
    float tempF = (tempC * 9.0) / 5.0 + 32.0;
    return int(tempF);
}
    
respondido por el Nick

Lea otras preguntas en las etiquetas