STM32F103RB ADC (fotos incluidas) valores extraños para el sensor de temperatura (LM35)

0

He conectado una batería / 2 baterías (GND y A0) y la medición mostrada en el puerto com26 está bien. He conectado el LM35 (el LM35 tiene 1 grado celsius para un valor medido de 10 mV) en el VCC y el GND y el pin de salida está conectado al A0 (entrada analógica). El valor leído en el puerto com26 a temperatura ambiente (26 grados centígrados) es de 40 grados centígrados. No entiendo cuál es el problema. El sensor está bien porque he usado un multímetro y el valor de salida es 262 mV, dividido por 10 = 26 grados centígrados. pero el uC mide 400mV (en lugar de 262mV) que significa 40 grados. He utilizado una fuente de alimentación externa para el sensor LM35 y el mismo problema. He usado 3.3 y 5V para el LM35 (de la placa de control de estado) y el mismo problema ... Estoy muy agradecido por este problema ...

Soy un principiante en STM32, así que ayúdame.

** Actualización: he realizado actualizaciones de firmware, actualizaciones de la biblioteca stm32, actualizaciones de la imagen 2 ... En la imagen dos, las lecturas de las primeras filas son de una batería de 1.28 V El resto son del sensor LM35. La batería parece estar bien, pero para LM35 obtengo 367 mV en lugar de 270 mV (medido con un multímetro) No sé por qué el valor de L35 no está bien desde el ADC de la unidad ** **

código a continuación:

  #include "test_env.h"
Serial pc(USBTX, USBRX);
AnalogIn analogValue(A2);
DigitalIn userButton(USER_BUTTON);
DigitalOut led(LED1);

// Calculate the corresponding acquisition measure for a given value in mV
#define MV(x) ((0xFFF*x)/3300)

void notify_completion(bool success) {
    led = 0;
    pc.baud(9600);
    int count = 0;
    bool enFlag = true;
    while (1) {

        count++;
        if (userButton == 0) {
            enFlag = (enFlag == true) ? false : true;
            //pc.close();
        }
        if (enFlag) {
            unsigned short meas = (analogValue.read_u16());
            float final = (float) 3300 / 65535 * (float) meas; // normal 0.0008  or 3.3v-3300mV  0,8058608058608059 3300/4095

            pc.printf("%d;%d val in mV: %d, tmp:%d  \n", count, meas, (int) final, int(analogValue.read() * 3300));


        }

        led = !led;

        wait(2.f);
    }

}

    
pregunta Andrew

2 respuestas

0

Solucioné el problema: una tapa polarizada de 10uF (conectada entre la GND y la entrada analógica) hizo el trabajo. La señal de entrada A / D era ruidosa y definitivamente ayudó al condensador entre la GND y la entrada A / D. El sistema mide bien.

    
respondido por el Andrew
2

La función mbed AnalogIn read_u16 escala el valor de ADC en el rango completo de un valor de 16 bits [0. . 0xffff] por lo que está escalando mal el valor en su código. Asumiendo que sus valores mostrados estaban usando la referencia analógica de 3V3, entonces 486 * 3300 / 0xffff == 24 , que parece ser un factor de 10. Parece que ha habido algunos errores en el puerto de Núcleo de las funciones de ADC si miras algunos de los comentarios adjuntos a la página web.

EDIT

En su seguimiento, ha usado el método AnalogIn.read() como verificación, pero este valor es un número de punto flotante escalado entre 0 y 1.0. Para volver a convertir este valor escalado de ADC en un voltaje, debe multiplicarse por el voltaje de referencia en voltios.

Aquí hay un ejemplo de programa mbed que utilicé para leer una resistencia dependiente de la luz. Siempre que el voltaje no sea demasiado bajo, el resultado devuelto por el ADC coincide estrechamente con mi multímetro. Una vez que llega a menos de 100 mV, el ADC se vuelve menos preciso. Estaba usando un Nucleo-F030 para esto, así que una placa similar:

#include <mbed.h>

AnalogIn ldr(PA_0);
Serial serial(SERIAL_TX, SERIAL_RX);

int
main()
{
    serial.baud(115200);
    while (true)
    {
        float adc = ldr.read();
        unsigned short adc_val = ldr.read_u16();
        serial.printf("adc: %f V 16bit: %hu value: %d mV\r\n",
            adc*3.3, adc_val, ((3300 * adc_val) / 0xffff));
        wait_us(1000000);
    }
}

Con esto obtengo la siguiente salida (donde el multímetro lee 1.19V):

adc: 1.167692 16bit: 23173 value: 1166 mV
adc: 1.232161 16bit: 24405 value: 1228 mV
adc: 1.173333 16bit: 23141 value: 1165 mV
adc: 1.231355 16bit: 24405 value: 1228 mV

Esquema del circuito de prueba LDR usando la placa Nucleo-F030R8.

simular este circuito : esquema creado usando CircuitLab

    
respondido por el patthoyts

Lea otras preguntas en las etiquetas