Ampliación del rango de valores analógicos desde el sensor de temperatura

3

Estoy intentando construir un módulo de relé de temperatura controlada con un ATtiny45 (Arduino UNO R3 como ISP) y un sensor de temperatura NXP KTY81-222.

El rango de temperatura que quiero monitorear es de 20 ° C a 30 ° C.

(hoja de datos - > enlace )

El diseño de mi circuito tiene este aspecto = (Estoy usando el Arduino UNO R3 para la depuración)

**notequetambiénheintentado"cambiar" la resistencia 1K y la posición del sensor para invertir la salida.

* y el tablero arduino - >

A0eslaentradaanalógica0delArduino.5Vseconectadirectamentealpindesalidade5Vdelarduino.

(mástardeseríalomismoenelATtiny45usandoalgunasbaterías)

(VCC puede ser de 2.7V a 5.5V)

He usado un termómetro digital doméstico para comparar los valores de la entrada analógica con los valores de ° C medidos.

esta es una tabla de medidas rápidas =

Analógico - > ° C

687 a 690 - > 24.4 ° C a 25.1 ° C

707 a 708 - > 36.2 ° C a 36.5 ° C

como puede ver, tengo un rango de aproximadamente 20 unidades analógicas que representa un rango de alrededor de 10 ° C unidades.

así que lo que realmente quiero es "aumentar" el rango de las unidades analógicas a aproximadamente 200 unidades analógicas para un rango de unidades de 10 ° C. La solución debería ser buena para manejar el rango de valores, de modo que pueda decirle a µC que alimente el relé si la temperatura es inferior a 24 ° C, y cierre el relé si la temperatura es superior a 28 ° C.

Quiero que 20 ° C sea un valor analógico de alrededor de 500 y 30 ° C que sea alrededor de 700. (este "rango de 500 a 700 sería lo suficientemente bueno para mí.

Espero poder explicar bien mi pregunta para mi mal inglés.

    
pregunta Ace

2 respuestas

3

simular este circuito : esquema creado usando CircuitLab

Te vas a encontrar con algunos problemas de precisión, como:

  1. ruido de la línea 5V
  2. autocalentable
  3. posible caída de voltaje (debido a la longitud del cable)

Simplemente iría con un termómetro de un cable como el DS18B20 / DS18S20. Usando un sensor digital, menos inmune al ruido. Incluso puedes correrlo a una distancia mucho más larga. Ya hay una biblioteca para el Arduino. De todos modos, esa es mi ruta.

Siguiendo tu ruta:

Si solo quieres el rango de temperatura de 20 ° C a 30 ° C, tendrás que jugar con tu resistencia para obtener ese rango. Por ejemplo, a 20C la resistencia nominal es de 1922ohms y a 30C, 2080ohms.

Por lo tanto, los estados divisores de voltaje producen:

$$ @ 20C: V_o = V_i \ cdot \ frac {R_s} {R_s + R1} = 5V \ cdot \ frac {1922} {1922 + 1000} = 3.288V $$

$$ @ 30C: V_o = V_i \ cdot \ frac {R_s} {R_s + R1} = 5V \ cdot \ frac {2080} {2080 + 1000} = 3.376V $$

La diferencia es 0.08778V o 87.78mV. Dado que el análogo de arduino usa 10b (1023): \ $ \ frac {5V} {1023} = 4.888mV / \ mathsf {paso} \ $. Esto debería haber generado 17.9 pasos (\ $ \ frac {87.78mV} {4.888mV} \ $, así que digamos 17. Si desea reducir esto a una resolución mayor, puede conectar el 3.3V desde el FTDI de Arduino. del puerto al pin de referencia analógico. Sin embargo, alimente su divisor de voltaje con el mismo 5 V. En su configuración de vacío (), use analogReference (EXTERNAL). Esto hará que su analógico use la referencia de 3.3V en lugar de la referencia interna de 5V .

Ahora, hagamos un poco más de matemáticas:

Ya que estamos usando la referencia de 3.3V ahora, la resolución cambia a \ $ \ frac {3.3V} {1023} = 3.23mV / \ mathsf {paso} \ $. Esto ahora producirá 27.2 pasos (\ $ \ frac {87.78mV} {3.23mV} \ $) (digamos 27 pasos).

Como puede ver, solo hemos mejorado de 17 pasos a 27 pasos. En un rango de 10C (30C-20C), teóricamente podemos obtener una resolución de 10C / 27 = 0.37C. Recomendaría un condensador en paralelo con el sensor para crear un filtro de paso bajo de primer orden (permite la baja frecuencia y rechaza la alta frecuencia después del corte a una velocidad de 20 dB o 10 veces por rechazo por década). Conecte este condensador a la derecha entre A0 y gnd (lo más cerca posible de A0). El filtro de corte se calcula utilizando:

Digamos que estás usando una resistencia de 1k y un condensador de 1uF:

$$ f_c = \ frac {1} {2 \ cdot \ pi \ cdot R \ cdot C} = \ frac {1} {2 \ cdot \ pi \ cdot1000 \ cdot0.000001} = 159Hz $$

Todo lo que tienes que hacer ahora es jugar con el valor de la resistencia (debería ser más grande que 1k ahora). Asegúrese de que el peor de los casos no proporcione un voltaje mayor que el voltaje de referencia.

Probablemente elegiría una resistencia de 2k:

\ $ V_o = 5V \ cdot \ frac {1922} {1922 + 2000} = 2.450V \ $, por lo que los resultados analógicos de lectura 759

\ $ V_o = 5V \ cdot \ frac {2080} {2080 + 2000} = 2.549V \ $, por lo que los resultados analógicos de lectura 790

En el peor de los casos: @ 150C - > 4280ohms

\ $ V_o = 5 \ cdot \ frac {4280} {4280 + 2000} = 3.4V \ $ (ok)

Diferencia 98.73mV - > 98.73mV / 3.23mV - > 30 pasos

Filtro de paso bajo: \ $ (2 \ cdot \ pi \ cdot2000 \ cdot0.000001) ^ {- 1} = 79.6Hz \ $ (la señal de CA a 796Hz se reduce a 10 veces más pequeña, a 7960Hz es 100 veces más pequeña , etc).

    
respondido por el NothinRandom
1

Puede que no parezca una gama muy amplia de números digitales, pero ¿ha considerado la posibilidad de aprovechar (digamos) diez lecturas? El ruido (si está generalmente por encima del ancho de banda que necesita medir) se puede utilizar para su ventaja mediante un proceso denominado interpolación. En efecto, la aleatoriedad del ruido le dará una extensión de las lecturas para una temperatura fija y el promedio de varios números le dará una mayor resolución. El acto de promediar los números es un filtro de paso bajo que (a) elimina el ruido y (b) le da una mayor resolución.

Mencionas "unidades analógicas" pero te refieres a los valores digitales recopilados de un ADC, por lo que te propongo que hagas esto: al menos pruébalo y observa cómo son las variaciones. Si tiene realmente buenas señales estables en su ADC, entonces puede intentarse alguna forma de amplificación utilizando un amplificador operacional. Si está desacoplando la entrada del ADC con un condensador, puede intentar eliminarlo.

    
respondido por el Andy aka

Lea otras preguntas en las etiquetas