Ir ao conteúdo

Conversor adc


cesarlg

Posts recomendados

Postado

ola pessoal, estou no começo da caminhada em pic (ccs). bom consegui realizar uma leitura da entrada adc,

while(true) {

output_high(pin_c0);

delay_ms(1000);

set_adc_channel(0);

delay_us(10);

v=read_adc();

v=v*0.00488;

printf("%f \n \r ",v);

}

mas agora gostaria de dar outro passo, seria assim: na entrada terei uma faixa de 500mv a 4500mv. e na saida respectivamente 0 a 1500. ou seja a cada 2.6mv terei um acrescimo de 1 na saida.

bom intuitivamente ativei A0 e A1 para analogico range de VrefL e VrefH, escala de 1 -1023 com tempo de 2-6ms. mas é só kkk

gostaria de tb que me indicassem um pic barato para essa funcáo e tb um kit p fazer a gravaçao

Postado

ola. ja tive uma evoluçao, mas nao tive precisao, gostaria de uma luz.. esta aqui a programaçao:

#include "C:\Users\Cesar\Desktop\pic\voltimetro aguivone.h"

float v;

void main()

{

setup_adc_ports(AN0_AN1_VREF_VREF);

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

// TODO: USER CODE!!

while(true)

{

output_high(pin_b1);

delay_ms(1000);

set_adc_channel(0);

delay_us(10);

v=read_adc();

v=v*1.66; // ver tabela: neste valor consigo padronizar o minimo, mas o maximo ficou fora... usando 1,466275659824047 acerto o maximo mas o minimo altera

printf("%f \n \r " v);

}

}

esse pic é o mais barato pra executar essa funcao?

aguardo

Postado

Cara, esse PIC é bem comum, ele e o 16F876A você acha em qualquer esquina, tem o 16F886A que é mais barato que o 876A porém já é mais difícil de encontrar, se você for usar um só vai com o 877 mesmo, caso for para colocar em algum produto e você venderá isso em série, ai recomendo estudar o PIC mesmo.

Sobre o gravador, se você for gravar bem pouco mesmo faça um, pesquise por JDM programer e o software para gravação WINPIC, é muito simples fazer, caso você for trabalhar bastante com PIC já corre para o PICKIT3 ou o MIKROPROG.

Postado

cesarlg, não entendi muito bem essa tabela que você postou:

attachment.php?attachmentid=88928&d=1343063929

Esse sinal de 500mV até 4500mV chega até o PIC.... e os outros valores? Explique melhor essa parte.

você disse que ela se chama leitura saída.....

Não entendi essa parte.

Falou

Postado

obrigado galera... nem sabia q existia gravador estão simples assim.. só gostaria de saber que gama de pic consegue gravar? 16f877a?

matheus. preciso converter tensão vinda de um sensor(que varia de 0.5v - 4.5V) em pressao (varia de 0 -1500bar) para depois jogar em Lcd (que inclusive nao consegui realizar). essa tabela é um resumo e desculpe pelas espressoes de iniciante.`

testei no proteus e funcionou.. agora preciso ajuda sobre o lcd que segui alguns tutoriais e nao aprendi... se nao fosse pedir muito. gostaria q incrementassem esse lcd p mim.

espero q consigam abrir meus arquivos

http://www.4shared.com/rar/rIV8R8YY/volt.html

Postado

Ahhh ta. Agora você explicou melhor.

Qual o sensor de pressão que você usa? Provavelmente o mesmo possui um datasheet onde mostra a equação de saída dele.

Estou no trabalho, depois vejo seus arquivos. Mas pode utilizar algo do tipo:

#include <16F877A.h>

#FUSES NOWDT //No Watch Dog Timer
#FUSES XT //Crystal osc <= 4mhz
#FUSES PUT //Power Up Timer
#FUSES NOPROTECT //Code not protected from reading
#FUSES BROWNOUT //Reset when brownout detected
#FUSES NOLVP //No low voltage prgming, B3(PIC16) or B5(PIC18) used for I/O
#FUSES NOCPD //No EE protectionE

#use delay(clock=4000000)

#include <lcd.c>

void main()
{
lcd_init();

While (TRUE)
{
printf(lcd_putc,"\fTeste LCD");
delay_ms (1000);
printf(lcd_putc,"\f\n16F877A");
delay_ms (1000);

}
}

Falou

Postado

o data do sensor nao tenho, mas a tabela completa dele sim, e os valores estão bem proximos, diferença de - 1% aceitavel.

sobre lcd segui 2 videos de como configurar.. um deles com #include<lcd.c> e outro com #include<lcd_flex.c>, mas nada funciona... talves algo pratico me faria entender melhor

Postado

uso o microC e la tem um comando muito simples para escrever numeros em displays lcd é

inttostr, floattostr, shorttostr.....

depende do tipo da variavel que esta usando... creio que deva ter no ccs então aconshelho usar para escrever os numeros no display...

no micro funciona do seguinte modo

cria-se a variavel texto, e converte-se a variavel que quiser, então joga o valor dela no display EX:



int leitura_adc;
char txt[7];

.......

inttostr(leitura_adc, txt);
lcd_out(1, 1, txt);

agora é so adptar

Postado

mandei a pasta inteira pois nao sei qual é o q precisas.

http://www.4shared.com/rar/CtCRqv67/lcd_sensor.html

estou aberto a criticas.. nao consegui fazer no lcd. a linha de cima alternar animaçao enquanto na linha de baixo ficar fixo p visualizaçao do valor.

depois de feito, eu jogo o .hex num programa tipo o winpic800 ?

sobre o gravador jdm. vi algumas variaveis usando pic 40 pinos. mas qual usar?

Postado

Me desculpe a demora.

Bom, encontrei alguns erros tanto na programação quanto no circuito/simulação.

Veja como você montou o circuito no proteus:

circuito_embolado.png

Quando fui testar não estava funcionando. Nem perdi tempo tentando encontrar o erro nesse monte de fio embolado. Desenhei de novo:

circuito_normal.png

Veja essa imagem abaixo:

erro_velocidade.png

Está configurado como 48Mhz, mas lá no seu código, você havia indicado que o PIC está em 20Mhz..... Essa parte foi corrigida.

Seu código marcado com os erros.

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

#FUSES NOWDT //No Watch Dog Timer
[COLOR="Red"][B]#FUSES XT //Crystal osc <= 4mhz[/B][/COLOR]
#FUSES PUT //Power Up Timer
#FUSES NOPROTECT //Code not protected from reading
#FUSES NODEBUG //No Debug mode for ICD
#FUSES BROWNOUT //Reset when brownout detected
#FUSES NOLVP //No low voltage prgming, B3(PIC16) or B5(PIC18) used for I/O
#FUSES NOCPD //No EE protection

#use delay(clock=20000000)

#include <lcd.c>


float v;

void main()
{

lcd_init();
setup_adc_ports(AN0_AN1_VREF_VREF); //Canal 0 analógico
[COLOR="Red"][B]setup_adc(ADC_CLOCK_INTERNAL); //Fuente de reloj RC [/B][/COLOR]


while (TRUE)
{
output_high(pin_b3);


[COLOR="Red"][B]set_adc_channel(0); //Habilitación canal 0
delay_us(1);[/B][/COLOR]
v=read_adc();
v=(v*1.466)+0.7;

printf(lcd_putc,"\f Pressao BAR \n\ %2.2f", v); // 2.4 2antes da virgula e 4depois.
delay_ms(200);
}
}

Agora o código com as correções e comentários:

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

#FUSES NOWDT
[COLOR="YellowGreen"][B]#FUSES HS //Comentário: você está usando o PIC a 20Mhz,
//então o fuse correto seria HS. Veja o datasheet.[/B][/COLOR]
#FUSES PUT
#FUSES NOPROTECT
#FUSES NODEBUG
#FUSES BROWNOUT
#FUSES NOLVP
#FUSES NOCPD

#use delay(clock=20000000)

[COLOR="YellowGreen"][B]#define use_portb_lcd TRUE //Comentário: De acordo com o seu circuito, você
//está ligando o LCD no portB do PIC. O driver
//LCD.C por padrão é usando no portD. Por isso
//precisa usar essa linha.[/B][/COLOR]
#include <lcd.c>

float v;

void main()
{

lcd_init();
setup_adc_ports(AN0_AN1_VREF_VREF);
[COLOR="YellowGreen"][B]setup_adc(ADC_CLOCK_DIV_64); //Como o PIC está a 20Mhz, o canal ADC
//não pode correr com CLOCK_INTERNAL.
//Veja no datasheet o por que.[/B][/COLOR]
[COLOR="YellowGreen"][B]set_adc_channel(0); //Como você está lendo somente 1 canal ADC,
//essa linha pode ficar fora do while(true).[/B][/COLOR]
[COLOR="YellowGreen"][B]delay_us(20); //O tempo correto é 20uS e não 1uS.[/B][/COLOR]

while (TRUE)
{

v=read_adc();
v=(v*1.466)+0.7;

printf(lcd_putc,"\f Pressao BAR \n\ %2.2f", v); // 2.4 2antes da virgula e 4depois.
delay_ms(200);
}
}

De resto, me parece correto.

De onde você tirou a fórmula v=(v*1.466)+0.7?

Falou

Postado

matheus, muito , muito obrigado. ja percebi q falta muito a aprender.

bom talves o arquivo do proteus que lhe mandei seja o errado kkkk.

aqui estava funcionando. mesmo com todos os erros, por isso lhe pergunto: no proteus funcionou, aquele arquivo nem rodaria na pratica?

setup_adc(ADC_CLOCK_DIV_64); //Como o PIC está a 20Mhz, o canal ADC

//não pode correr com CLOCK_INTERNAL.

//Veja no datasheet o por que.

sobre o oscilador, ele deve ser externo? no proteus nao esta adicionado, existe forma de usar interno?

sobre o calculo raciocinei da seguinte forma.. entrada 0-5v.. no ic converte de 1-1024.

então peguei 1500 no lcd (q equivale a 4.5volts )e dividi por 1024 = 1,46484375

como nao ficou preciso na faixa menor tirei os quebrados e somei 0.7.. testei com varios valores da tabela e ficou proximo ao esperado.

aos poucos vou evoluindo, mas sinto dificuldade em aprender por apostilas datasheet e etc.

vou fazer um gravador jdm com winpic800. para ir sentido kkkk

obrigado

Postado

Sim, oscilado externo pois esse modelo de PIC não possui oscilador interno.

O proteus engole muita coisa. Veja que nem alimentar o PIC é preciso.

Veja que o proteus de ajuda. Mas não confie d+.

Falou

  • 4 semanas depois...
Postado

bom venho agradecer pois ja consegui por em pratica td o q aprendi, mas falta muito mais!!

gravei o pic16f877a com o gravador estilo jdm.

alem do circuito mostrado anteriormente acrescentei a alimentaçao, capacitores, tanto elet. (1000uF), poliester de 0.1uF, e os que acompanham o cristal de 4mhz (2 x 22pf)

para funcionar acrescentei um resistor de 22k para o VDD no pino MLCR.

mas me deparei com um problema: fiz um divisor com um potenciometro p simular a entrada adc 0v-5v. mas no visor nao altera o valor, ele no max mostra o valor min e max, ou seja 0.7 a 1500.7

algo esta errado ai kkkkkk. tentei alterar a entrada p AN1, mas ainda persiste..

ideias?

edit.:

alterei o valor do MLCR de 22k para 10K. agora esta trabalhando bem.

aproveitando gostaria de ajuda na leitura do datashet, onde observo a corente maxima permitida para cada saida do microcontrolador?

é possivel acionar o black ligh do lcd direto na porta do pic?

e qual se tiver, qual a vida util de um microcontrolador por ficar gravando e apagando sua memoria?

obrigado

  • Coordenador
Postado

Caso o autor do tópico necessite, o mesmo será reaberto, para isso deverá entrar em contato com a moderação solicitando o desbloqueio.

Arquivado

Este tópico foi arquivado e está fechado para novas respostas.

Sobre o Clube do Hardware

No ar desde 1996, o Clube do Hardware é uma das maiores, mais antigas e mais respeitadas comunidades 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

×
×
  • Criar novo...

Ebook grátis: Aprenda a ler resistores e capacitores!

EBOOK GRÁTIS!

CLIQUE AQUI E BAIXE AGORA MESMO!