Obtención de un voltaje incorrecto de un sensor analógico

0

Estoy tratando de construir un termómetro muy simple usando registros de cambio, LED de 7 segmentos y un LM35. La idea del proyecto es aprender más sobre los registros de turnos y cómo usarlos. Lo que he hecho hasta ahora es este lío:

Esmuybásico,375HC595Ncon3LEDde7segmentosyunLM35.EstoyusandoestecódigoparacontrolarlosLEDyobtenerlainformacióndelsensor:

/***DigitalThermometer**Acoolandsimpledigitalthermometerusing:*-3x74HC595shiftregisters*-3xCommonanode7-segmentdisplays*-1xLM35analogthermometer*-22x1kresistors**@authorNathanCampos<[email protected]>*@version1.0*//***LEDArrayBitsandpins.*D*ABCPDEFG*11101111*/constinttemp=A0;constintdata=2;constintlatch=3;constintclock=4;constintclr=-1;/***Arduinosetup.*/voidsetup(){Serial.begin(9600);pinMode(data,OUTPUT);pinMode(latch,OUTPUT);pinMode(clock,OUTPUT);if(clr!=-1){pinMode(clr,OUTPUT);}}/***CleartheShiftRegister.*/voidshift_clear(){if(clr!=-1){//Theclearpinisset.digitalWrite(latch,LOW);digitalWrite(clr,LOW);digitalWrite(clr,HIGH);digitalWrite(latch,HIGH);}else{//shiftallthezeros.}}/***ShiftsomedataintotheShiftRegister.**@paramshift1Bytestoshiftintothefirstshiftregister.*@paramshift2Bytestoshiftintothesecondshiftregister.*@paramshift3Bytestoshiftintothethirdshiftregister.*/voidshift_write(byteshift1,byteshift2,byteshift3){digitalWrite(latch,LOW);//PullLOWtostartsendingdata.shiftOut(data,clock,LSBFIRST,shift3);shiftOut(data,clock,LSBFIRST,shift2);shiftOut(data,clock,LSBFIRST,shift1);digitalWrite(latch,HIGH);//PullHIGHtostopsendingdata.}/***Getthebitstolightadigitinthe7-segmentdisplay.**@paramdigitAnumericcharacter.*@paramlight_decimalWanttolightthedecimalcharacter?*@returnTheshiftregisterbytetolightadigit.*/bytelight_digit(unsignedintdigit,boollight_decimal){bytelight=B00000000;//Buildthebinaryfortheshiftregister.switch(digit){case0:light=B11101110;break;case1:light=B01100000;break;case2:light=B11001101;break;case3:light=B11101001;break;case4:light=B01100011;break;case5:light=B10101011;break;case6:light=B10101111;break;case7:light=B11100000;break;case8:light=B11101111;break;case9:light=B11100011;break;default://Lookslikeweshouldreturna"E" of Error.
      light = B10001111;
      break;
  }

  if (light_decimal) {
    // Looks like we need some decimal action going.
    light = light | B00010000;
  }

  return light;
}

/**
 *  Get a digit at a specified position from a integer.
 *
 *  @param number The number to be divided.
 *  @param digit Which digit to be get.
 *  @return The digit.
 */
unsigned int get_digit(unsigned int number, unsigned int digit) {
  static int powers[] = { 1, 10, 100 };
  if (number <= 999) {
    return (number / powers[digit]) % 10;  // The digit.
  } else {
    return 10;  // Just so we'll get a Error digit.
  }
}

/**
 *  Light a 3 digits number.
 *
 *  @param number The number to be shown.
 */
void light_number(unsigned int number) {
  // Get each number.
  byte first = light_digit(get_digit(number, 2), false);
  byte second = light_digit(get_digit(number, 1), true);
  byte third = light_digit(get_digit(number, 0), false);

  // Shift the registers.
  shift_write(first, second, third);
}

/**
 *  Check for the temperature and return a integer for the LEDs.
 *
 *  @return Integer for the LEDs.
 */
unsigned int check_temperature() {
  delay(20);
  int reading = analogRead(temp);
  float voltage = reading * (5.0 / 1023);
  float celcius = (voltage - 0.5) * 100;

  Serial.println(voltage);

  //Serial.print(celcius);
  //Serial.println(" C");
  return celcius * 10;
}

/**
 *  Arduino main loop.
 */
void loop() {
  //check_temperature();
  light_number(check_temperature());
  delay(2000);
}

El problema es que las lecturas del monitor serial de Arduino son "incorrectas" ya que la temperatura de la habitación es ~ 23C:

  

0,85 - 0,74 - 0,73 - 0,78 - 0,80 - 0,72 - 0,71 - 0,81 - 0,61 - 0,61 - 0,71 - 0,81 - 0,79 - 0,69 - 0,74 - 0,78 - 0,80 - 0,77 - 0,74 - 0,78 - 0,80 - 0,71 - 0,67 - 0,71 - 0,71 - 0.67 - 0.71 - 0.67

Cuando mido el voltaje entre el pin de tierra y el pin de salida, obtengo la salida correcta para la temperatura actual (0.23):

Simedíelvoltajeentrelatierrayelpin+Vsobtengo3.84V:

Dado que este es un proyecto de aprendizaje, me encantaría saber por qué sucede esto y cómo corregirlo. Creo que el problema podría estar relacionado con la energía que usa la matriz de LED, si es necesario, puedo usar una fuente de alimentación externa de 5V y dejar que el Arduino se alimente solo con el sensor.

    
pregunta Nathan Campos

1 respuesta

2

Mirando tu foto, parece que tienes + Vs del LM35 conectado a + 5V en el Arduino, así que si estás leyendo 3.84V allí, ese es definitivamente un problema a resolver antes de intentar arreglar algo más.

El problema más probable es este: las pantallas de 7 segmentos (o algún fallo de cableado en la placa de pruebas) extraen demasiada corriente del Arduino y, en última instancia, del conector USB. Esto significa que la regulación de voltaje proporcionada por la fuente de alimentación USB ya no funciona de manera efectiva, por lo que la tensión de suministro que usted midió como 3,84 V probablemente esté errante y, en cualquier caso, baja.

Si bien muchos de los chips en este proyecto, si no todos, funcionarán con voltajes inferiores a los 5 V en que se supone que está el V +, hay algunos aspectos que serán sensibles al V + más bajo.

Una característica notable de V + sensible es el convertidor de A a D en el Atmega328. (Como comentó The Photon). El convertidor se puede configurar para elegir entre un par de voltajes de referencia diferentes. Su código indica que lo tiene configurado para usar el valor V + (VCC) (5 V) como referencia. Si esa referencia es baja (p. Ej., 3.8V), su voltaje de entrada del LM35 se medirá como un número que se ampliará en consecuencia.

Y estoy bastante seguro de que si su V + es bajo, cambiará de acuerdo con la cantidad de LED iluminados y la corriente de dibujo, por lo que sus mediciones variarán según los dígitos que se muestran y viceversa, por supuesto.

Una vez que haya solucionado el problema de la fuente de alimentación, puede evaluar si debe configurar el convertidor A / D para que use la referencia incorporada de 1.1V, ya que esto le dará una mayor resolución y valores convertidos más estables. Consulte la documentación de Atmega328 para obtener más detalles sobre el convertidor A / D y las opciones.

    
respondido por el gwideman

Lea otras preguntas en las etiquetas