Saltar al contenido principal
LibreTexts Español

26.2: Un ejemplo práctico — Mapeo de un sensor

  • Page ID
    82434
  • \( \newcommand{\vecs}[1]{\overset { \scriptstyle \rightharpoonup} {\mathbf{#1}} } \) \( \newcommand{\vecd}[1]{\overset{-\!-\!\rightharpoonup}{\vphantom{a}\smash {#1}}} \)\(\newcommand{\id}{\mathrm{id}}\) \( \newcommand{\Span}{\mathrm{span}}\) \( \newcommand{\kernel}{\mathrm{null}\,}\) \( \newcommand{\range}{\mathrm{range}\,}\) \( \newcommand{\RealPart}{\mathrm{Re}}\) \( \newcommand{\ImaginaryPart}{\mathrm{Im}}\) \( \newcommand{\Argument}{\mathrm{Arg}}\) \( \newcommand{\norm}[1]{\| #1 \|}\) \( \newcommand{\inner}[2]{\langle #1, #2 \rangle}\) \( \newcommand{\Span}{\mathrm{span}}\) \(\newcommand{\id}{\mathrm{id}}\) \( \newcommand{\Span}{\mathrm{span}}\) \( \newcommand{\kernel}{\mathrm{null}\,}\) \( \newcommand{\range}{\mathrm{range}\,}\) \( \newcommand{\RealPart}{\mathrm{Re}}\) \( \newcommand{\ImaginaryPart}{\mathrm{Im}}\) \( \newcommand{\Argument}{\mathrm{Arg}}\) \( \newcommand{\norm}[1]{\| #1 \|}\) \( \newcommand{\inner}[2]{\langle #1, #2 \rangle}\) \( \newcommand{\Span}{\mathrm{span}}\)\(\newcommand{\AA}{\unicode[.8,0]{x212B}}\)

    Como se mencionó al principio, el sistema de entrada analógica puede usarse para obtener datos de una variedad de sensores. Un problema potencial es que el rango de voltajes de salida del sensor puede no “alinearse” convenientemente con el rango de entrada ADC, lo que requiere alguna forma de escalado y compensación de datos. Es decir, los voltajes de entrada deberán mapearse en un rango de valores de salida numéricos deseados. A veces esto se puede hacer con hardware pero otras veces bastará con un simple proceso matemático.

    Por ejemplo, supongamos que tenemos un sensor que usaremos para medir la temperatura del agua líquida a presión estándar. Las especificaciones indican que la unidad producirá un voltio en congelación (32 grados Fahrenheit) y tres voltios a ebullición (212 grados Fahrenheit). Suponiendo que estamos usando la referencia predeterminada que produce un rango de entrada de cero a cinco voltios, solo usaremos el 40% del rango dinámico disponible (es decir, dos voltios de cinco). Para aprovechar al máximo el ADC de diez bits, necesitaríamos hacer funcionar el sensor a través de un circuito de acondicionamiento de señal para mapear el rango de salida de dos voltios en el rango de entrada de cinco voltios. Esto requeriría un amplificador con una ganancia de voltaje de 2.5 y un cambio de nivel de salida de un voltio. Es decir, restamos un voltio de la salida del sensor y luego multiplicamos el resultado por 2.5. Al hacerlo, la salida de 32 grados de un voltio producirá cero voltios y la salida de 212 grados de tres voltios producirá cinco voltios. Se puede diseñar un amplificador operacional modesto o una etapa de transistor discreto para lograr esto. En la entrada ADC el rango total de 180 grados se dividirá en 1024 niveles, produciendo una resolución de mejor a 0.2 grados por paso. Tenga en cuenta que los valores numéricos del ADC no son los valores de temperatura. Una temperatura de 32 grados produce una salida de ADC de cero mientras que 212 grados produce 1023 a partir del ADC. Si necesitamos mostrar las temperaturas de Fahrenheit, tal vez en una pantalla multiplexada de siete segmentos o LCD, necesitaremos mapearlas. Esto se puede hacer con una fórmula simple que veremos en un momento o con la función Arduino map ().

    Si se puede tolerar una resolución más modesta, se puede utilizar un mapeo de software simple. Si tomamos la salida del sensor “tal cual”, tenemos que aceptar que solo estaremos obteniendo el 40% de la resolución disponible en este ejemplo. Eso todavía nos dará una resolución de alrededor de medio grado. Suponiendo que esto es suficiente, para la lectura numérica que acabamos de mencionar, todo lo que necesitamos hacer es mapear una tensión de entrada de un voltio a una salida numérica de 32 y una entrada de tres voltios a una salida numérica de 212. La entrada de un voltio representa una quinta parte de la señal de entrada máxima del ADC y produciría un valor de aproximadamente 205. La entrada de tres voltios produciría aproximadamente 614. 205 representa el desplazamiento de 32 grados y el rango de 614−205 o 409 necesita representar el rango de temperatura de 180 grados. Podemos hacer esto con una pequeña fórmula:

    // av is the value returned from analogRead() and
    // dv is the value to be displayed
    
    dv = 32+180*(av-205)/409;
    

    Tenga en cuenta que este cálculo se realiza completamente con matemáticas enteras en lugar de coma flotante para obtener la mejor velocidad posible y un código compilado mínimo. Para valores muy grandes de la variable av el producto podría desbordar un int sin signo por lo que se necesitaría un cálculo largo. Tenga en cuenta que la multiplicación debe hacerse antes de la división entera o se producirá una horrenda pérdida de precisión debido al truncamiento. dv en sí mismo todavía podría ser un carácter corto (o incluso un carácter sin firmar), por lo que un pequeño casting creativo podría producir algo como esto:

    dv = (short)(32+180*(long)(av-205)/409);
    

    Como estamos usando números enteros, la resolución de temperatura mostrada será de un grado (truncado).


    This page titled 26.2: Un ejemplo práctico — Mapeo de un sensor is shared under a CC BY-NC-SA 4.0 license and was authored, remixed, and/or curated by James M. Fiore via source content that was edited to the style and standards of the LibreTexts platform; a detailed edit history is available upon request.