Convesor A/D x Display

Software e Hardware para uC PIC

Moderadores: andre_luis, 51, guest2003, Renie

Convesor A/D x Display

Mensagempor Pask » 22 Jan 2008 12:55

Amigos quero usar o valor convertido pelo conversor A/D de 10 bits do PIC para indicar um valor de tensão em 3 displays de leds usando a expressão abaixo:

valor=read_adc();
x=(valor*5)/1023;

O problema é que, mesmo declarando x como variável do tipo float, a parte fracionária do número é ignorada e somente a sua parte inteira é considerada. Por exemplo: se eu converter o valor de tensão analógica 2,33V para digital (valor=477) e aplicar na expressão acima, o valor final de x será 2 e a parte 0,33 desaparece.
Eu preciso que o valor da conversão seja correto para poder aplicá-lo numa função que vai gerar os dígitos das centenas, dezenas e unidades para cada display.
Amigos, como resolver este problema de cálculo em C?
Pask
Word
 
Mensagens: 600
Registrado em: 22 Dez 2006 19:19

Mensagempor mselbach » 22 Jan 2008 12:59

Experimente:

x=(valor*5.0)/1023.0;
mselbach
 
Mensagens: 3
Registrado em: 22 Nov 2006 13:43

Mensagempor Pask » 22 Jan 2008 13:23

Por quê? Eu acho que dá na mesma...
Pask
Word
 
Mensagens: 600
Registrado em: 22 Dez 2006 19:19

Mensagempor xultz » 22 Jan 2008 13:48

Você acha, mas não dá. Eu já fiz declaração até do tipo (float)5 para o compilador fazr o que eu queria. Eu já vi type casting até para zero num código uma vez, e um amigo meu me explicou a razão daquilo...
98% das vezes estou certo, e não estou nem aí pros outros 3%.
Avatar do usuário
xultz
Dword
 
Mensagens: 3001
Registrado em: 13 Out 2006 18:41
Localização: Curitiba

Mensagempor alessandro » 22 Jan 2008 14:01

Olha, quando faço isso (já tive esse tipo de problema também) faço da seguinte forma:

(quando usava CCS, não sei se é seu caso, tive muitos problemas estranhos nas versões anteriores)
int32 valor;
x float;

valor = read_adc();
x = (valor*5000)/1023;
x = x/1000;

parece besta, mas no meu caso funciona bem.

Alessandro
Alessandro
Avatar do usuário
alessandro
Byte
 
Mensagens: 278
Registrado em: 12 Out 2006 19:32

Mensagempor Pask » 22 Jan 2008 15:43

Olá amigos. Parece que já encontrei a solução. É assim:

int32 x, valor;

valor=read_adc();
x=(valor*500)/1023;

O que estava dando errado é que eu estava declarando a variável "valor" com 16 bits de tamanho. O problema é que, quando você faz a multiplicação por 500, a maior parte dos resultados convertidos ultrapassava a 16 bits e isto estava causando um erro na matemática do compilador. Agora, com as variáveis x e valor declaradas com tamanhos de 32bits, o resultado da fórmula acima é um número XYZ, onde X é a centena; Y é a dezena e Z é a unidade. Por exemplo, se após o cálculo o número resultante for 695, isto, nos displays, será representado como o número 2.95 que corresponderá à uma tensão de 2,95V.
Obrigado e espero que este tópico também possa ser útil para mais alguém.
Pask
Word
 
Mensagens: 600
Registrado em: 22 Dez 2006 19:19

Mensagempor alessandro » 22 Jan 2008 15:46

É o que fiz no post anteriormente, só que estava usando 3 casas decimais, por isso multipliquei por 5000. No seu caso como usou 2 casas decimais, multiplicou por 500.


Alessandro
Alessandro
Avatar do usuário
alessandro
Byte
 
Mensagens: 278
Registrado em: 12 Out 2006 19:32

Mensagempor Pask » 23 Jan 2008 07:19

Valeu e obrigado a todos mais uma vez!
Pask
Word
 
Mensagens: 600
Registrado em: 22 Dez 2006 19:19

Mensagempor mselbach » 23 Jan 2008 15:32

Pask escreveu:Por quê? Eu acho que dá na mesma...


Pois é, não dá não :)

Tem o lance da precedência de tipos. Não sei exatamente como funciona nesse compilador que tu usas, mas é bem comum (na otimização de código) que o compilador ao realizar esse calculo faça da seguinte forma:

x=(valor*5)/1023;

Valor (float) X (int) = resultado (int)
Resultado (int) / 1023 (int) = x (float)

Veja que ali tu perdeu as decimais.

Se tu fizer float x float, o resultado será sempre float, mesma coisa com float / float, etc...
mselbach
 
Mensagens: 3
Registrado em: 22 Nov 2006 13:43

Mensagempor luisaoho » 24 Jan 2008 07:15

Bom Pesssoal,

Aproveitando o assunto sobre A/D, gostaria de saber se alguem tem uma rotina em assemble para um comversor A/D escrever num LCD. Estou tentando fazer um medidor de temperatura com LM335, e não consigo escrever os valores no display, os digitos aparecem somente 3 quadrados.
Desde já agradeço quem possa me ajudar, podem enviar também para meu e-mail oliveira@lnls.br.

grato.
Luis
luisaoho
Bit
 
Mensagens: 21
Registrado em: 13 Fev 2007 13:29

Mensagempor Sergio38br » 24 Jan 2008 07:43

qual pic e qual controlador tem o display

Sergio
Avatar do usuário
Sergio38br
Word
 
Mensagens: 759
Registrado em: 22 Nov 2007 13:39
Localização: São Paulo - SP

Mensagempor luisaoho » 24 Jan 2008 08:11

Sergio38br escreveu:qual pic e qual controlador tem o display

Sergio


Oi Sergio,

Obrigado por responder, estou usando o 16F877 e o LCD 16x2, se puder me ajudar.

grato,
Luis
luisaoho
Bit
 
Mensagens: 21
Registrado em: 13 Fev 2007 13:29

Mensagempor Sergio38br » 24 Jan 2008 08:21

qual modelo do display, o controlador depende do modelo, geralmente são clones do HD44780, mas nunca se sabe se o mesmo é este.


Sergio
Avatar do usuário
Sergio38br
Word
 
Mensagens: 759
Registrado em: 22 Nov 2007 13:39
Localização: São Paulo - SP

Mensagempor Sergio38br » 24 Jan 2008 08:44

Ói nóis aqui tra vez!!!!

de uma olhada neste link, da pagina do Igor


http://www.eletronica.etc.br/igor/lcd/index.html


ele usa o 877 e um display baseado no hd44780


G.A.

Sergio
Avatar do usuário
Sergio38br
Word
 
Mensagens: 759
Registrado em: 22 Nov 2007 13:39
Localização: São Paulo - SP

Mensagempor luisaoho » 24 Jan 2008 09:32

Sergio38br escreveu:qual modelo do display, o controlador depende do modelo, geralmente são clones do HD44780, mas nunca se sabe se o mesmo é este.


Sergio


Sergio,

O LCD é WC1602D2, o problema está não é escrever no LCD e sim fazer a rotina do A/D funcionar e atualizar o valor no LCD.

grato
Luis
luisaoho
Bit
 
Mensagens: 21
Registrado em: 13 Fev 2007 13:29

Próximo

Voltar para PIC

Quem está online

Usuários navegando neste fórum: Nenhum usuário registrado e 1 visitante

x