Dos pantallas multiplexadas de 7 segmentos parpadeando

Estoy trabajando en un sensor de temperatura. Tengo:

  • LM35 (sensor)
  • LM741 (amplificador operacional para amplificar LM35 Vout a 5V)
  • FOTO 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 quieres ver la simulación en Proteus: LM35 - SSD

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

diagrama esquemático

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.

Es probable que esto se deba a que el simulador no se está ejecutando a velocidades en tiempo real. Cuando construyes esto en el hardware, los dígitos alternarán lo suficientemente rápido como para que la persistencia de la visión haga que parezcan estar iluminados simultáneamente. En otras palabras, es muy probable que este problema sea un caso de confiar demasiado en el simulador. Los simuladores solo te llevan hasta cierto punto...
Tenga en cuenta que este circuito no funcionará según lo diseñado: no puede ejecutar un amplificador operacional 741 con un suministro de 5V.

Respuestas (2)

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

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

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 deja más claro cómo se hace el tiempo (al principio me engañó, por lo que mi primera respuesta fue falsa). Esto también asegurará que ambos dígitos tengan el mismo tiempo de iluminación, en lugar de que uno de ellos también incluya el tiempo de procesamiento, lo que lo hará un poco más brillante.

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

Como comentó @ uint128_t, su velocidad de simulación también puede ser un poco lenta, pero primero pruebe los cambios de código.

La visualización es peor para ser honesto
Suponiendo que no haya otros gastos generales, 20 ms por actualización son 50 Hz. Eso es bastante bajo, y su ojo tendrá muy poca tolerancia a la variación antes de que lo vea como un parpadeo. Sería mejor actualizar los segmentos de la pantalla a 100 Hz o más. Use una rutina de interrupción para realizar las actualizaciones, una máquina de estado simple que ejecuta una interrupción de 1 kHz podría alternar entre los dígitos con cada dígito igualándose a tiempo, y tener poco o nada de tiempo donde cualquiera de los dígitos no está encendido. La lectura del valor y el cálculo de los dígitos ocurrirían en un subproceso separado, probablemente simplemente el ciclo principal esperando que termine el ADC.