Autor Tema: Sensor NTC y display 7 segmentos.  (Leído 1633 veces)

0 Usuarios y 1 Visitante están viendo este tema.

Desconectado chicho1976

  • PIC10
  • *
  • Mensajes: 7
Sensor NTC y display 7 segmentos.
« 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();
  }
 }
}



Desconectado KILLERJC

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 8242
Re:Sensor NTC y display 7 segmentos.
« Respuesta #1 en: 09 de Junio de 2021, 19:29:02 »
Citar
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.

Desconectado Eduardo2

  • PIC24H
  • ******
  • Mensajes: 1004
Re:Sensor NTC y display 7 segmentos.
« Respuesta #2 en: 09 de Junio de 2021, 21:16:26 »
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).
« Última modificación: 09 de Junio de 2021, 23:08:19 por Eduardo2 »


 

anything