Página 1 de 2
Conversão A/D

Enviado:
03 Jan 2007 21:14
por Pask
Amigos, me ajudem nessa: em vários livros sobre o PIC existe um capítulo dedicado ao conversor analógico-digital do PIC 16F877. Existe também um código fonte que mostra como converter uma tensão analógica na entrada de um dos canais analógicos do PIC em digital para exibir a respectiva tensão num display LCD.
O que eu gostaria de fazer é o seguinte: após esta conversão, mostrar o valor do nível DC convertido para digital em três displays de leds comuns. Por exemplo: uma tensão DC de 2,5V convertida para digital apareceria nos displays como 2.50.
Noto que nas literaturas disponíveis, os autores não entram nessa parte.
Alguém saberia me dizer como fazer esse tipo de indicação após uma conversão A/D ? Obrigado.

Enviado:
03 Jan 2007 21:25
por Red Neck Guy
Acho que nos livros do Fábio tem sim...
Olha meu amigo, isso aí que tu queres fazer é muito simples, não é nada mais do que uma regra de 3.

Enviado:
03 Jan 2007 21:59
por microeletronica
Ok.
tomemos por partida o Dsheet
http://ww1.microchip.com/downloads/en/devicedoc/30487c.pdf
Veja bem - tomemos por referencia que voce esta alimentando o PIC com 5.00V em VDD. Digamos tambem que vc utiliza apenas um canal - o AN0, pino 17, pra ler a tensao analogica desejada. Digamos tambem que vc utilize como refencia positiva o 5.00 V. e como referencia negativa pro AD o GND. Isso vc faz quando seta os valores desejados no registrador ADCON1, pagina 117. O AD do AN?0 eh de 10 bits, o que indica que 0 é 0.00V e 1027 é 5.00. x é (5.00 * x) / 1027 - conforme Aquino disse ;)
O datasheet do PIC16F88 eh cheio de dicas de como fazer a conversao - pagina 118 em diante. O lyout de Hardware eh importante, muito importante, quando falamos em conversao AD, com fiozinhos ate funciona - ms os 2 bits la do final ficam oscilando :P
Dai qualquer duvida com relacao a isso, mande perguntas que poderemos ajudar ;)
OK?
Pask

Enviado:
04 Jan 2007 07:39
por Pask
Respondendo aos dois amigos que enviaram suas ajudas:
Eu sei que devo fazer uma regra de 3 simples para ajustar o valor, pois se o conversor é de 10 bits, ele pode gerar 1024 níveis diferentes de códigos binários de tal forma que 0 volt corresponde a 0 e 5 volts corresponde a 1023, supondo que eu esteja usando o Vcc de 5V e o Vdd GND como referências para o A/D. Tudo isto eu sei e sei também como configurar o registrador ADCON1 para fazer funcionar o A/D.
A minha dúvida está no seguinte: após o processo de conversão ter sido completado e após os cálculos matemáticos terem sido feitos para o ajuste do valor, como mostrar esse valor em display de leds?
Explicando melhor: quando eu estou usando display de leds para outras aplicações que não sejam o conversor A/D, eu utilizo a técnica da multiplexação para acionar os displays alternadamente em alta velocidade e utilizo uma tabela de valores binários de 8 bits para fazer acender os segmentos corretos de cada display e gerar os números de 0 a 9. A minha pergunta é: usando o conversor A/D, como eu poderia acessar essa mesma tabela para mostrar os valores convertidos nos displays, ou será que existe outra forma de indicar os valores que não seja uma tabela propriamente dita?
Mais um exemplo: o valor de tensão analógica 2,33 volts, após convertido para digital, corresponde a um valor binário de 0111011100. Como eu utilizo este valor de 10bits para fazer aparecer nos 3 displays o valor 2.33 ?
Aguardo uma ajuda.
Pask.

Enviado:
04 Jan 2007 08:07
por fabim
Bom dia Pask.
Olha... Vc mesmo ja respondeu sua pergunta.rsrs
Para eu te dar uma dica, para calculo rapido etc.. apenas informe qual linguagem esta usando.
Abraços.
Fabim

Enviado:
04 Jan 2007 08:14
por microeletronica
Pask, se vc tem o valor binario de 10 bits, o mais dificil ja foi feito.
Pegue o valor e faca a regra de tres.
(5.00 * x) * 100 / 1027
Isso vai dar um valor entre 0 e 500. Dai vc teri que desmembrar pra imprimir. ou itoa(valor, string_auxiliar) e imprimir o valor das posicoes da string no display, utilizando sua tabela como anteriormente.
Respondendo entao - nao tem como pegar o valor direto em binario e coloca-lo no display. A menos que queira fazer uma tabela, que nao acho viavel.

Enviado:
04 Jan 2007 12:14
por microeletronica
Voce pode declarar um array de chars como a seguir:
char teste[4];
Este array tem 5 posicoes, a quinta posicao contendo um 0.
Possui entao 4 posicoes utilizaveis.
Depois que vc fizer a conta que havia dito ( (5.00 * x) * 100 / 1027 ), vc vai ter um valor entre 0 e 500.
Dai vc teria que dar um jeito deste numero ir pra dentro da string, ou seja, pode fazer um itoa,
Abaixo esta uma breve explicacao do que eh o itoa
#include <stdlib.h>
char *itoa(int value, char *string, int radix);
DESCRIPTION
The itoa() function constructs a string representation of an integer.
PARAMETERS
value
Is the integer to be converted to string representation.
string
Points to the buffer that is to hold resulting string. The resulting string may be as long as seventeen bytes.
radix
Is the base of the number; must be in the range 2 - 36.
Dai seu valor numerico, estaria no array de chars teste:
itoa(valor, teste);
Com isso, vc poderia pegar os valores que estarim em teste[0] (na posicao 0), na posicao 1, e na posicao 2 de teste[4] e colocar no display.
O que estaria la entao, nas posicoes do char, seria ASCII.
para informacoes de como é ASCII,
http://www.asciitable.com

Enviado:
04 Jan 2007 18:50
por MOR_AL
Olá Pask.
Vê se é isso que você está em dúvida. É a resposta de um outro tópico que repasso aqui. Nele o final da conversão cabe em um byte, mas é fácil alterar para mais de um byte. Não uso tabelas. Tente fazer 5,00 V corresponderen a 1000 unidades, aí cada unidade valerá 5 mV.
Eu faço assim:
1 – Em vez de 5,0 V corresponderem a 255 unidades, 5 V correspondem a 250 unidades. Com isso, cada unidade vale 20 mV e tudo fica fácil.
2 – Exemplo. V(a ser convertido) = 3,64 V. O que corresponde a 3,64 x 250 / 5 = 182 unidades ao final da conversão (182 x 20 mV = 3,64 V).
3 – Este 182 encontra-se no registro Result. Agora vou fazer a conversão binário-BCD.
4 – Retiro quantas centenas puder de Result sem torná-lo negativo. Guardo o número de centenas retiradas no registro Cen, no caso Cen = 1.
5 – Retiro quantas dezenas puder de Result sem torná-lo negativo. Guardo o número de dezenas retiradas no registro Dez, no caso Dez = 8.
6 – Transfiro o que restou no registro Result para o registro Unid, no caso Unid = 2. Agora vou multiplicar por 2 e ajustar o resultado.
7 – Multiplico o valor dos registros Cen, Dez e Unid por 2 (RLF Cen, RLF Dez e RLF Unid ). Agora tenho Cen = 2, Dez = 16 e Unid = 4. Note que 16 dezenas valem 160 = 100 + 60. Agora vou fazer o ajuste para que cada algarismo seja menor que 10.
8 – Subtraio de 10 o registro Unid (W = Unid – 10). Se W for negativo não faço nada, o registro Unid já está com seu valor final (W = 4 – 10 = - 6). Se W for positivo, faço Unid = W e somo uma unidade ao registro Dez.
No caso permanece: Unid = 4 e Dez = 16
9 – Subtraio de 10 o registro Dez (W = Dez – 10). Se W for negativo não faço nada, o registro Dez já está com seu valor final (W = 16 – 10 = + 6). Se W for positivo, faço Dez = W e somo uma unidade ao registro Cen.
No caso fica: Dez = 6 e Cen = 3
10 – Obtenho Cen = 3, Dez = 6 e Unid = 4.
11 – Faço a conversão BCD para 7 segmentos e envio aos mostradores das centenas, dezenas e unidades. Lembrando que o ponto decimal vai ficar localizado entre o algarismo das centenas e das dezenas. 3,64 V
Parece trabalhoso, mas até que é simples. Verifique para confirmar. Talvez posso ter cometido algum engano.
Espero ter ajudado.
MOR_AL
Conversão A/D

Enviado:
04 Jan 2007 19:40
por Pask
Caro MOR_AL, a sua técnica parece ser interessante, mas eu ainda não a entendi muito bem. Agora, raciocine comigo: você fala em usar 5V com uma word de 250 que corresponderia a uma conversão de no máximo, 8 bits. O conversor do PIC é de 10 bits e, portanto, gera uma word máxima de 1023 para 5V! Então, observe o exemplo:
V_ANALOG = [(5 * VALOR_CONV.) / 1023]
Onde:
V_ANALOG -> Tensão analógica na entrada do canal do A/D do PIC;
VALOR_CONV -> Valor digital correspondente após a conversão.
Alterando a equação acima para que ela fique em função do valor digital convertido, ela fica:
VALOR_CONV = [(V_ANALOG / 5) * 1023]
EXEMPLO 1: uma tensão analógica de 1,44V geraria o seguinte valor decimal: 294,62 que poderíamos arredondar para 295. Este valor na forma binária de 10 bits é 0100100111.
EXEMPLO 2: suponha agora uma tensão analógica de 3,68V como no seu exemplo. Após a conversão de 10 bits, pela equação acima, seria gerado o valor decimal 752,93 que arredondariamos para 753. Este valor na forma binária de 10 bits é 1011110001.
Utilizando a sua técnica que parece ser interessante e funcional, como prosseguir deste ponto em diante para o correto acionamento dos displays das centanas, dezenas e unidades?

Enviado:
05 Jan 2007 10:23
por MOR_AL
Pask.
1 - Coloque um divisor resistivo na entrada do conversor (1000 / 1023). Verifique se será necessário um operacional para baixar a impedância da sua fonte a ser convertida. 5,00V da tensão a ser convertida corresponderão a 4,887...V na entrada do conversor. Após a conversão, você terá 1000 unidades. Logo, a relação será 5,00V/1000 = 5 mV por unidade. Na sua equação, ao invés de 1023 será 1000.
2 - Considerando 10 bits, o valor máximo da sua conversão agora poderá alcançar até 1000. Você terá que ter os registros Mil, Cen, Dez e Unid. No meu exemplo, 3,64 V corresponderão a 3,64 x 1000 / 5 = 728 (Result = 728). Repare que 728 / 2 = 364.
Regra de três “5 V está para 1000 unidades assim como 3,64 V está para X unidades”. Então X = 3,64 x 1000 / 5 = 3,64 x 200 = 728. Como o 728 é dado após a conversão e os 3,64 V é o valor ainda desconhecido, deve-se rearmar a equação: 3,64 = 728 / 200 = 7,28 / 2. Agora a matemática se reduz a divisão por 2, ou RRF no PIC.
3 - Tente retirar 1000 dos 728. Vai dar negativo. Então Mil = 0.
4 - Tente retirar 100, 200, ... ,700 dos 728. Então Cen = 7 e Result = 28.
5 - Retire 20 de Result. Então Dez = 2 e Result = 8.
6 - Faça Unid = Result. Unid = 8.
7 - Agora você tem Mil = 0, Cen = 7, Dez = 2 e Unid = 8.
8 - Se Mil fosse igual a 1, os outros registros valeriam zero, já que o valor máximo de Result é 1000. Neste caso bastaria dividir por dois, chegando a 500 (V? = 5,00 V).
9 - Divida Cen por 2 (RRF Cen). Se C = 1 (corresponde a uma unidade de centena), então tem que somar 10 (dezenas) em Dez. Agora você tem Mil = 0, Cen = 3, Dez = 12 e Unid = 8.
10 - Divida agora as dezenas por 2 (RRF Dez). Neste caso Dez = 6 e C = 0 (não vai nada para Unid). Você tem Mil = 0, Cen = 3, Dez = 6 e Unid = 8.
11 - Divida Unid por 2 (RRF Unid). Mil = 0, Cen = 3, Dez = 6 e Unid = 4. Fim.
12 - Repare que o algarismo seguinte ou vale zero (Unid par) ou vale 5 (Unid impar).
13 - Sua fonte de referência deverá ter a precisão equivalente a 10 bits, ou estar compreendida entre 4,998 e 5,002 (5 mV de variação).
14 - Dependendo da faixa de temperatura ambiente de trabalho do seu circuito, esta variação total não deverá ser excedida dentro da gama de temperatura ambiente.
15 - O divisor resistivo na entrada do pino do PIC, deverá ter um potenciômetro de ajuste com valor bem menor que os resistores fixos, pois a variação térmica dos potenciômetros é diferente dos resistores e seu divisor pode variar mais que 5 mV com a temperatura.
16 - O layout da placa de circuito impresso deverá ser muito bem confeccionado. Qualquer ruído com mais de 5 mV na entrada vai alterar sua medida.
17 - Não existe mágica. O conversor do PIC é apenas um elo da corrente. Todos os elos deverão ser considerados para que os 10 bits sejam reais.
Acho que é isso aí.
Para continuar você deve fazer a conversão BCD - 7 segmentos (para display com leds deste tipo). Isso você encontra fácil.
Boa sorte.
MOR_AL

Enviado:
05 Jan 2007 16:36
por lpagano
Se você a apostila do curso de C para PIC18F do Vidal também tem um exemplo de como se fazer isso.
Valeu!
Solução.

Enviado:
05 Jan 2007 21:20
por Pask
Caro amigos, obrigado pela boa vontade e ajuda de todos. No livro PIC - TÉCNICAS AVANÇADAS DE PROGRAMAÇÃO, do Nicolás C. Lavínia, existe um capítulo totalmente dedicado à conversão A/D do PIC 16F877 o qual já li várias vezes. No código em questão, é feita a conversão para um display LCD em ASCII.
Analisando calmamente o código, descobri uma forma de aproveitar várias de suas partes e acrescentar algumas instruções pessoais para "ajeitá-lo" para mostrar o resultado em displays de leds como eu gostaria. Vou tentar e acho que vai funcionar.
Um forte abraço a todos e muito obrigado pelas ajudas. Estou por aí sempre que precisarem de algum auxílio.
Pask.
a/d com pic16f628a

Enviado:
06 Jan 2007 00:18
por jorge
Ola pessoal.
alguem sabe me dizer com posso converter um sinal analogico p/digital usando o pic16f628a ?
Obrigado.
Conversão com 16F628

Enviado:
06 Jan 2007 08:50
por Pask
Caro Jorge, infelizmente os PIC's 16F628/628A e 628/04 não possuem internamente o periférico dedicado exclusivamente à conversão A/D como outros MCU's possuem. O registrador dedicado a esta função nos PIC's chama-se (ADCON 1 e/ou ADCON 2). Sendo assim, você tem que dar outras providências para poder utilizá-lo nesta função. Tente o seguinte:
a) Utilize a chamada Conversão A/D Delta-Sigma, que é um processo de conversão que faz uso do módulo comparador interno deste PIC (CMCON). Atraves dos seus dois comparadores internos você pode desenvolver a aplicação. Depois te mando mais detalhes sobre isto.
b) Utilize um conversor A/D externo ao PIC em questão. Talvez um CAD do tipo ADCXXX. Dê uma procurada na Internet que vc achará alguma coisa. Neste caso, você tem uma vantagem: a parte da conversão não precisará ser programada porque o conversor externo já virá pronto para uso. Escolha um modelo que possa enviar ao PIC o sinal convertido serialmente. Então, programe o módulo de comunicação serial interno do PIC para se comunicar com o A/D externo e processar seus sinais. Neste caso, você deverá trabalhar com a USART (Universal Synchronous Asynchronous Receiver Transmitter) também conhecida como SCI (Serial Communications Interface) interna do PIC. Para tanto, é imprescindível que você saiba exatamente como trabalhar com este periférico. Espero que vc possua um bom livro para lhe orientar!
Complicado? Talvez. Mas não tem outra maneira de resolver. Aguardo sua resposta.
Pask.
Entrada Analógica

Enviado:
07 Jan 2007 19:49
por Pask
Caros amigos, mais uma pergunta: qual é o menor e o maior nível de tensão DC que eu posso aplicar na entrada do canal analógico do PIC para conversão digital? O que acontece é o seguinte: quero fazer um termômetro digital com base no sensor centígrado LM35 que tem uma saída de 10mV/°C com ótima precisão. Como eu poderia, por exemplo, aplicar a saída desse sensor na entrada do canal analógico do PIC? Obrigado.
Pask.