VARIÁVEL FLOAT

Software e Hardware para uC PIC

Moderadores: andre_luis, 51, guest2003, Renie

VARIÁVEL FLOAT

Mensagempor Pask » 07 Jun 2015 17:35

Amigos, no código abaixo, eu estou tendo problemas em mostrar uma tensão variando de 0 a 5V num display lcd porque quando o valor cai abaixo de 1V (por exemplo: 0,45V), o display mostra 4,5. Isto acontece porque a variável "volt" que é do tipo float apresenta o número em notação científica e faz (4,5x10^-1 = 0,45) entendem.
E não adianta tentar dividir o valor por 10, fazendo 0,045 porque então a variável faz o valor ser 4,5x10^-2 e o display continua mostrando 4,5 do mesmo jeito. Aliás, o problema ocorre para todos os valores numéricos entre 0 e 1. Entre 1e 5V não há erros.
Segue o fragmento do código para vocês verem e os comentários:

Código: Selecionar todos
volt=media*5/1023;           / / variável float volt recebe o resultado da conversão da variável média
floattostr(volt,result);     / / é feita a conversão de float para string, para apresentação no display lcd
lcd_out(1,1,"VOLTAGEM=");    / /imprime a palavra "voltagem" na primeira linha e primeira coluna do display
lcd_out(1,10,result);        / /apresenta a string "result" à frente com o valor incorreto entre 0 e 1V.
delay_ms(500);               / / aguarda 0,5s e repete a leitura do CAD.


Exemplo: Ao ler o valor 0,233 na variável float "volt", o valor é convertido para notação científica em 2,33e-001 e o display mostra 2.33 após a conversão do tipo float para string.

O compilador é o MikroC.

Aguardo uma ajuda.
Pask
Word
 
Mensagens: 600
Registrado em: 22 Dez 2006 19:19

Re: VARIÁVEL FLOAT

Mensagempor cfreund » 07 Jun 2015 18:24

não conheço a função floattostr. Mas se não tiver jeito de acertar, gambiarra nele:

Código: Selecionar todos
volt = media * 5 / 1023;
if (volt > 0 && volt < 1)
{
    volt *= 100;
    floattostr(volt, result);
    lcd_out(1, 1, "TENSAO=0,");
}
else
{
    floattostr(volt, result);
    lcd_out(1, 1, "TENSAO=");
}

lcd_out(1,10,result);


ou

Em vez de trabalhar com float, multiplica (media * 500 / 1023) por 100 e joga numa int. (ou 1000 se quiser aumentar a resolução)
Quando a leitura for '5V', vc terá '500' na int.
Quando a leitura for '500mV', terá 50 na int.

Usando divisão e módulo, vc consegue imprimir o resultado com pontuação.
Cláudio F
Avatar do usuário
cfreund
Word
 
Mensagens: 672
Registrado em: 14 Out 2006 14:02
Localização: São Paulo

Re: VARIÁVEL FLOAT

Mensagempor Pask » 07 Jun 2015 20:04

Depois vou experimentar.
Pask
Word
 
Mensagens: 600
Registrado em: 22 Dez 2006 19:19

Re: VARIÁVEL FLOAT

Mensagempor KrafT » 07 Jun 2015 21:24

P****, "Voltagem"? :oops:
"..."Come to the edge," he said. And so they came. And he pushed them. And they flew."― Guillaume Apollinaire
Avatar do usuário
KrafT
Dword
 
Mensagens: 2228
Registrado em: 11 Out 2006 14:15
Localização: Blumenau -SC

Re: VARIÁVEL FLOAT

Mensagempor cfreund » 07 Jun 2015 21:33

Dedo bobo. Apertou o 'm' e ele nem percebeu! rs
Cláudio F
Avatar do usuário
cfreund
Word
 
Mensagens: 672
Registrado em: 14 Out 2006 14:02
Localização: São Paulo

Re: VARIÁVEL FLOAT

Mensagempor xultz » 08 Jun 2015 08:32

Se o MikroC tiver a função sprintf, usa ela.
Algo do tipo:

Código: Selecionar todos
#include <stdio.h>

char frase[20];
float voltagem;

voltagem = 0.4523;

sprintf(frase,"Tensao = %.2f", voltagem);

lcd_out(1,10, frase);



Note que o %.2f serve prá dizer que só quero que mostre duas casas depois da vírgula, esse detalhe pode ser ajustado conforme você preferir (uma casa, três casas, etc).
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

Re: VARIÁVEL FLOAT

Mensagempor Pask » 08 Jun 2015 11:17

Meus amigos, o MikroC não possui a função citada. Estou numa situação meio dificil. Vejam o exemplo abaixo:

Código: Selecionar todos
media=0;
  for(i=0;i<20;i++){
     valor=adc_read(0);
     media+=valor;
                          }
     media/=20;               //após esta linha, por exemplo, media recebe o valor decimal 129 digitalmente convertido (cálculo da média de 20 leituras do CAD)
     
     volt=media*5/1023;  //nesta expressão, a variável volt, que é do tipo float, assume o valor 0.6305 após o cálculo.
Porém, o compilador gera o valor 6.3050e-1 que é a mesma coisa em notação científica. O problema é que, quando eu jogo este valor para o display mostrar, ele mostra exatamente este valor. O que deveria acontecer é a conversão deste valor em notação decimal do tipo ponto flutuante, ou seja, 0.6305. Não vejo uma forma de fazer isso!

O que eu gostaria, é que o display mostrasse o valor 0,6305 e não 6,305e-1 como ele está mostrando.
Pask
Word
 
Mensagens: 600
Registrado em: 22 Dez 2006 19:19

Re: VARIÁVEL FLOAT

Mensagempor eletroinf » 08 Jun 2015 11:32

As minhas dicas:
Na leitura, ao invés de 20, usa 16 ou 32 leituras, que depois é só rotacionar os bits para dividir, em variável int.
Ou ainda, mantendo 20 leituras, tu tem o valor real multiplicado por 20, faz um right rotate, tu tem o valor multiplicado por 10.
Aí é só usar uma função que separa os dígitos, e mostra no display sendo a unidade correspondente aos décimos.
Exemplo:
O somatório de 20 chamadas de read_adc() deu 2797.
rotaciona uma vez pra direita (divisão por dois): 2797/2 = 1398
Separa os dígitos em um array e mostra 1 3 9 . 8

Sem float, sem complicação. Tem diversas variações dessa possibilidade.

.
"De cada um segundo sua capacidade a cada um segundo sua necessidade."
Avatar do usuário
eletroinf
Word
 
Mensagens: 948
Registrado em: 12 Out 2006 14:59
Localização: Santa Maria - RS

Re: VARIÁVEL FLOAT

Mensagempor ze » 08 Jun 2015 11:37

http://www.mikroe.com/download/eng/docu ... ibrary.htm
já usei ela há décadas e era mikroc mesmo. Mas depois criei vergonha na cara e minha própria função. Tive que pensar grande para escrever números grandes.
Se eu fosse você não usava float não. A sensação da alta resolução é falsa creio que na prática não há vai ser preciso (nem preciso) visualizar 1.234v p.ex. Além de ocupar um espaço do caraio
Se eu fosse você - II eu ia de cfeund ou eletroinf
abç
Avatar do usuário
ze
Dword
 
Mensagens: 1655
Registrado em: 05 Jun 2007 14:32

Re: VARIÁVEL FLOAT

Mensagempor Pask » 08 Jun 2015 14:01

O estranho é que a função "sprintf" não existe mais na nova versão do MikroC.
Pask
Word
 
Mensagens: 600
Registrado em: 22 Dez 2006 19:19

Re: VARIÁVEL FLOAT

Mensagempor Pask » 09 Jun 2015 14:45

Amigos, obrigado pela ajuda de vocês. O problema foi resolvido sem usar variáveis float e a biblioteca de conversão de tipos do MikroC. Fiz tudo manualmente, efetuando os cálculos do dígito inteiro e dos três dígitos depois da vírgula para apresentar o resultado como (0.000), e transformei cada dígito numa string e fui jogando em cada coluna do display separadamente de modo a formar o valor correto da tensão medida. Deu tudo certo.
Pask
Word
 
Mensagens: 600
Registrado em: 22 Dez 2006 19:19


Voltar para PIC

Quem está online

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

x