Página 1 de 2

Contagem logarítmica no MikroC

MensagemEnviado: 19 Ago 2008 14:08
por alexhnunes
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?

MensagemEnviado: 19 Ago 2008 14:57
por fabim
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

MensagemEnviado: 19 Ago 2008 15:29
por alexhnunes
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?

MensagemEnviado: 19 Ago 2008 15:49
por fabim
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

MensagemEnviado: 19 Ago 2008 15:52
por ze
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

MensagemEnviado: 19 Ago 2008 15:54
por Jorge_Francisco
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?

MensagemEnviado: 19 Ago 2008 16:08
por alexhnunes
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...

MensagemEnviado: 19 Ago 2008 16:13
por fabim
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

MensagemEnviado: 19 Ago 2008 16:21
por Sergio38br
voce apenas mostra a barra no lcd sem verificar o nivel de audio que esta saindo???
Sergio

MensagemEnviado: 19 Ago 2008 16:36
por alexhnunes
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...

MensagemEnviado: 19 Ago 2008 16:46
por Sergio38br
Se vc le o valor do audio aplique o log na tensão capturada e mostre no display

Sergio

MensagemEnviado: 19 Ago 2008 16:47
por fabim
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

MensagemEnviado: 19 Ago 2008 17:12
por alexhnunes
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...

MensagemEnviado: 19 Ago 2008 22:52
por Djalma Toledo Rodrigues
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:

MensagemEnviado: 20 Ago 2008 04:06
por albertorcneto
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.