Cálculo de fórmulas e impresión de valores negativos.

4

Estoy leyendo con éxito el valor ADC externo usando ATmega32-A.

 Unsigned int adc;
 adc = AD7798_16(0x58, 0xFFFF);                           // read register 
       printf("ADC value is %d\r\n", adc);   

Estoy obteniendo un valor de ADC como rango de números decimales entre "0 a 65535". Quiero convertirlo en voltaje analógico usando la siguiente fórmula.

  

Código = 2 N - 1 × [( AIN × GAIN / VREF ) + 1]

     

donde:
AIN es el voltaje de entrada analógica.
N = 16 para el AD7798, y N = 24 para el AD7799.

He simplificado la fórmula y el cálculo

// fórmula para calcular la tensión analógica de la salida digital: Código = 2N - 1 × [(AIN × GAIN / VREF) + 1] // GAIN / VREF = 1 / 2.5 = > 0.4
// 0.4 Ain = ((adc / 32768) - 1)

flotar Ain;

Ain = ((((((float) adc) / 32768) - 1) / 0.416);

printf ("value:%. 2f [v] \ r \ n", Ain);

La fórmula anterior devuelve siempre un valor negativo. Quiero imprimir ese valor negativo. He intentado lo anterior pero no funciona. ¿Cómo imprimir el valor de Ain? Aquí adc es un valor sin signo, así que me estoy convirtiendo en flotante.

He intentado así también

Ain = (((adc / 32768.0) - 1) / 0.416);

printf("value:%.2f [v]\r\n", Ain);

pero no puedo imprimir ese valor.

    
pregunta verendra

1 respuesta

1

Las bibliotecas AVR no se compilan en la compatibilidad con la impresión de valores de punto flotante de forma predeterminada. Esto es para ahorrar espacio en sus entornos de recursos limitados. Debe indicar al compilador y al vinculador que habilite la compatibilidad con esta característica.

De la Avr-libc documentación en vfprintf() :

  

Desde la implementación completa de todas las características mencionadas se convierte en   bastante grande, se pueden seleccionar tres sabores diferentes de vfprintf()   utilizando las opciones del enlazador. El vfprintf() predeterminado implementa todas las   funcionalidad mencionada, excepto las conversiones de punto flotante. Se minimiza   La versión de vfprintf() está disponible que solo implementa lo muy básico.   Funciones de conversión de enteros y cadenas, pero solo el # adicional   La opción se puede especificar utilizando indicadores de conversión (estos indicadores se analizan   correctamente de la especificación de formato, pero simplemente ignorado).   Esta versión se puede solicitar usando las siguientes opciones de compilación:

     

-Wl,-u,vfprintf -lprintf_min

     

Si la funcionalidad completa, incluidas las conversiones de punto flotante, es   requerido, se deben usar las siguientes opciones:

     

-Wl,-u,vfprintf -lprintf_flt -lm

(énfasis mío)

Ya que está utilizando CodeVisionAVR como discutido en el chat , tienen esta opción incorporada en su ventana de configuración como se ve en la página 4, paso 9 de esto tutorial :

    
respondido por el embedded.kyle

Lea otras preguntas en las etiquetas