Autor Tema: Error en medicion de canal analogico (CCS PIC C Compiler / 16F887a)  (Leído 2457 veces)

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

Desconectado cjbabe

  • PIC10
  • *
  • Mensajes: 1
Hola amigos, les escribo para ver si me pueden ayudar con un fallo que me esta robando el sueño desde hace dias, lo que tengo que hacer es la compensación de un termopar tipo k, lo que hago es amplificar le señal del termopar para mandarla al canal analogico del pic y mediante una funcion calcula la temperatura, en otro canal leo la tension de un lm35 y hago lo mismo, al final solo sumo ambas temperaturas y mando el resultado a una lcd, en simulacion no hay problema alguno, solo es en fisico y es que al imprimir mi temperatura lo que hace es imprimir uno o dos valores incorrectos seguidos del correcto y asi se sigue, y no logro solucionarlo, anexo mi código esperando puedan ayudarme  :-) :


// Conexiones del LCD
#define LCD_RS_PIN PIN_C0
#define LCD_RW_PIN PIN_C1
#define LCD_ENABLE_PIN PIN_C2
#define LCD_DATA4 PIN_C3
#define LCD_DATA5 PIN_C4
#define LCD_DATA6 PIN_C5
#define LCD_DATA7 PIN_C6

//Declaramos las librerias y registros de nuestro PIC
#include <16F877a.h>
#fuses XT, NOWDT,NOPROTECT,NOPUT,NOBROWNOUT,NOLVP
#device ADC = 10
#use delay(clock = 4MHz)
#include <lcd.c>
#byte PORTB=0x86
#byte TRISB=0x06
#define boton_1 PIN_B0
#define boton_2 PIN_B1
#include <math.h>

void main()
{
//Declaramos nuestras constantes y variables
float tempc,temp_c,tempf,E,temp_amb,tempk, tempr;
float a0= 0.00E00;
float a1=2.508355E+01;
float a2=7.860106E-02;
float a3= -2.503131E-01;
float a4= 8.315270E-02;
float a5=-1.228034E-02;
float a6=  9.804036E-04;
float a7= -4.413030E-05;
float a8=1.057734E-06 ;
float a9=-1.052755E-08;
int menu=1;
//Declaramos nuestras entradas digitales
trisb=0b1111111;

//Configuramos los canales analogicos para la lectura de los sensores
  lcd_init();                                   
  lcd_putc('\f'); 
  lcd_gotoxy(1, 1);     
    printf(lcd_putc,"Compensacion de ");
    lcd_gotoxy(1, 2);                         
   printf(lcd_putc,"Termopar tipo K");
   delay_ms(2000);
  lcd_putc('\f'); 
  lcd_gotoxy(1, 1);     
    printf(lcd_putc,"Equipo: 6");
    lcd_gotoxy(1, 2);                         
   printf(lcd_putc,"Grupo: 6AM1");
   delay_ms(2000);
   lcd_putc('\f');
  while(TRUE){
  setup_adc(ADC_CLOCK_INTERNAL);
   setup_adc_ports(AN0_AN1_AN3);   
   delay_ms(1);
    set_adc_channel(1);
     delay_ms(100);
     //Realizamos la lectura del ADC para el termopar y convertimos a tension
    E=read_adc()*(((0.004887)*1000)/(242.2480));
    //Se aplica del polinomio obtenido de las tablas de termopar tipo K para obtener la temperatura medida
    set_adc_channel(0);
     delay_ms(100);
     //Realizamos la lectura del ADC del LM35 para asi obtener la temperatura ambiente
    temp_amb = read_adc()*0.4887;
    temp_amb=0;
    setup_adc (adc_off);
    temp_c=a0+(a1*pow(E,1))+(a2*pow(E,2))+(a3*pow(E,3))+(a4*pow(E,4))+(a5*pow(E,5))+(a6*pow(E,6))+(a7*pow(E,7))+(a8*pow(E,8))+(a9*pow(E,9));
    //Realizamos la compensacion
    tempc=temp_c+temp_amb;
    //Realizamos las debidas conversiones           a C,F,K y R
    tempf=(1.8*tempc)+32;
    tempk=tempc+273;
    tempr=((9/5)*tempc)+491.67;
    //Menu para cambiar las unidades de temperatura mostradas en la LCD
 if (input(boton_1)==1  && input(boton_2)==0)
    {
     do{                                     
         }while(input(boton_1)); 
        menu=menu-1;
        if(menu<1) menu=1;
      delay_ms(10);
      if(menu>4) menu=4;
      delay_ms(10);
        }
      if (input(boton_1)==0 && input(boton_2)==1)
    {
    do{                                     
         }while(input(boton_2)); 
    menu=menu+1;
    delay_ms(10);
    }
switch (menu){
  case 1:
   lcd_gotoxy(1, 1);     
    printf(lcd_putc,"    Celsius     ");
    lcd_gotoxy(1, 2);                         
   printf(lcd_putc,"T=%2.0f  %cC     ",tempc, 223);
     break;
    case 2:
    lcd_gotoxy(1, 1);
    printf(lcd_putc,"   Fahrenheit   ");
    lcd_gotoxy(1, 2);                         
    printf(lcd_putc,"T=%2.0f  %cF    ",tempf,223);
    break;
    case 3:
    lcd_gotoxy(1, 1);
    printf(lcd_putc,"     Kelvin     ");
    lcd_gotoxy(1, 2);                         
    printf(lcd_putc,"T=%2.0f  K    ",tempk);
    break;
    case 4:
    lcd_gotoxy(1, 1);
    printf(lcd_putc,"    Rankine     ");
    lcd_gotoxy(1, 2);                         
    printf(lcd_putc,"T=%2.0f  R    ",tempr);
    break;
     
  }
  delay_ms(100);
  }
  }

Desconectado KILLERJC

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 8242
Re:Error en medicion de canal analogico (CCS PIC C Compiler / 16F887a)
« Respuesta #1 en: 25 de Abril de 2018, 08:59:13 »
Como comentas es algo en fisico, asi que deberias poder ver la tension en los pines del LM35 y la salida del AO, para ver si hay variaciones del mismo, sino pienso que una pequeña resistencia + condensador podria ser util. 100ohms y .1uF. Y tal ves alguna resistencia de pull-down en ambos de 10K en la salida del AO y del LM, ya que no tienen nada y si no hay datos pueden estar flotando.
Como la temperatura es algo "lento" no vas a tener problemas que tenga una capacidad que absorba los cambios rapidos.

Luego de eso solo me queda pensar que el ADC no tiene tiempo suficiente como para cargar el capacitor, y eso que le estas dando 100ms.
Sino la otra es leer unas cuantas veces y tomar la ultima. O leer unas cuantas veces y promediarla. Veras cual te funciona mejor. Pero ya esto es tratar de evitar el problema.

Desconectado Eduardo2

  • PIC24H
  • ******
  • Mensajes: 1004
Re:Error en medicion de canal analogico (CCS PIC C Compiler / 16F887a)
« Respuesta #2 en: 25 de Abril de 2018, 09:38:08 »
.... en simulacion no hay problema alguno, solo es en fisico y es que al imprimir mi temperatura lo que hace es imprimir uno o dos valores incorrectos seguidos del correcto y asi se sigue, y no logro solucionarlo, anexo mi código esperando puedan ayudarme  :-) :

Empezá ingresando una tensión estable. Esto es, en la entradas RA1 sacá el AD620 y colocá un divisor de tensión (tomando tensión pegado al PIC). 
Ahí  vas a saber de qué lado está el problema. Si ruido en el AD620 o software.


 

anything