Prezados,

Numa placa MEGA 2560 estou utilizando 12 das 16 entradas analógicas, 10 entradas digitais e 10 saídas digitais. (utilizo fonte externa de 12Vcc/2A regulada no pino jack)

O que acontece é o seguinte:

Quando uso o somente a placa MEGA2560 tudo funciona bem (verifico pelo monitor serial).

Quando adiciono a placa W5100 para utilizar o protocolo modbus TCP, acontece o seguinte, as entradas analógicas A0 e A1 estão super estáveis e muito seletivas. As entradas A02 a A11 estão completamente instáveis... variando muito.

Os pinos definidos como entradas digitais estão funcionando OK.

Não consigo acionar as saídas digitais... (o código pode estar equivocado nessa parte).

Já cogitou-se de instabilidade dos 5Vcc após o regulador da placa 2560, mas isso não se verificou, a tensão é de 4,91Vcc estável naquele ponto. 

O código está no arquivo anexo.

Alguém pode me dar uma luz sobre o que está acontecendo nas entradas analógicas ?

SDS

Daltro

Exibições: 3988

Anexos

Responder esta

Respostas a este tópico

Olá Wiechert,

Dá uma olhadinha no final do tópico !

Oi DRCj, boa noite.

Encontrei estas informações no datasheet do Atmega:

" The internal voltage reference may thus be decoupled by an external capacitor at the AREF

pin to improve noise immunity. "

" The ADC is optimized for analog signals with an output impedance of approximately 10k or less. If such a source

is used, the sampling time will be negligible. If a source with higher impedance is used, the sampling time will
depend on how long time the source needs to charge the S/H capacitor, which can vary widely. The user is recommended
to only use low impedant sources with slowly varying signals, since this minimizes the required charge
transfer to the S/H capacitor."

" A normal conversion takes 13 ADC clock cycles. The first conversion after the ADC is switched on (ADEN in ADCSRA is set) takes 25 ADC clock cycles in order to initialize the analog circuit  "

Rui

Prezados,

Gostaria de agradecer a colaboração e o esforço de todos para a solução do problema, que finalmente foi resolvido.

O problema era a biblioteca MODBUS que eu estava utilizando. 

Mudei-a para a do prof. Andre Sarmento e tudo voltou a funcionar normalmente.

Vejam... não inclui nada ao código apresentado anteriormente. Apenas troquei a biblioteca modbus.

Existe sim uma pequena e desprezível variação na leitura dos 12 pontos, na escala de 0-1023 (10 pts).

Tentarei melhorar tal resultado inserindo as sugestões dos colegas.

Depois lhes informo.

SDS,

 

Prezados,

Acredito que encontrei o código final para a leitura das 12 variáveis.

A coisa ficou assim :

analogRead(A0);                                                    //  Posicionando o ADC na entrada analógica A0  
int _val=0;                                                             // Criando uma variável inteira
for (char i=0; i!=10; i++) { _val+=analogRead(A0);}    // Fazendo a somatória de 10 leituras da A0
_val/=10;                                                               // Calculando a média
mb.Ireg(ANA_00, _val);                                           // Passando o valor final para o mapa modbus

- Porque eu não utilizei a função delay() ?

Não gosto desta função pois ela pára o processamento. Se eu precisar fazer uma interrupção neste momento será impossível, pois o processador está parado.

Pesquisando no vasto material que os colegas disponibilizaram, verifiquei o seguinte :

"Hence the workaround at the beginning of this answer. With the previous premises, an analogRead() takes 104µs in total to return and this is enough for properly charging the S/H capacitor "

Ou seja, o simples posicionamento do ADC na entrada a ser lida " analogRead(A0) " consome 104 us o que resolveria o problema da estabilização.

Testei e ficou bom... leituras no ScadaBR com pequenos pontos de variação !

Ai resolvi implementar a solução apresentada pelo colega Eduardo H. Marcondes que é fazer "n" leituras

e tirar a média entre elas...

Resolvi fazer 10 leituras de cada entrada... (pode ser que com 4 ficasse bom...)

Ficou excelente...  a leitura está seletiva e a repetitividade está perfeita !!!

Novamente agradeço a todos.

Daltro, Fico feliz que tenha resolvido. A solução usada ficou muito boa.

Na prática o FOR utilizado equivale a um delay, só que ele é mais efetivo, pois dentre as 10 leituras, algumas são boas outras não. A média vai pegar a leitura que se sobressai e assim se mata 2 coelhos com uma cajadada só.

Nos meus projetos vou usar daqui pra frente essa técnica da média.

O seu programa ficaria melhor ainda se você colocasse o cálculo da média em uma função que recebe o número da entrada analógica como parâmetro (que é 14 para cima) e devolvesse o valor lido (a média).

Quero aproveitar para agradecer também aos colegas que participaram desse tópico onde pude aprender muita coisa. Peço desculpas se em algum momento me exaltei: É a paixão pelo Arduino e a eletrônica...

Abraço,

José Cintra

Caros,

Apenas para ilustrar, vejam os gráficos das variações das entradas analógicas antes e depois de colocar a função de calculo de média...

http://www.daltro.eng.br/arduino/grafico_01.jpg  

http://www.daltro.eng.br/arduino/grafico_02.jpg  

http://www.daltro.eng.br/arduino/grafico_03.jpg

SDS,  

 

Olá Rui,

Dá uma olhada no final do tópico !

RSS

© 2024   Criado por Marcelo Rodrigues.   Ativado por

Badges  |  Relatar um incidente  |  Termos de serviço