Valor de temperatura de lectura

0

Estoy usando ese sensor enlace

pero después de leer la hoja de datos, hay una tabla para la conversión de temperatura. No puedo entenderlo. ¿Alguien, por favor, me dirá cómo convertir la temperatura de esa mesa al punto de flotación?

    
pregunta Ahmed Saleh

2 respuestas

2

Ya tienes tu respuesta. Pero agregaré lo siguiente:

Este es un "sensor de temperatura digital de 10 bits". Nota: Digital . No produce valores de punto flotante, en absoluto. Se supone que debes entender qué es un valor binario de 10 bits y, más aún, debes entender la notación de dos complementos firmados. Si nunca has estudiado nada de eso, AHORA es el momento de comenzar. Es un absoluto DEBE para cualquier persona que realice trabajos de programación integrados.

Dado que proporcionan 10 bits, y como no necesitan más de 8 bits para la parte del número entero que admiten, colocaron el número entero, entero en los 8 bits superiores y utilizaron los 2 bits menos significativos para la parte fraccionaria. Me he tomado la libertad de insertar ese punto de la raíz binaria implícita en la columna tres a continuación.

Sin embargo, el valor de punto flotante ya está en la primera columna. Si eso es todo lo que querías, ya lo proporcionaron. Pero creo que no quieres solo eso. Creo que quieres una fórmula para que puedas aceptar el valor \ $ DB_9 \ dots DB_0 \ $ y convertirlo en un valor de punto flotante. Eso es diferente. Mientras tanto, aquí está la tabla modificada:

$$ \ begin {array} {rcl} Temperatura y amp; DB_9 \ dots DB_0 & Punto fijo ~ –128 ^ {\ circ} \ textrm {C} & 10 0000 0000 & 10 0000 00.00 \\ –125 ^ {\ circ} \ textrm {C} & 10 0000 1100 y amp; 10 0000 11.00 \\ –100 ^ {\ circ} \ textrm {C} & 10 0111 0000 & 10 0111 00.00 \\ –75 ^ {\ circ} \ textrm {C} & 10 1101 0100 & 10 1101 01.00 \\ –50 ^ {\ circ} \ textrm {C} & 11 0011 1000 & 11 0011 10.00 \\ –25 ^ {\ circ} \ textrm {C} & 11 1001 1100 y amp; 11 1001 11.00 \\ –0.25 ^ {\ circ} \ textrm {C} & 11 1111 1111 y amp; 11 1111 11.11 \\ 0 ^ {\ circ} \ textrm {C} & 00 0000 0000 & 00 0000 00.00 \\ +0.25 ^ {\ circ} \ textrm {C} & 00 0000 0001 & 00 0000 00.01 \\ +10 ^ {\ circ} \ textrm {C} & 00 0010 1000 & 00 0010 10.00 \\ +25 ^ {\ circ} \ textrm {C} & 00 0110 0100 & 00 0110 01.00 \\ +50 ^ {\ circ} \ textrm {C} & 00 1100 1000 & 00 1100 10.00 \\ +75 ^ {\ circ} \ textrm {C} & 01 0010 1100 y amp; 01 0010 11.00 \\ +100 ^ {\ circ} \ textrm {C} & 01 1001 0000 & 01 1001 00.00 \\ +125 ^ {\ circ} \ textrm {C} & 01 1111 0100 & 01 1111 01.00 \\ +127 ^ {\ circ} \ textrm {C} & 01 1111 1100 y amp; 01 1111 11.00 \\ \ end {array} $$

NOTA: rara vez convierto las cosas a punto flotante en el trabajo incrustado. Los datos entran en el software en formatos binarios. Los datos salen fuera del software también en formatos binarios. Rara vez hay una necesidad de convertir a punto flotante, en el medio. Al hacerlo, se utilizan las matemáticas donde las constantes se truncan y las operaciones truncan los resultados y las reglas habituales en matemáticas no siempre se aplican bien. Además, también cuesta mucho TIEMPO y espacio. Por lo tanto, tengo que tener una buena razón para usar el punto flotante, aparte de la mera conveniencia.

Te enfrentas a un problema con el complemento de dos bits de 10 bits en la programación integrada. Es raro que realmente tengas un procesador de 10 bits. Más común es 8, 16 y 32 bits. Dado que el resultado es de 10 bits de tamaño, vamos a suponer 16 sobre un tamaño de palabra que puede usar.

No sé cómo realmente registra este valor de 10 bits en la memoria, pero es probable que esté en los 10 bits superiores de un resultado de 16 bits o en los 10 bits inferiores. De cualquier manera, es probable que los 6 bits restantes sean todos cero.

Tendré que asumir un lenguaje de programación para el siguiente ejemplo de código porque los detalles son importantes aquí. Usaré C ya que se usa comúnmente.

Así que aquí hay dos funciones que harán el trabajo. Cuál usar depende de dónde se encuentre el valor (10 superior o inferior). Usaré un tipo de valor especial de "uint16_t" para indicar un valor de 16 bits sin signo y "int16_t" para representar un de 16 bits firmado. valor.

/*  10-bit value is in upper 10 bits of the 16-bit value 'v'

    Since the value is in the upper 10 bits, just tell C that it
    is signed instead of unsigned, then tell C to cast that into
    a float. C will preserve the signed value during that conversion.
    However, C still considered it to be an integer so there are no
    decimal parts and the value will be 256 times the actual value,
    intended. This is because there are 2 decimal bits in the value
    itself and another 6 unused '0' bits, totaling 8 bits (256) that
    need to be accounted for. So it finally divides by 256.0 in order
    to achieve that final adjustment.
*/
float cvtupper10( uint16_t v ) {
    return ((float) ((int16_t) v)) / 256.0;
}

/*  10-bit value is in lower 10 bits of the 16-bit value 'v'

    This code replicates the logic indicated in the above function,
    except that the 10-bit value here starts out in the lower 10
    bits. Therefore, a 6-bit upward shift is made before performing
    the rest of the operations discussed above.    
*/
float cvtlower10( uint16_t v ) {
    return ((float) ((int16_t) (v << 6))) / 256.0;
}

Solo debes usar UNA de las funciones anteriores, no ambas. Cuál depende del tipo de resultado de 16 bits que tenga al registrar su valor de 10 bits.

    
respondido por el jonk
1

La tabla simplemente muestra qué es cada bit en el resultado de 10 bits. Menciona que está en el complemento de 2, un método para representar números negativos. Si está familiarizado con el binario normal, es el mismo, excepto que se agregaron en un "punto decimal" entre el segundo y tercer bit menos significativos.

En la base diez, el punto decimal va entre 10 ^ 0 y 10 ^ -1. Entre el dígito de los solteros y el dígito de las décimas.

En la base dos, es lo mismo, excepto que los bits representan el punto de uno y el punto de las mitades. 2 ^ 0 y 2 ^ -1.

Entonces, para finalmente llegar al punto, cada bit se ve así:

 0b(-2^7)(2^6)(2^5)(2^4)(2^3)(2^2)(2^1)(2^0) (2^-1)(2^-2) 
   (-128)( 64)( 32)( 16)( 8 )( 4 )( 2 )( 1 ) (0.5 )(0.25)
                                            ^
                                     'decimal' point

Si no te importa particularmente bajar a 1/2 o 1/4 grado, simplemente puedes desplazar a la derecha (> >) dos veces. Debe estar seguro de que está haciendo el cambio a la derecha, no lógico (lógico perdería el valor negativo de su temperatura).

Si se preocupa por los grados 1/2 o 1/4, y necesita usar un punto flotante, puede configurar un bucle para interpretar el valor de cada bit, pero dado que probablemente esté usando un microcontrolador de algunos ordena esto, eso lleva mucho más tiempo que las matemáticas de enteros simples.

    
respondido por el ambitiose_sed_ineptum

Lea otras preguntas en las etiquetas