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

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

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

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
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

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 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

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.

Bem mais fácil fazer nele.

Falou

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
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

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
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

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

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

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

×