Dos pantallas multiplexadas de 7 segmentos parpadean

1

Estoy trabajando en un sensor de temperatura. Tengo:

  • LM35 (Sensor)
  • LM741 (amplificador operacional para amplificar Vout LM35 a 5V)
  • PIC 14F458

La temperatura se muestra en dos pantallas de 7 segmentos con un solo convertidor BCD (4511). Por lo tanto, multiplexé estas dos pantallas.

El problema es que mis pantallas de 7 segmentos parpadean mucho y no sé por qué.

Si desea ver la simulación en Proteus: LM35 - SSD

Aquí está el diagrama esquemático en Proteus:

Y aquí está el código C en CCS.

#include <sonde2.h>
#include <math.h>

#define CONV_CST 0.48875855327
#define TRESHOLD 25
#define TENS_DISPLAY PIN_E0
#define UNITY_DISPLAY PIN_E1
#define GREEN_LED PIN_C0
#define RED_LED PIN_C1


int simpleBCDConverter(value) {
   // Shift tens from 4 bits to the left
   // So we have ([Tens] [Unity]) XXXX XXXX
   return ((value / 10 % 10 << 4) + value % 10);
}

/**
 * Convert a number of 10 bits to its BCD equivalent
 */
void bitsToBCD(int value) {
   int tens = value / 10 % 10;
   int unity = value % 10;

   output_high(TENS_DISPLAY);
   output_d(tens);
   output_low(UNITY_DISPLAY);
   delay_ms(10);

   output_high(UNITY_DISPLAY);
   output_d(unity);
   output_low(TENS_DISPLAY);
   delay_ms(10);


}

/**
 * Check temp level, and switch on the right led
 */
void checkLed(int temp) {
   // If temps is greater than treshold
   // Blinking Red LED with 555 (astable)
   if (temp > TRESHOLD) {
      output_low(GREEN_LED);
      output_high(RED_LED);
   } else { // Otherwise, green LED
      output_high(GREEN_LED);
   }
}

void main()
{
   setup_adc_ports(AN0);
   set_adc_channel(0); // A0 connecté à l'entrée analogique
   setup_adc(ADC_CLOCK_INTERNAL);
   setup_timer_0(RTCC_INTERNAL|RTCC_DIV_1|RTCC_8_BIT); // 51,2 us overflow
   setup_timer_1(T1_INTERNAL|T1_DIV_BY_1); //13,1 ms overflow

   setup_low_volt_detect(FALSE);

   int temperature;

   while(TRUE) {
      //delay_ms(10);
      // Read the value from A/N converter (10bits [0 => 1023])
      // And convert it to a range from 0 to 100 (°C)
      // 0.48 => (5 / 1023) * 100
      temperature = read_adc() * CONV_CST;

      // Check temp level
      checkLed(temperature);

      // Convert bits to BCD
      // And show temp on 7 segment displays
      bitsToBCD(temperature);
   }

}

Gracias.

    
pregunta Mathieu Rousseau

2 respuestas

1
  

El problema es que mis pantallas de 7 segmentos parpadean mucho y no sé por qué.

ejecuta la rutina de visualización en un temporizador ISR para que se actualice en un intervalo fijo.

    
respondido por el dannyf
0

Sugeriría estructurar el código de esta manera:

output_d(tens);
output_high(TENS_DISPLAY);
delay_ms(10);
output_low(TENS_DISPLAY);

output_d(unity);
output_high(UNITY_DISPLAY);
delay_ms(10);
output_low(UNITY_DISPLAY);

Esto hace que sea más claro cómo se realiza el tiempo (inicialmente me engañé con esto, por lo que mi primera respuesta fue falsa). Esto también asegurará que ambos dígitos obtengan el mismo tiempo de encendido, incluso antes de que uno de ellos incluya el tiempo de procesamiento, lo que lo hace un poco más brillante.

Otra sugerencia es que es posible que desee reducir esos retrasos de 10 ms. Le brindan 20 ms por pantalla completa y un tiempo de ADC y procesamiento ... su pantalla parpadeará a menos de 50 Hz. Eso podría ser notable. Es posible que desee reducir eso a 1 ms. Es una compensación dependiendo de qué tan lento es el otro procesamiento. Si el retraso es demasiado pequeño, la mayoría del tiempo la pantalla estará apagada (durante el procesamiento) y se percibirá como un brillo más bajo.

Como comentó @ uint128_t, tu velocidad de simulación también podría ser un poco lenta, pero primero prueba los cambios de código.

    
respondido por el anrieff

Lea otras preguntas en las etiquetas