Contagem logarítmica no MikroC

Software e Hardware para uC PIC

Moderadores: andre_luis, 51, guest2003, Renie

Contagem logarítmica no MikroC

Mensagempor alexhnunes » 19 Ago 2008 14:08

Pessoal, tenho um projeto aqui que preciso desenvolver uma contagem incremental e decremental, porém em escala logarítmica, para um VU de barras feito no LCD 16x2 que mostrará o valor da saída analógica do PIC16F876 em um sistema de áudio. Consegui fazer isso, porém ele é incrementado e decrementado linearmente (i++ e i--), que não é o ideal para este tipo de coisa. Pesquisando na ajuda do programa, não encontrei nada que eu poderia utilizar em termos de instrução. Alguém poderia me dar uma sugestão de como eu poderia resolver isso?
Alexandre Nunes
alexhnunes
Nibble
 
Mensagens: 59
Registrado em: 28 Mai 2007 10:04
Localização: Campinas - SP

Mensagempor fabim » 19 Ago 2008 14:57

cumé ki é ?
Contagem logaritma?

Qual máximo e minimo valor Analogo que vai entrar ?
Qual a referencia para isto ?

Observe bem o seguinte, para se incrementar ou decrementar logaritmicamente em tensão por exemplo.
Você deve fixar um valor de ofset para referencia de 0 DB.
Tipo LOG10.
10 X "LOG (Vref/Vin)"..
O resultado pode ser positivo, negativo, e ainda vai ter que ser em um ponto flutuante.
Complicadinho né ?
EXprese-se melhor em sua idéia que fica mais facil para o pessoal.
Expressar = funcionamento pratico !! exemplo<< coisas do tipo.

Fabim
Mano, ve só.
Sou responsável pelo que escrevo!!! E não pelo que você entende !!!
fabim
Dword
 
Mensagens: 5001
Registrado em: 16 Out 2006 10:18
Localização: aqui uái!!!?

Mensagempor alexhnunes » 19 Ago 2008 15:29

Pois é, Fabim, ficou meio obscuro essa explicação... Vou mostrar como estou fazendo a linha de programação. Testei uma forma aqui e parece estar dando certo:

Antes eu fazia assim para o incremento da escala:

for (pos1 = 9; pos1<=x; pos1++) Lcd8_Chr(1,pos1,6);

Beleza, funcionou direitinho, porém como se trata de uma escala de áudio, tem que incrementar logaritmamente, senão fica lenta e não acompanha a "música".

Agora estou fazendo assim (o MikroC compilou sem problemas):

for (pos1 = 9; pos1<=x; log(pos1++)) Lcd8_Chr(1,pos1,6);

Percebi uma melhora na resposta, mas como estou simulando no Proteus, não dá para ter uma real idéia do funcionamento prático (é um programa para terceiro, não estou com o hardware em mãos). Está correto isso?
Alexandre Nunes
alexhnunes
Nibble
 
Mensagens: 59
Registrado em: 28 Mai 2007 10:04
Localização: Campinas - SP

Mensagempor fabim » 19 Ago 2008 15:49

ai vareia. Se pelo menos eu entendese uma virgula de "C".
num entendi bem esse log(pos1++), e depois vocÊ jogar o log de um byte direto para o LCD ? sem formatação ?
Bom, Czeiros, deem um herpi pro mininu.

FAbim
Mano, ve só.
Sou responsável pelo que escrevo!!! E não pelo que você entende !!!
fabim
Dword
 
Mensagens: 5001
Registrado em: 16 Out 2006 10:18
Localização: aqui uái!!!?

Mensagempor ze » 19 Ago 2008 15:52

pode até estar correto. mas o pic vai sofrer pra fazer esta conta. se for pt flutuante então....tadim dele. que tal se usasse uma tabela logaritimica indexada pelo pos? tende a ficar + rápido.
abs
Avatar do usuário
ze
Dword
 
Mensagens: 1655
Registrado em: 05 Jun 2007 14:32

Mensagempor Jorge_Francisco » 19 Ago 2008 15:54

Não entendi muito bem a lógica, mas:

Código: Selecionar todos
   for (pos1 = 9; pos1<=x;pos1++) Lcd8_Chr(1, (floor)(log(pos1)),6);


Assim?Mas não deveria ser 20*log Y ou 10*log Y, não?
Avatar do usuário
Jorge_Francisco
Dword
 
Mensagens: 1009
Registrado em: 12 Out 2006 09:53
Localização: Rio de Janeiro

Mensagempor alexhnunes » 19 Ago 2008 16:08

Respondendo...

pos1 é uma variável inteira (int), não é ponto flutuante...

No meu caso, não sei se fazer uma tabela indexada seria a melhor escolha, pois aí o programa ficaria um pouco grande, não sei se o PIC que estou utilizando (16F876) suportaria.

Analisando melhor a lógica do Jorge, acho que a minha está errada... Eu teria que chamar o log no LCD, e não do jeito que eu estava fazendo...
Vou testar aqui...
Alexandre Nunes
alexhnunes
Nibble
 
Mensagens: 59
Registrado em: 28 Mai 2007 10:04
Localização: Campinas - SP

Mensagempor fabim » 19 Ago 2008 16:13

viu c disse audio bla bla bla..
Voce esta dizendo em nivel de tensão né ?
tipo uns 50mS para atualização?
Imagina assim ADC em 8 bits.
Display LCD 16 colunas.

256 / 16 = 16 <<
SE >1 e <16 então....
SE >16 e <32 então....
Se >...........................

ou voce pode fazer um case, etc.

Sei lá cumé kicetá fazendo... mais se é apenas para level de tensão com uma referencia de base de 5VDC em 8Bits, ou seja fundo de escala esta para X mV ou X Watts..
Fabim
Mano, ve só.
Sou responsável pelo que escrevo!!! E não pelo que você entende !!!
fabim
Dword
 
Mensagens: 5001
Registrado em: 16 Out 2006 10:18
Localização: aqui uái!!!?

Mensagempor Sergio38br » 19 Ago 2008 16:21

voce apenas mostra a barra no lcd sem verificar o nivel de audio que esta saindo???
Sergio
Avatar do usuário
Sergio38br
Word
 
Mensagens: 759
Registrado em: 22 Nov 2007 13:39
Localização: São Paulo - SP

Mensagempor alexhnunes » 19 Ago 2008 16:36

Mais ou menos isso, Fabim.

Eu utilizo 2 AD's do PIC, um em cada canal, que pega o sinal de áudio e mostra isso em duas barras no LCD, como se fosse um analizador de espectro musical, porém ele só indica o nível sonoro das saídas esquerda e direita...

A conversão já está feita, isso tá funcionando sem problemas. A questão é mesmo o tempo de "delay", pois a barra não consegue acompanhar os picos musicais, fica atrasada. Segundo a pessoa que me pediu esse programa, o incremento das barras é feito em escala logarítmica...
Alexandre Nunes
alexhnunes
Nibble
 
Mensagens: 59
Registrado em: 28 Mai 2007 10:04
Localização: Campinas - SP

Mensagempor Sergio38br » 19 Ago 2008 16:46

Se vc le o valor do audio aplique o log na tensão capturada e mostre no display

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

Mensagempor fabim » 19 Ago 2008 16:47

tendi, mais ói.
USe o debug, e com o watch, de uma zoiada quanto tempo leva para..

Leitura, conversão, pulo na tabela, escrita de tudo no display.

Se tiver usando liby do mikroX, para LCD.
Ele costuma ter um delay grandinho nas escritas.
O correto é fazer uma liby em asm, em 8 bits e usar aquela tatica de observar o pino busy, que informa quando o display ja esta liberado para novos dados. Dessa forma você não perde tempo.

Fabim

"OBS.. á mais uma coisa, você esta testando esse processo todo no proteus ? injetando audio ou senoide por exemplo ?
Esquece!! pó montar na protoboard.

Fabim de novo
Mano, ve só.
Sou responsável pelo que escrevo!!! E não pelo que você entende !!!
fabim
Dword
 
Mensagens: 5001
Registrado em: 16 Out 2006 10:18
Localização: aqui uái!!!?

Mensagempor alexhnunes » 19 Ago 2008 17:12

Ok, Sergio, vou tentar essa possibilidade...

Fabim, o "pobrema" é que não tenho como debugar aqui no MikroC, preciso do debugador próprio e eu não tenho aqui comigo. Tenho feito na raça mesmo...

Sobre montar no protoboard, vou ver se tenho algum tempinho aqui, isso é meio free-lance, e eu to no trampo...
Alexandre Nunes
alexhnunes
Nibble
 
Mensagens: 59
Registrado em: 28 Mai 2007 10:04
Localização: Campinas - SP

Mensagempor Djalma Toledo Rodrigues » 19 Ago 2008 22:52

Concordo com Lellis e Fabin Tabela + Assembler

Mas, existe uma alternativa por Hardware , que seria aplicar o sinal de cada canal em um Amplificador Logarítmico antes do ADC.
Amplificador Log. vc pode implementar com um Amplificador Operacional e um diodo ou um transistor .

Certamente será necessário um estágio amplificador para compatibilizar o nível do sinal de saída do Amp. Log. com o ADC .

Um Amp. Operacional quadruplo como o TL074 esta ótimo.
:idea:
Editado pela última vez por Djalma Toledo Rodrigues em 20 Ago 2008 08:32, em um total de 1 vez.
Avatar do usuário
Djalma Toledo Rodrigues
Dword
 
Mensagens: 2334
Registrado em: 03 Ago 2008 13:22

Mensagempor albertorcneto » 20 Ago 2008 04:06

So lembrar que escala logaritmica eh sempre em relacao a alguma coisa. No seu caso, ela eh comparada a 1 (X/1). Entao, se X for 255, log(X) = 2,407. E os casos criticos: X = 1 => log(X) = 0 e X = 0 => log(X) nao existe. Entao, seria interessante multiplicar o log(X) por um numero de forma que log(255) atinja sua escala total. E tomar cuidado com os casos criticos.

O ideal seria que o sinal passasse por um circuito logaritmico e o resultado entrar no AD. Mas, se nao der, nao sei se somente somando ao resultado da conversao algum valor seria suficiente pra evitar os casos criticos.
albertorcneto
Byte
 
Mensagens: 269
Registrado em: 28 Mar 2007 14:08

Próximo

Voltar para PIC

Quem está online

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

cron

x