Estoy trabajando en un sensor de temperatura. Tengo:
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:
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.
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.
uint128_t
usuario39382