Autor Tópico: Problemas no conversor ad...(ele fica saltando 40mV)  (Lida 4984 vezes)

Description:

0 Membros e 1 Visitante estão vendo este tópico.

Smarley

  • Visitante
Problemas no conversor ad...(ele fica saltando 40mV)
« Online: 08 de Fevereiro de 2009, 00:53 »
Olá!
Fiz um programa com conversor ad para ler uma temperatura.
O sensor que estou usando é o LM35, mas estou com problemas...
O LM35 libera 0,32V digamos.
Mas o meu PIC le e mostra 32 e a cada 10 segundos por exemplo, da um salto para 35 ou 36 e volta para os 32. Mas no LM35 está sempre 0,32V.
Isso ocorre também quando ligo o pino ao terra.
Fica marcando 0, ai derrepente salta para 4 ou 5...
O programa que fiz foi esse:

Citar
    long int valor;
    int32 val32;
    void main()
    {
    lcd_init();
    setup_adc_ports(AN0_AN1_AN3);
    setup_adc(ADC_CLOCK_INTERNAL);
    setup_psp(PSP_DISABLED);
    setup_spi(SPI_SS_DISABLED);
    setup_timer_0(RTCC_INTERNAL|RTCC_DIV_1);;
    setup_timer_1(T1_DISABLED);
    setup_timer_2(T2_DISABLED,0,1);
    setup_comparator(NC_NC_NC_NC);
    setup_vref(FALSE);
    set_adc_channel(0);
    while(true)
    {
    valor=read_adc();
    if(valor) valor += 1;
    val32=(valor*4+((int32)valor*113)/128)/10;
    printf(lcd_putc,"\f Temp.=%luC",val32);
    delay_ms(200);
    }
    }


Eu dividi por 10 para mostrar a temperatura em graus.
Porque será que está dando esse problema?

O PIC que eu uso é o 16F877A.

Obrigado!

Offline Blackmore

  • CNCMASTER
  • ******
  • Posts: 1568
  • Sexo: Masculino
  • Profissão: Projetista Mecânico/Automação
Re: Problemas no conversor ad...(ele fica saltando 40mV)
« Resposta #1 Online: 08 de Fevereiro de 2009, 10:42 »
sem dúvidas que este programa é em C ... mas qual o compilador?
se for possível colocar parte do esquema acho ajudaria a lhe ajudar.  ;)

abrax!

Smarley

  • Visitante
Re: Problemas no conversor ad...(ele fica saltando 40mV)
« Resposta #2 Online: 08 de Fevereiro de 2009, 10:52 »
Eae cara!
Estou usando o PCW, CCS Compiler.
Citar
#include "C:\Program Files\PICC\PICC\secador.h"


#define LCD_ENABLE_PIN PIN_B0
#define LCD_RS_PIN PIN_B1
#define LCD_RW_PIN PIN_B2
#define LCD_TYPE 2
#include <lcd.c>
long int valor;
int32 val32,tempmax=120,tempmin=115,almax=130,almin=105;
int x;
static boolean y;

void main()
{
   lcd_init();
   setup_adc_ports(AN0_AN1_AN3);
   setup_adc(ADC_CLOCK_INTERNAL);
   setup_psp(PSP_DISABLED);
   setup_spi(SPI_SS_DISABLED);
   setup_timer_0(RTCC_INTERNAL|RTCC_DIV_1);;
   setup_timer_1(T1_DISABLED);
   setup_timer_2(T2_DISABLED,0,1);
   setup_comparator(NC_NC_NC_NC);
   setup_vref(FALSE);
   set_adc_channel(0);
   delay_ms(200);
   x=0;
   y=0;
   while(true)
   {
   valor=read_adc();
   if(valor) valor += 1;
   val32=(valor*4+((int32)valor*113)/128)/10;
   printf(lcd_putc,"\f   Temp.=%luC\nMax=%lu Min=%lu",val32,tempmax,tempmin);
   delay_ms(200);
   
   
   if((val32>almax)&&(y==0))
   {
   output_high(PIN_C2);
   printf(lcd_putc,"\f  TEMPERATURA\n    MAXIMA!");
   delay_ms(5000);
   output_low(PIN_C2);
   y=1;
   }
   if((val32<almin)&&(y==0))
   {
   output_high(PIN_C2);
   printf(lcd_putc,"\f  TEMPERATURA\n    MINIMA!");
   delay_ms(5000);
   output_low(PIN_C2);
   y=1;
   }
   if(val32>tempmax)
   {
   while(input(PIN_D6)!=0)
   {
   output_high(PIN_C0);
   y=0;
   }
   output_low(PIN_C0);
   }
   if(val32<tempmin)
   {
   while(input(PIN_D7)!=0)
   {
   output_high(PIN_C1);
   y=0;
   }
   output_low(PIN_C1);
   }
   if(input(PIN_D0)&&x==0)
   {
   while(input(PIN_D0))
   {
   printf(lcd_putc, "\fAlterar temp.\nmax. para: %luC", tempmax);
   delay_ms(200);
   if(input(PIN_D1))
   {
   tempmax=tempmax+1;
   }
   if(input(PIN_D2))
   {
   tempmax=tempmax-1;
   }
   x=1;
   }
   }
   if(input(PIN_D0)&&x==1)
   {
   while(input(PIN_D0))
   {
   printf(lcd_putc, "\fAlterar temp.\nmin. para: %luC", tempmin);
   delay_ms(200);
   if(input(PIN_D1))
   {
   tempmin=tempmin+1;
   }
   if(input(PIN_D2))
   {
   tempmin=tempmin-1;
   }
      x=2;
   }
   }
   if(input(PIN_D0)&&x==2)
   {
   
   while(input(PIN_D0))
   {
   printf(lcd_putc, "\fAlterar alarme\nmax. para: %luC", almax);
   delay_ms(200);
   if(input(PIN_D1))
   {
   almax=almax+1;
   }
   if(input(PIN_D2))
   {
   almax=almax-1;
   }
   x=3;
   }
   } 
   if(input(PIN_D0)&&x==3)
   { 
   while(input(PIN_D0))
   {
   printf(lcd_putc, "\fAlterar alarme\nmin. para: %luC", almin);
   delay_ms(200);
   if(input(PIN_D1))
   {
   almin=almin+1;
   }
   if(input(PIN_D2))
   {
   almin=almin-1;
   }
   x=0;
   }
   }
   }
}

Esse é o programa completo.
Eu não tenho o esquema elétrico, mas tenho proteus.
É bem simples...
Ali onde tem um potenciometro no pino A0 é onde vai o sensor...

Eu achei que seria erro no meu programa, mas é o único jeito que sei fazer conversão.
A, eu só sei programar em C.

Abraço!

Offline Blackmore

  • CNCMASTER
  • ******
  • Posts: 1568
  • Sexo: Masculino
  • Profissão: Projetista Mecânico/Automação
Re: Problemas no conversor ad...(ele fica saltando 40mV)
« Resposta #3 Online: 08 de Fevereiro de 2009, 11:33 »
tu não definiu no cabeçalho a resolução do conversor AD ...

#deviceadc=XX;

adicione e veja o que acontece.  :)

abrax!

Smarley

  • Visitante
Re: Problemas no conversor ad...(ele fica saltando 40mV)
« Resposta #4 Online: 08 de Fevereiro de 2009, 11:35 »
Eu esqueci de postar o cabeçalho:

Citar
#include <16F877A.h>
#device adc=10

#FUSES NOWDT                    //No Watch Dog Timer
#FUSES XT                       //Crystal osc <= 4mhz
#FUSES PUT                      //Power Up Timer
#FUSES NOPROTECT                //Code not protected from reading
#FUSES NODEBUG                  //No Debug mode for ICD
#FUSES NOBROWNOUT               //No brownout reset
#FUSES NOLVP                    //No low voltage prgming, B3(PIC16) or B5(PIC18) used for I/O
#FUSES NOCPD                    //No EE protection
#FUSES WRT_50%                  //Lower half of Program Memory is Write Protected

#use delay(clock=4000000)
#use rs232(baud=9600,parity=N,xmit=PIN_C6,rcv=PIN_C7,bits=8)

Ta la emcima ele...

Offline Blackmore

  • CNCMASTER
  • ******
  • Posts: 1568
  • Sexo: Masculino
  • Profissão: Projetista Mecânico/Automação
Re: Problemas no conversor ad...(ele fica saltando 40mV)
« Resposta #5 Online: 08 de Fevereiro de 2009, 11:39 »
bom .. na primeira vez que tu colocasse o programa no cabeçalho não consta esta linha ... e outro detalhe .. nao coloca o ; que eu coloquei ali ... e tenta iniciar com resolução de 8 bits primeiro ...

abrax!

Offline Blackmore

  • CNCMASTER
  • ******
  • Posts: 1568
  • Sexo: Masculino
  • Profissão: Projetista Mecânico/Automação
Re: Problemas no conversor ad...(ele fica saltando 40mV)
« Resposta #6 Online: 08 de Fevereiro de 2009, 11:47 »
bom carinha .. tem algo errado ainda no primeiro firm completo .. os fuses tb não estou vendo-os ... outra coisa .. tu fez os cálculos de tempo mínimos de aquisição de sinal?Seguiu passo a passo as explicações do livro do Fábio?

qqer coisa .. tamos aí ..

abrax!

Smarley

  • Visitante
Re: Problemas no conversor ad...(ele fica saltando 40mV)
« Resposta #7 Online: 08 de Fevereiro de 2009, 11:53 »
Passei para 8bit, mas tive que multiplicar o valor por 4 para mostrar certo no LCD.
sobre o tempo de aquisição eu vou colocar um delay de 50ms antes do valor=read_adc(); e depois...
Vamos ver o que acontece.

Abraço!

Smarley

  • Visitante
Re: Problemas no conversor ad...(ele fica saltando 40mV)
« Resposta #8 Online: 08 de Fevereiro de 2009, 11:55 »
Vou substrair 1 também, para o valor ficar certo.
Porque ele está marcando sempre 1 para mais do que entra...

Smarley

  • Visitante
Re: Problemas no conversor ad...(ele fica saltando 40mV)
« Resposta #9 Online: 08 de Fevereiro de 2009, 11:55 »
*subtrair

Smarley

  • Visitante
Re: Problemas no conversor ad...(ele fica saltando 40mV)
« Resposta #10 Online: 08 de Fevereiro de 2009, 12:52 »
Deu o mesmo problema...
Agora eu vou fazer assim, vou voltar com o programa anterior e multiplicar a tensão de saída do LM35 por 3 eu acho...
Assim eu diminuo o erro de leitura.
Ai depois é só eu dividir este valor por 3.
Vamos ver se da certo...

Smarley

  • Visitante
Re: Problemas no conversor ad...(ele fica saltando 40mV)
« Resposta #11 Online: 08 de Fevereiro de 2009, 13:05 »
Aqui está o esquema que eu vou fazer...
Eu não tenho uma fonte simétrica +12V, -12V para usar.
Então vou tentar fazer assim, usando o terra como alimentação negativa para o TL072.
Não sei se vai funcionar...

Abraço!

Offline Alebe

  • CNCMASTER
  • ******
  • Posts: 3688
  • Sexo: Masculino
  • Cidade - UF: São Paulo - SP
Re: Problemas no conversor ad...(ele fica saltando 40mV)
« Resposta #12 Online: 08 de Fevereiro de 2009, 13:24 »

Eu não tenho uma fonte simétrica +12V, -12V para usar.

Use uma fonte de pc

Smarley

  • Visitante
Re: Problemas no conversor ad...(ele fica saltando 40mV)
« Resposta #13 Online: 08 de Fevereiro de 2009, 13:26 »
Certo!
Porque sem a alimentação negativa ele não funciona...
Acabei de comprovar o que ja suspeitava.
Aquele meu esquema para amplificar ali está correto?

Smarley

  • Visitante
Re: Problemas no conversor ad...(ele fica saltando 40mV)
« Resposta #14 Online: 08 de Fevereiro de 2009, 15:16 »
Consegui fazer funcionar melhor...
Multipliquei a saída por 3 para depois dividir no programa...
Assim ele só da um erro de vez enquando de 1 grau.
Este termometro vai ser usado até 150graus então eu não posso multiplicar por mais do que 3 vezes para não passar do 5V na entrada do PIC.
Eu vou fazer um para usar em casa, e vou multiplicar a saída 9 ou 10 vezes porque não vai passar de 50 graus...

vlw pela ajuda!
Abraço!

 

/** * */