Ir ao conteúdo
  • Comunicados

    • Gabriel Torres

      Seja um moderador do Clube do Hardware!   12-02-2016

      Prezados membros do Clube do Hardware, Está aberto o processo de seleção de novos moderadores para diversos setores ou áreas do Clube do Hardware. Os requisitos são:   Pelo menos 500 posts e um ano de cadastro; Boa frequência de participação; Ser respeitoso, cordial e educado com os demais membros; Ter bom nível de português; Ter razoável conhecimento da área em que pretende atuar; Saber trabalhar em equipe (com os moderadores, coordenadores e administradores).   Os interessados deverão enviar uma mensagem privada para o usuário @Equipe Clube do Hardware com o título "Candidato a moderador". A mensagem deverá conter respostas às perguntas abaixo:   Qual o seu nome completo? Qual sua data de nascimento? Qual sua formação/profissão? Já atuou como moderador em algo outro fórum, se sim, qual? De forma sucinta, explique o porquê de querer ser moderador do fórum e conte-nos um pouco sobre você.   OBS: Não se trata de função remunerada. Todos que fazem parte do staff são voluntários.
Entre para seguir isso  
Vinicius Heltai

ADC - Conversor Analogico PIC18F1220

Recommended Posts

Estou com um problema que a dias no meu projeto de conversor ADC de um PIC18F1220, sendo testado no PROTEUS e no Hardware ja fabricado (prototipo), Estou utilizando o C18 como compilador. Segue descrição do projeto:

Objetivo:

Montar um hardware onde existem 3 sensores de temperatura (LM35) nos quais apresentam uma resolução de 10mV/ºC. Estes sensores alimentam um AmpOp que tem sua saida de 1,3 a 5V alimentando 3 portas do ADC do PIC18F1220, AN2, AN3 e AN6. De acordo com a programação a diferença e soma dessas temperaturas tem na suas saidas de IO (LEDs) sinalizações correspondentes.

As saidas em questão esta funcionando perfeitamente. Coloquei uma sequencia com acionamento das saidas, um delay e funcion correto. O problema esta sendo quando eu insiro a leitura dos ADC ai o programa não sinaliza mais nada.

Em um laço While(1), infinito, desejo fazer um scan o tempo todo deixando essa sequencia:

(Entrada de dados)

1 – Lê entrada ADC – AN2

2 – Converta essa leitura em uma temperatura e armazene a temperatura em uma variavel (TBAT1)

3 – Lê entrada ADC – AN3

4 – Converta essa leitura em uma temperatura e armazene a temperatura em uma variavel (TBAT2)

5 – Lê entrada ADC – AN6

6 – Converta essa leitura em uma temperatura e armazene a temperatura em uma variavel (TREF)

(Processe informação)

7 – Com as variaveis carregadas, faça diversas contas;

(Saida de Dados)

8 – Com os dados obtidos controle 6 LEDS nas portas restantes.

Alguém pode me ajudar no que esta sendo feito errado? Me basiei no livro MICROCONTROLADOR PIC18 – APRENDA E PROGRAME EM LINGUAGEM C – Alberto Noboru Miyadaira – Editora Erica – Pag 278, 279 e 280.

Segue a rotina de programação:



//***************************************************************************************
// DIRETIVAS E CONFIGURAÇÕES DE PROGRMAÇÃO
//***************************************************************************************
#include <p18f1220.h>
#include <adc.h>
#include <stdio.h>
#include <stdlib.h>
#include <delays.h>

#define Fosc 4000000
#pragma config OSC = HS
#pragma config WDT=OFF
#pragma config PWRT=OFF
#pragma config LVP=OFF
#pragma config MCLRE=OFF
#pragma config DEBUG=OFF
#pragma config IESO=OFF
#pragma config CP0=OFF


// Definição do nome das estruturas
//***************************************************************************************
#define ONOFF1 PORTBbits.RB0
#define ONOFF2 PORTBbits.RB1
#define LED1 PORTBbits.RB2
#define LED2 PORTBbits.RB3
#define LED3 PORTBbits.RB5
#define LED4 PORTBbits.RB6

//Portas RB0, RB1 em aberto, sem utilização


// Variaveis Globais
//***************************************************************************************
float VALOR_CONVERSOR;

//***************************************************************************************
// PROTOTIPAGEM
//***************************************************************************************
float CONVERTE_TENSAO (float VALOR_CONVERSOR);
float CONVERTE_TEMPERATURA (float VALOR_TENS);
unsigned int FILTRO_CANAL(void);

//***************************************************************************************
// SUB-PROGRAMAS - BLOCOS SECUNDARIOS
//***************************************************************************************

// Converte o valor devolvido pelo conversor em um valor correspondente à tensão [mV]
//***************************************************************************************
float CONVERTE_TENSAO (float VALOR_CONVERSOR)
{
return (VALOR_CONVERSOR*3300)/1023;
}


// Converte o valor de tensão em um valor correspondente à temperatura [°C]
//***************************************************************************************
float CONVERTE_TEMPERATURA (float VALOR_TENS)
{
return VALOR_TENS/10;
}


// Filtro em Software
//***************************************************************************************
unsigned int FILTRO_CANAL(void)
{
unsigned int CONT_FILTRO;
unsigned long VALOR_CANAL=0;

for ( CONT_FILTRO=0; CONT_FILTRO<256; CONT_FILTRO++)
{
ConvertADC();
while (BusyADC());
VALOR_CANAL+=ReadADC();

}
return (VALOR_CANAL>>8);
}


//***************************************************************************************
// PROGRAMA PRINCIPAL
//***************************************************************************************

void main (void)
{

// Declarações de Variaveis Locais
//***************************************************************************************
unsigned char BAT; // Controle do PIN ONOFF da Bateria 1
unsigned int TAMB; // Controle da Temperatura Ambiente
unsigned int TBAT1; // Controle da Temperatura da Bateria 1
unsigned int TBAT2; // Controle da Temperatura da Bateria 2
unsigned int VBAT1; // Controle da Tensão da Bateria 1
unsigned int VBAT2; // Controle da Tensão da Bateria 2
unsigned int DTEMP1; // Diferença de temperautra Tamb e Tbat
unsigned int DTEMP2; // Diferença de temperautra Tamb e Tbat
float BATMAX; // Cte de Tensão Max na bateria
float BATMED; // Cte de Tensão Med na bateria
unsigned char BATMIN; // Cte de Tensão Min na bateria
unsigned int VALOR; // Cte de calculo
unsigned int VALOR_TENSAO; // Cte de calculo
unsigned int VALOR_TEMPERATURA; // Cte de Calculo

// Leitura e Ajustes das Variaveis
//***************************************************************************************
BATMAX= 4; //Tensão Maxima que a Bateria pode ter: 12cel*1,2V=14,4V
BATMED= 3; //Tensão Média que a Bateria pode ter: 12cel*0,6V= 7,2V
BATMIN= 1; //Tensão Minima que a Bateria pode ter: 12cel*0,4V= 4,8V
DTEMP1= 10; //Diferença em °C que a bateria pode apresentar da Ambiente
DTEMP2= 10; //Diferença em °C que a bateria pode apresentar da Ambiente

// Configuração das PORTS A e B
//***************************************************************************************
TRISA=0b0001111; //Configura sentido da PORT A - 0-Saida e 1-Entrada (76543210)
TRISB=0b0010000; //Configura sentido da PORT B - 0-Saida e 1-Entrada (76543210)

ADCON0=0b00000001;
ADCON1=0b00110000;
ADCON2=0b10101010;

// Rotina principal do programa - Checando constantemente (looping Infinito)
//***************************************************************************************
while(1) //Looping infinito
{
// Leitura e Ajustes das Variaveis
//***************************************************************************************

// Sensor de Temperatura Ambiente - TA[B]M[/B]B
//***************************************************************************************
ADCON0bits.CHS2 = 1; // seleciona o canal AN6
ADCON0bits.CHS1 = 1;
ADCON0bits.CHS0 = 0;
VALOR=FILTRO_CANAL();
VALOR_TENSAO=CONVERTE_TENSAO(VALOR);
VALOR_TEMPERATURA=CONVERTE_TEMPERATURA(VALOR_TENSAO);
TAMB=VALOR_TEMPERATURA;

// Sensor de Temperatura Bateria - TBAT 1
//***************************************************************************************
ADCON0bits.CHS2 = 0; // seleciona o canal AN2
ADCON0bits.CHS1 = 1;
ADCON0bits.CHS0 = 0;
VALOR=FILTRO_CANAL();
VALOR_TENSAO=CONVERTE_TENSAO(VALOR);
VALOR_TEMPERATURA=CONVERTE_TEMPERATURA(VALOR_TENSAO);
TBAT1=VALOR_TEMPERATURA;

// Sensor de Temperatura Bateria - TBAT 2
//***************************************************************************************
ADCON0bits.CHS2 = 0; // seleciona o canal AN3
ADCON0bits.CHS1 = 1;
ADCON0bits.CHS0 = 1;
VALOR=FILTRO_CANAL();
VALOR_TENSAO=CONVERTE_TENSAO(VALOR);
VALOR_TEMPERATURA=CONVERTE_TEMPERATURA(VALOR_TENSAO);
TBAT2=VALOR_TEMPERATURA;

// Sensor de Tensão da Bateria - VBAT 1
//***************************************************************************************
ADCON0bits.CHS2 = 0; // seleciona o canal AN0
ACON0bits.CHS1 = 0;
ADCON0bits.CHS0 = 0;
VALOR=FILTRO_CANAL();
VALOR_TENSAO=CONVERTE_TENSAO(VALOR);
VALOR_TEMPERATURA=CONVERTE_TEMPERATURA(VALOR_TENSAO);
VBAT1=VALOR_TEMPERATURA/105;

// Sensor de Tensão da Bateria - VBAT 2
//***************************************************************************************
ADCON0bits.CHS2 = 0; // seleciona o canal AN1
ADCON0bits.CHS1 = 0;
ADCON0bits.CHS0 = 1;
VALOR=FILTRO_CANAL();
VALOR_TENSAO=CONVERTE_TENSAO(VALOR);
VALOR_TEMPERATURA=CONVERTE_TEMPERATURA(VALOR_TENSAO);
VBAT2=VALOR_TEMPERATURA/105;

// Processamento das Variaveis
//***************************************************************************************
DTEMP1=TBAT1-TA[B]M[/B]B;
DTEMP2=TBAT2-TA[B]M[/B]B;


// Tomada de decisões - Analise das Condições de Temperatura
//***************************************************************************************
if (DTEMP1<10)
{
if (VBAT1==BATMAX)
{ONOFF1=0; LED1=1; LED2=1;}
else if (VBAT1>=BATMED)
{ONOFF1=0; LED1=1; LED2=1;}
else if (VBAT1>=BATMIN)
{ONOFF1=0; LED1=1; LED2=1;}
else if (VBAT1<BATMIN)
{ONOFF1=0; LED1=1; LED2=1;}
}
else
{
ONOFF1=0; LED1=0; LED2=0;
}

if (DTEMP2<10)
{
if (VBAT2==BATMAX)
{ONOFF2=0; LED3=1; LED4=1;}
else if (VBAT1>=BATMED)
{ONOFF2=0; LED3=1; LED4=1;}
else if (VBAT1>=BATMIN)
{ONOFF2=0; LED3=1; LED4=1;}
else if (VBAT1<BATMIN)
{ONOFF2=0; LED3=1; LED4=1;}
}
else
{
ONOFF2=0; LED3=0; LED4=0;
}

} //Final do laço do Laço Infinito
} //Final do laço do programa principal Main
//Iniciação do programa

E o circuito:

circuito.jpg

Se vocês poderem me dar uma Luz...

Obrigado

Vinicius - vheltai@gmail.com

Editado por Bcpetronzio
Inserir Tags CODE e spoiler

Compartilhar este post


Link para o post
Compartilhar em outros sites
Isadora Ferraz    1.587

não sei se tem algo a ver mas voce parece ter uma variável chamada "também" (parece mais ser tamb). geralmente os compiladores não se dão bem com acentos. com o mplab, voce pode também verificar onde trava seu programa. rode-o passo a passo e confira se seu hw (registros internos) estão sendo setados de forma correta.

sucessos

Compartilhar este post


Link para o post
Compartilhar em outros sites
Vinicius Heltai    0
  • Autor do tópico
  • Esse Também esta errado aqui no Forum, é TAMB.

    Mas fora isso não estou achando o erro....

    Se alguem poder ajudar

    Editado por Bcpetronzio
    Enganar o corretor automatico do forum

    Compartilhar este post


    Link para o post
    Compartilhar em outros sites
    Sink00    1

    O seu erro seria na compilação ou na hora de o programa rodar? Você poderá postar o seu projeto no Proteus para eu poder testar aqui?

    Apenas alguns comentarios. Em algumas linhas a variavel VALOR_TENSAO está com um espaço entre o A e o O (VALOR_TENSA O). Além disso mude a variavel também, para tambem. Eu compilei aqui e simulei e ele percorre o codigo todo sem problemas. Pelo menos alguns sensores deveriam ascender (se você configurou os pinos corretamente, coisa que eu não verifiquei ainda).

    Abs

    Compartilhar este post


    Link para o post
    Compartilhar em outros sites
    Vinicius Heltai    0
  • Autor do tópico
  • O seu erro seria na compilação ou na hora de o programa rodar? Você poderá postar o seu projeto no Proteus para eu poder testar aqui?

    Apenas alguns comentarios. Em algumas linhas a variavel VALOR_TENSAO está com um espaço entre o A e o O (VALOR_TENSA O). Além disso mude a variavel também, para tambem. Eu compilei aqui e simulei e ele percorre o codigo todo sem problemas. Pelo menos alguns sensores deveriam ascender (se você configurou os pinos corretamente, coisa que eu não verifiquei ainda).

    Abs

    Qual e-mail posso te enviar o arquivo do MPLAB pra você compilar direto e ver?

    vheltai@gmail.com

    Compartilhar este post


    Link para o post
    Compartilhar em outros sites
    Isadora Ferraz    1.587

    ahhh. é o corretor ortográfico xereta.

    seu dilema parece simples. defina melhor "não sinaliza mais nada" e novamente use o recurso de debug do mplab. seu fonte tem margem para otimização de código (mas por enquanto não tem nada a ver... ou tem.)

    aguarde + alguém.

    Editado por josedasilva0
    não deu certo usar o tag [code]

    Compartilhar este post


    Link para o post
    Compartilhar em outros sites
    Sink00    1

    sink00 AT gmail DOT com

    E por favor, defina melhor o seu problema. Detalhadamento o processo para reproduzi-lo.

    Vinicius eu simulei o seu circuito aqui e ele parece estar funcionando como deveria. Na hora de configurar o AD você ligou o mesmo antes de realizar as configurações, mas imagino que isso não deva ser a fonte do problema. Eu realmente não entendi a diferença entre a simulação e o real. Como assim ele perde? Se perde no que? De que linhas você esta falando? Um detalhe que eu li no seu codigo é que na subtração TBAT1 e TAMB, você deve tomar cuidado pois você pode vir a ter um valor negativo nesta subtração, porém DTEMP1 e DTEMP2 são variaveis unsigned.... ou seja elas não aceitam valores negativos. Isto pode acontecer quando a bateria não estiver carregando, ou estiver no começo da carga e os sensores tiverem alguma diferença de medição.

    Aguardo mais dados.

    Editado por Bcpetronzio
    Unir Post seguidos em menos de 24 horas, use a opção editar

    Compartilhar este post


    Link para o post
    Compartilhar em outros sites
    Mulder_Fox    213

    Você escreveu que os LM35 alimentavam um ampop, mas, no esquema que postou, eles estão ligados direto no PIC.

    Compartilhar este post


    Link para o post
    Compartilhar em outros sites

    Ta faltando coisa!!

    onde esta a linha que inicia a conversão?

    pelo menos não vi em nenhum trecho do código, para que uma conversão seja efetuada você deve setar o bit GO/DONE localizado no reg ADCON0, e monitorar via polling(testando esse bit ate que ele caia a 0 novamente).

    Outra, você esta esquecendo que o PIC é burro (ainda mais no C18 rs), você tem rotinas para pegar a conversão retornada pelo A/D, porém você nem esta lendo o ad, para ler o resultado de uma conversão você deve acessar o registrador ADRESH:ADRESL onde fica o valor da conversão.

    Veja um exemplo simples de conversão:



    int variavel;

    void main (void)
    {
    .
    .
    .
    while (1)
    {
    ADCON0bits.GO = 1; //inicia conversão
    while (ADCONbits.GO); //aguarda o bit voltar a zero
    variavel = ADRESH ; //recebe valor da conversao
    }
    }

    mais duvidas estamos ai!

    Compartilhar este post


    Link para o post
    Compartilhar em outros sites
    Por isso uso o CCS.

    Isso é relativo, o que ele oferece de facildades, te toma de otimização de código,

    resultado? mais memória ocupada por código simples.

    E outra, é impossivel acessar os registradores do PIC diretamente, pois as funções built-in dele é fechada, o que ja nao acontece no C18 nem no Hitech.

    E terceiro e não menos importante, o C18 possui todo suporte e documentação da propria microchip, e suporta C-ANSI o CCS não, logo portabilidade 0...

    acho que em termos de facilidade só estamos vendo um ponto que são funções built-in, mas e o resto da IDE?

    Pensem nisso.

    E quanto ao amigo Vinicius fico no aguardo de seu retorno.

    Compartilhar este post


    Link para o post
    Compartilhar em outros sites
    Sink00    1
    Ta faltando coisa!!

    onde esta a linha que inicia a conversão?

    pelo menos não vi em nenhum trecho do código, para que uma conversão seja efetuada você deve setar o bit GO/DONE localizado no reg ADCON0, e monitorar via polling(testando esse bit ate que ele caia a 0 novamente).

    Outra, você esta esquecendo que o PIC é burro (ainda mais no C18 rs), você tem rotinas para pegar a conversão retornada pelo A/D, porém você nem esta lendo o ad, para ler o resultado de uma conversão você deve acessar o registrador ADRESH:ADRESL onde fica o valor da conversão.

    Felipe, neste caso não está não. Na função:

    unsigned int FILTRO_CANAL(void)
    {
    unsigned int CONT_FILTRO;
    unsigned long VALOR_CANAL=0;

    for ( CONT_FILTRO=0; CONT_FILTRO<256; CONT_FILTRO++)
    {
    ConvertADC();
    while (BusyADC());
    VALOR_CANAL+=ReadADC();

    }
    return (VALOR_CANAL>>8);
    }

    Isto que você falou é exatamente o que as funçoes ConvertADC(), BusyADC() e ReadADC fazem. Elas não são nada além de uma abstração criada para ler os registradores.

    Mas realmente eu não sei qual a vantegm de um CCS em relação a um C18 Matheus. Ele é pago, não é Ansi-C, e beeeem fechado. Quanto ao acesso aos registradores, realmente não vejo problema. E caso você queira fazer o uso de funções, e elas não existissem, seria muito fácil recriar as funções ConvertADC, BusyADC e ReadADC (nada mais do que o Felipe ja falou). E para amantes do ISIS, um dos debuggers do MPLAB é utilizar o ISIS como simulador. Deste modo você pode criar uma simulação no ISIS e seguir linha a linha no seu codigo em C o programa sendo rodado no ISIS, alem de ter acesso a todos os registradores, variaveis, e poder alterar registradores durante a simulação. Eu não sei se o CCS tem esta possibilidade. O unico GRANDE problema que eu vejo no MPLAB é a falta de estrutura para programação em C. É horrivel escrever um codigo dentro do IDE....

    Abs

    Compartilhar este post


    Link para o post
    Compartilhar em outros sites

    Pois é Sink, não tinha visto esse ponto aqui:

    #include <adc.h>

    ai, o proprio C18 também possui suas "funções built-in" e o melhor, recriaveis.

    Nesse caso nos resta aguardar o retorno do autor sobre o problema encontrado no seu circuito.

    Abs.

    Compartilhar este post


    Link para o post
    Compartilhar em outros sites
    Vinicius Heltai    0
  • Autor do tópico
  • Ola pessoal.

    Primeiramente muito obrigado pela colaboração, discução do problema, todas as opiniões, soluções estão ajudando e sendo de enorme importancia.

    mexi ontem o dia todo aqui com o programa, ficou da seguinte forma:

    //Iniciação do programa

    //***************************************************************************************

    // DIRETIVAS E CONFIGURAÇÕES DE PROGRMAÇÃO

    //***************************************************************************************

    #include <p18f1220.h>

    #include <adc.h>

    #include <stdio.h>

    #include <stdlib.h>

    #include <delays.h>

    #define Fosc 4000000

    #pragma config OSC = HS

    #pragma config WDT=OFF

    #pragma config PWRT=OFF

    #pragma config LVP=OFF

    #pragma config MCLRE=OFF

    #pragma config DEBUG=ON

    #pragma config IESO=OFF

    #pragma config CP0=OFF

    // Definição do nome das estruturas

    //***************************************************************************************

    #define ONOFF1 PORTBbits.RB0

    #define ONOFF2 PORTBbits.RB1

    #define LED1 PORTBbits.RB2

    #define LED2 PORTBbits.RB3

    #define LED3 PORTBbits.RB5

    #define LED4 PORTBbits.RB6

    //Portas RB0, RB1 em aberto, sem utilização

    // Variaveis Globais

    //***************************************************************************************

    float VALOR_CONVERSOR;

    //***************************************************************************************

    // PROTOTIPAGEM

    //***************************************************************************************

    float CONVERTE_TENSAO (unsigned long VALOR_CONVERSOR);

    float CONVERTE_TEMPERATURA (float VALOR_TENS);

    unsigned int FILTRO_CANAL();

    //***************************************************************************************

    // SUB-PROGRAMAS - BLOCOS SECUNDARIOS

    //***************************************************************************************

    // Converte o valor devolvido pelo conversor em um valor correspondente à tensão [mV]

    //***************************************************************************************

    float CONVERTE_TENSAO (unsigned long VALOR_CONVERSOR)

    {

    return ((float)(VALOR_CONVERSOR*5000)/1023);

    }

    // Converte o valor de tensão em um valor correspondente à temperatura [°C]

    //***************************************************************************************

    float CONVERTE_TEMPERATURA (float VALOR_TENS)

    {

    return (VALOR_TENS/55);

    }

    // Filtro em Software

    //***************************************************************************************

    unsigned int FILTRO_CANAL()

    {

    unsigned int CONT_FILTRO;

    unsigned long VALOR_CANAL=0;

    for ( CONT_FILTRO=0; CONT_FILTRO<256; CONT_FILTRO++)

    {

    ConvertADC();

    while (BusyADC());

    VALOR_CANAL+=ReadADC();

    return (VALOR_CANAL>>8);

    }

    }

    //***************************************************************************************

    // PROGRAMA PRINCIPAL

    //***************************************************************************************

    void main (void)

    {

    // Declarações de Variaveis Locais

    //***************************************************************************************

    float TAMB; // Controle da Temperatura Ambiente

    float TBAT1; // Controle da Temperatura da Bateria 1

    float TBAT2; // Controle da Temperatura da Bateria 2

    float DTEMP1; // Diferença de temperautra Tamb e Tbat

    float DTEMP2; // Diferença de temperautra Tamb e Tbat

    unsigned int BATMAX; // Cte de Tensão Max na bateria

    unsigned int BATMED; // Cte de Tensão Med na bateria

    unsigned int BATMIN; // Cte de Tensão Min na bateria

    unsigned int VALOR; // Cte de calculo

    float VALOR_TENSAO; // Cte de calculo

    float VALOR_TEMPERATURA; // Cte de Calculo

    // Leitura e Ajustes das Variaveis

    //***************************************************************************************

    BATMAX= 4; //Tensão Maxima que a Bateria pode ter: 12cel*1,2V=14,4V

    BATMED= 3; //Tensão Média que a Bateria pode ter: 12cel*0,6V= 7,2V

    BATMIN= 1; //Tensão Minima que a Bateria pode ter: 12cel*0,4V= 4,8V

    DTEMP1= 10; //Diferença em °C que a bateria pode apresentar da Ambiente

    DTEMP2= 10; //Diferença em °C que a bateria pode apresentar da Ambiente

    // Configuração das PORTS A e B

    //***************************************************************************************

    TRISA=0b0001111; //Configura sentido da PORT A - 0-Saida e 1-Entrada (76543210)

    TRISB=0b0010000; //Configura sentido da PORT B - 0-Saida e 1-Entrada (76543210)

    OpenADC(ADC_FOSC_32 // Fosc = 4MHz. Tad = 16/4 = 4us

    &ADC_RIGHT_JUST // Resultado justificado para a direita

    &ADC_2_TAD, // configuração do tempo de aquisicao automatico (2*Tad = 8us)

    ADC_CH3 // Seleciona o canal 0 (AD0)

    &ADC_INT_OFF // Interrupcao desabilitada

    &ADC_VREFPLUS_VDD // Vref+ = Vcc

    &ADC_VREFMINUS_VSS, // Vref- = Vss

    ADC_7ANA); // AN0 ao AN6 => analogico

    // Rotina principal do programa - Checando constantemente (looping Infinito)

    //***************************************************************************************

    while(1) //Looping infinito

    {

    // Leitura e Ajustes das Variaveis

    //***************************************************************************************

    // Sensor de Temperatura Ambiente - TAMB

    //***************************************************************************************

    ADCON0bits.CHS2 = 1; // seleciona o canal AN6

    ADCON0bits.CHS1 = 1;

    ADCON0bits.CHS0 = 0;

    Delay1KTCYx(2);

    VALOR=FILTRO_CANAL();

    VALOR_TENSAO=CONVERTE_TENSAO(VALOR);

    VALOR_TEMPERATURA=CONVERTE_TEMPERATURA(VALOR_TENSAO);

    TAMB=VALOR_TEMPERATURA;

    // Sensor de Temperatura Bateria - TBAT 1

    //***************************************************************************************

    ADCON0bits.CHS2 = 0; // seleciona o canal AN2

    ADCON0bits.CHS1 = 1;

    ADCON0bits.CHS0 = 0;

    Delay1KTCYx(2);

    VALOR=FILTRO_CANAL();

    VALOR_TENSAO=CONVERTE_TENSAO(VALOR);

    VALOR_TEMPERATURA=CONVERTE_TEMPERATURA(VALOR_TENSAO);

    TBAT1=VALOR_TEMPERATURA;

    // Sensor de Temperatura Bateria - TBAT 2

    //***************************************************************************************

    ADCON0bits.CHS2 = 0; // seleciona o canal AN6

    ADCON0bits.CHS1 = 1;

    ADCON0bits.CHS0 = 1;

    Delay1KTCYx(2);

    VALOR=FILTRO_CANAL();

    VALOR_TENSAO=CONVERTE_TENSAO(VALOR);

    VALOR_TEMPERATURA=CONVERTE_TEMPERATURA(VALOR_TENSAO);

    TBAT2=VALOR_TEMPERATURA;

    // Processamento das Variaveis

    //***************************************************************************************

    DTEMP1=TBAT1-TAMB;

    DTEMP2=TBAT2-TAMB;

    // Tomada de decisões - Analise das Condições de Temperatura

    //***************************************************************************************

    if (DTEMP1>10)

    {

    LED1=1; LED2=0;

    Delay1KTCYx(1);

    }

    else

    {

    LED1=0; LED2=1;

    Delay1KTCYx(1);

    }

    if (DTEMP2>10)

    {

    LED3=1; LED4=0;

    Delay1KTCYx(1);

    }

    else

    {

    LED3=0; LED4=1;

    Delay1KTCYx(1);

    }

    } //Final do laço do Laço Infinito

    } //Final do laço do programa principal Main

    porém ainda continua a não funcionar. Liguei com o cabo no Debuger - MPLAB SIM e esta acontecendo a seguinte situação, aparece a mensagem de erro:

    ADC-W0008: No stimulus file attached to ADRESL for A/D.

    Os registradores não carregam com o ADC e abre uma janela em especial:

    problema.jpg

    Esta complicado ajeitar isso aqui, mas terei que dar um jeito. As portas estão sendo alimentadas com 1,36V em um pino ADC, 1,47V em outro pino. Sabendo que o ganho dos AmpOp é de 5,5 equivale a 0,247V e 0,267V vindo dos sensores. Correspondendo a 24,7ºC e 26,7ºC de temperatura.

    De acordo com essas medidas de temperatura, preciso converter essa tenão e carrega-las em TAMB e TBAT1.. o TBAT2 é igual porém em outro sensor que ainda não inseri.

    Na decisão quanod a temperatura for mais que 10°C ele desliga o LED1 e aciona o LED 2, isso por enquanto, pois será chaves logicas (relés).

    Alguem tem alguma sugestão?

    Abraços

    Vinicius Heltai

    Compartilhar este post


    Link para o post
    Compartilhar em outros sites
    porém ainda continua a não funcionar. Liguei com o cabo no Debuger - MPLAB SIM e esta acontecendo a

    Perai, você disse ligou o cabo, então você tem um debbuger estilo PICKIT ou ICD?

    Se for isso tem coisa errada pois o MPSIM não simula real, apenas no MPLAB, e só adiantando simular ADC no MPSIM é um tormento, você deve fazer um script txt com o valor que tem que ser carregado e abrir com o advanced stimullus...ou seja bem chato não?

    So preciso saber de que debuger estamos falando para que eu possa te ajudar melhor ;D

    ABs.

    Compartilhar este post


    Link para o post
    Compartilhar em outros sites
    Vinicius Heltai    0
  • Autor do tópico
  • Perai, você disse ligou o cabo, então você tem um debbuger estilo PICKIT ou ICD?

    Se for isso tem coisa errada pois o MPSIM não simula real, apenas no MPLAB, e só adiantando simular ADC no MPSIM é um tormento, você deve fazer um script txt com o valor que tem que ser carregado e abrir com o advanced stimullus...ou seja bem chato não?

    So preciso saber de que debuger estamos falando para que eu possa te ajudar melhor ;D

    ABs.

    Eu estou usando uma placa ICD2 da LabTools ligada ao Hardware que estou melhorando.

    E estou debugando em MPLAB SIM.

    Compartilhar este post


    Link para o post
    Compartilhar em outros sites
    Sink00    1

    Exatamente, o MPLAB SIM é apenas para ambiente de simulação, ou seja não existe circuito fisico. O MPLAB que simula o funcionamento do PIC. Como neste caso não existe um circuito real, voce precisa falar para o microcontrolador o que esta entrando na porta AD e isto é feito criando um stimulos, no menu Debugger->Stimulus->New Workbook. Nele voce escolhe um arquivo .txt com os valors em Hexadecimal que o AD ira ler (ja o valor digital). Como eu imagino que você tem um circuito fisico, você tera que ter um gravador com ICSP com suport a debug pelo MPLAB. Os mais comuns são o PicKit2, PicKit3, ICD2 e ICD3. Se você não tiver nenhum deles, nada feito, você tera que utilizar as boas e velhas tecnicas antigas de debug... Osciloscopio, colocar leds para acionarem quando o alguma parte d codigo for executada... e assim por diante. Se você puder explicar melhor e detalhadamente qual o circuito extato que você tem no momento .. . o completo com AMPOPs e tudo mais.. e detalhar o problema. Detalhar eu digo exatamente o que você esta vendo.

    ABs

    Compartilhar este post


    Link para o post
    Compartilhar em outros sites
    Isadora Ferraz    1.587

    posta o .dsn e .hex pra alguém simular pra ti. talvez probl. no teu proteus. volto a comentar que o desafio da entrada de dados do projeto é relativamente simples e com o hitech-c e otimizando o fonte pode ser feito com poquísismas linhas. (se 1 dia sobrar 1 tempo... quem sabe...)

    sucessos

    Compartilhar este post


    Link para o post
    Compartilhar em outros sites
    Vinicius Heltai    0
  • Autor do tópico
  • Mais um sucesso... Consegui parcialmente.

    Liguei um potenciometro de 10K entre a VSS e VDD (5 a 0V) e saida para as entradas ADC do PIC. Isso me garantia que a tensão poderia ser a limite 5V e GND, podendo simular as entradas.

    Alterei todo o script e coloquei para ler diretamente a porta e armazenar na portas, como esta na programação:

    //Iniciação do programa

    //***************************************************************************************

    // DIRETIVAS E CONFIGURAÇÕES DE PROGRMAÇÃO

    //***************************************************************************************

    #include <p18f1220.h>

    #include <adc.h>

    #include <stdio.h>

    #include <stdlib.h>

    #include <delays.h>

    #define Fosc 4000000

    #pragma config OSC = HS

    #pragma config WDT=OFF

    #pragma config PWRT=OFF

    #pragma config LVP=OFF

    #pragma config MCLRE=OFF

    #pragma config DEBUG=ON

    #pragma config IESO=OFF

    #pragma config CP0=OFF

    // Definição do nome das estruturas

    //***************************************************************************************

    #define ONOFF1 PORTBbits.RB0

    #define ONOFF2 PORTBbits.RB1

    #define LED1 PORTBbits.RB2

    #define LED2 PORTBbits.RB3

    #define LED3 PORTBbits.RB5

    #define LED4 PORTBbits.RB6

    //Portas RB0, RB1 em aberto, sem utilização

    //***************************************************************************************

    // PROGRAMA PRINCIPAL

    //***************************************************************************************

    void main (void)

    {

    // Declarações de Variaveis Locais

    //***************************************************************************************

    float TAMB; // Controle da Temperatura Ambiente

    float TBAT1; // Controle da Temperatura da Bateria 1

    float TBAT2; // Controle da Temperatura da Bateria 2

    float DTEMP1; // Diferença de temperautra Tamb e Tbat

    float DTEMP2; // Diferença de temperautra Tamb e Tbat

    unsigned int BATMAX; // Cte de Tensão Max na bateria

    unsigned int BATMED; // Cte de Tensão Med na bateria

    unsigned int BATMIN; // Cte de Tensão Min na bateria

    unsigned int VALOR_CONVERSOR=0;

    // Leitura e Ajustes das Variaveis

    //***************************************************************************************

    BATMAX= 4; //Tensão Maxima que a Bateria pode ter: 12cel*1,2V=14,4V

    BATMED= 3; //Tensão Média que a Bateria pode ter: 12cel*0,6V= 7,2V

    BATMIN= 1; //Tensão Minima que a Bateria pode ter: 12cel*0,4V= 4,8V

    // Configuração das PORTS A e B

    //***************************************************************************************

    TRISA=0b0001111; //Configura sentido da PORT A - 0-Saida e 1-Entrada (76543210)

    TRISB=0b0010000; //Configura sentido da PORT B - 0-Saida e 1-Entrada (76543210)

    OpenADC(ADC_FOSC_32 // Fosc = 4MHz. Tad = 16/4 = 4us

    &ADC_RIGHT_JUST // Resultado justificado para a direita

    &ADC_2_TAD, // configuração do tempo de aquisicao automatico (2*Tad = 8us)

    ADC_CH3 // Seleciona o canal 0 (AD0)

    &ADC_INT_OFF // Interrupcao desabilitada

    &ADC_VREFPLUS_VDD // Vref+ = Vcc

    &ADC_VREFMINUS_VSS, // Vref- = Vss

    ADC_7ANA); // AN0 ao AN6 => analogico

    // Rotina principal do programa - Checando constantemente (looping Infinito)

    //***************************************************************************************

    while(1) //Looping infinito

    {

    // Leitura e Ajustes das Variaveis

    //***************************************************************************************

    // Sensor de Temperatura Ambiente - TAMB

    //***************************************************************************************

    VALOR_CONVERSOR=0;

    TAMB=0;

    ADCON0bits.CHS2 = 1; // seleciona o canal AN6

    ADCON0bits.CHS1 = 1;

    ADCON0bits.CHS0 = 0;

    Delay1KTCYx(2);

    ConvertADC();

    while(BusyADC());

    VALOR_CONVERSOR=ReadADC();

    TAMB=(VALOR_CONVERSOR*5)/1023;

    // Sensor de Temperatura Bateria - TBAT 1

    //***************************************************************************************

    VALOR_CONVERSOR=0;

    TBAT1=0;

    ADCON0bits.CHS2 = 0; // seleciona o canal AN2

    ADCON0bits.CHS1 = 1;

    ADCON0bits.CHS0 = 0;

    Delay1KTCYx(2);

    ConvertADC();

    while(BusyADC());

    VALOR_CONVERSOR=ReadADC();

    TBAT1=(VALOR_CONVERSOR*5)/1023;

    // Sensor de Temperatura Bateria - TBAT 2

    //***************************************************************************************

    VALOR_CONVERSOR=0;

    TBAT2=0;

    ADCON0bits.CHS2 = 0; // seleciona o canal AN3

    ADCON0bits.CHS1 = 1;

    ADCON0bits.CHS0 = 1;

    Delay1KTCYx(2);

    ConvertADC();

    while(BusyADC());

    VALOR_CONVERSOR=ReadADC();

    TBAT2=(VALOR_CONVERSOR*5)/1023;

    // Processamento das Variaveis

    //***************************************************************************************

    DTEMP1=0;

    DTEMP2=0;

    DTEMP1=TBAT1-TAMB;

    DTEMP2=TBAT2-TAMB;

    // Tomada de decisões - Analise das Condições de Temperatura

    //***************************************************************************************

    if (TBAT1>TAMB)

    {

    LED1=1; LED2=0;

    Delay1KTCYx(1);

    }

    else

    {

    LED1=0; LED2=1;

    Delay1KTCYx(1);

    }

    if (TBAT2>TAMB)

    {

    LED3=1; LED4=0;

    Delay1KTCYx(1);

    }

    else

    {

    LED3=0; LED4=1;

    Delay1KTCYx(1);

    }

    } //Final do laço do Laço Infinito

    } //Final do laço do programa principal Main

    porém, estou com um problema. Na parte do programa:

    ConvertADC();

    while(BusyADC());

    VALOR_CONVERSOR=ReadADC();

    TBAT2=(VALOR_CONVERSOR*5)/1023;

    Essa multiplicação por 5 e apos isso divisão por 1023 (resolução) esta complicando, pois nos LEDS sinalizando eles alteram seu estado não quando estão maiores (TBAT1>TAMB) de imediato, apenas quando apresenta ~0,7V acima. Isso é: Medi com o multimetro na porta AN6 apresentava 2,23V foi mudar o estado quando tinha 2,95V na porta AN3. Uma diferença de ~0,7. Como o sensor LM35 é 10mV por cada grau ºC e o ampOp ganho 5,5. 0,7V representa 12,7ºC .

    Mas apesar de tudo ja foi um sucesso, falta apenas ajustar esse erro minimizando ao maximo. Alguma sugestão?

    Pelo que entendi as variaveis estão armazenando a tensão isso é, na temp ambi (25ºC) terei na variavel TAMB=1,37, preciso então pegar essa variavel e converter, divindo pelo ganho do ampop e multiplicanod por 100 que ficando 24,9 ?

    Obrigado a todos.

    Compartilhar este post


    Link para o post
    Compartilhar em outros sites

    Acho que seu problema é um só, velocidade de processamento,

    veja bem, estas a trabalhar com valores float ou seja valores de 32bits que possuem parte inteira e mantissa, processar calculos com essa coisa ai demora, mas não é so isso,

    repare que você le diferentes canais analógicos com uma frequencia FOSC/32 temos ai atraso da conversão e da troca entre canais, isso pode estar demorando a atualizar o programa e esse te dando a impressão de demoraa na atualização dos LEDS,

    para ver se é isso mesmo faça um teste, coloque uma tensão analógica que varie o estado dos LEDS em seguida largue o circuito parado por um tempo e veja se altera, em caso positivo, temos problema de velocidade, mas caso contrario terei de olhar o codigo melhor.

    Abs.

    Compartilhar este post


    Link para o post
    Compartilhar em outros sites

    Crie uma conta ou entre para comentar

    Você precisar ser um membro para fazer um comentário

    Entre para seguir isso  





    Sobre o Clube do Hardware

    No ar desde 1996, o Clube do Hardware é uma das maiores, mais antigas e mais respeitadas publicações sobre tecnologia do Brasil. Leia mais

    Direitos autorais

    Não permitimos a cópia ou reprodução do conteúdo do nosso site, fórum, newsletters e redes sociais, mesmo citando-se a fonte. Leia mais

    ×