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.