TODOPIC
Microcontroladores PIC => Todo en microcontroladores PIC => Mensaje iniciado por: chicho1976 en 09 de Junio de 2021, 19:01:05
-
Hola a todos.
Estoy realizando un proyecto con un sensor NTC, un microcontrolador pic 18f4550 y display 7 segmentos de cuatro dígitos.
la idea es leer la temperatura sea negativa oséa bajo cero o positiva y visualizarlo en el display, si es negativa mostrar el símbolo negativo y el símbolo de grados.
pero cuando realice pruebas para la programación de la multiplexación del display me funciono correctamente, cuando le agregue el código para la lectura del sensor NTC, no me quiere funcionar.
el código del sensor lo verifique con una lcd y me funciono correctamente mostrándome la lectura del sensor.
les comparto código y pantallazo de simulación en proteus, no se si me puedan ayudar para ver donde tengo el error.
Gracias.
#include <18f4550.h>
#include <math.h>
#fuses nowdt, xt, put, noprotect
#use delay (clock = 4M)
#use standard_io(B;C)
#define C1 pin_C0
#define C2 pin_C1
#define C3 pin_C2
#define C4 pin_C4
// 0 1 2 3 4 5 6 7 8 9 GR NEG
const int disp[12]={0x40,0x79,0x24,0x30,0x19,0x12,0x02,0x78,0x00,0x18,0x9C,0xBF};
//___________________________________________________VARIABLES DISPLAY
int num = 0;
int dec=0, uni=0, dec2=0, uni2=0;
int num2 =0;
//Variables temperatura-------------------------------
float tv,tr,temp=0,y;
int16 value;
//____________________________________________________
void Mostrar_neg(){ //si el valor de la temperatura es negativa (menor que cero)
output_C(0b00000010); //decena
output_B(disp[dec2]);
delay_ms(2);
output_C(0b00000100); //unidad
output_B(disp[uni2]);
delay_ms(2);
output_C(0b00010000); //grados
output_B(disp[10]);
delay_ms(2);
output_C(0b00000001); //signo menor
output_B(disp[11]);
delay_ms(2);
}
//_____________________________________________________
void Mostrar_Pos(){ //si el valor de la temperatura es positivo (mayor que cero)
output_C(0b00000010); //decena
output_B(disp[dec]);
delay_ms(1);
output_C(0b00000100); //unidad
output_B(disp[uni]);
delay_ms(1);
output_C(0b00010000); //grados
output_B(disp[10]);
delay_ms(1);
}
//____________________________________________________
void Config(){ //configuracion analogica
setup_port_a( ALL_ANALOG );
setup_adc( ADC_CLOCK_INTERNAL );
set_adc_channel( 0 );
delay_us(8);
}
//____________________________________________________
void calculo_temp(){ //calculo de la temperatura del sensor NTC
value = Read_ADC();
tv = 5.0 * value / 1024.0;
tr = tv * 10000.0 / (5.0 - tv); // TTC103 10K -30/+125
y = log(tr/20000.0);
y = (1.0/298.15) + (y *(1.0/4050.0));
temp=1.0/y;
temp = temp -273.15;
num = temp*1;
}
//____________________________________________________
void Op_Neg(){ //busco unidades y decenas del valor obtenido en el calculo NTC
num2 = abs(num); //convirtiendolo de negativo a positivo
dec2 = num2/10;
uni2 = num2-(dec2*10);
}
//___________________________________________________
void Operacion_Pos(){ //busco unidades y decenas del valor obtenido en el calculo NTC
//si el valor obtenido es positivo
dec = num/10;
uni = num-(dec*10);
}
//$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$
void main(){
Config();
while(TRUE){
calculo_temp();
if(num < 1){
Op_Neg();
Mostrar_neg();
}
else{
Mostrar_Pos();
}
}
}
-
pero cuando realice pruebas para la programación de la multiplexación del display me funciono correctamente, cuando le agregue el código para la lectura del sensor NTC, no me quiere funcionar.
Pueden ocurrir dos cosas:
1- Tu codigo donde muestra la temperatura en el display, es decir la multiplexacion, depende mucho de las demoras entre multiplexaciones. Si vos ahora le agregas calculos que requieren funciones como logaritmos, el uso de variables flotantes. Todo eso ocupa muchisimos ciclos del micro, ciclos que se traducen en tiempo, y tiempo que no se esta mostrando sino que se esta "calculando" seguramente por eso veas 1 solo digito tal ves. O el efecto de multiplexacion no se nota... Ademas 1ms es bueno para la simulacion pero para la realidad tal ves seria mejor 10ms.
Una solucion seria con una interrupcion de un Timer generar la multiplexacion, asi no depender de lo que pongas en el main.
2- Que tu codigo de conversion en realidad termine con un valor 0. Y te este mostrando 00 como lo que es. Aunque esto segun lo que contas funciona en un LCD.. Asi que segurametne sea el primer caso.
-
Además de lo anterior, en proteus usas un ntc de 10k pero los cálculos los hacés para uno de 20k
Y también:
- No declarás #device ADC=10 para que se programe el AD en 10bits.
- Los tipos en CCS son unsigned por defecto. O bien declarás num como signed int o usás #TYPE signed para que sean signed por defecto (esta es la causa que se pudra todo con temperaturas negativas).