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

Eduardo,

Sua colocação é interessante, então vamos por partes:

- Verifiquei a pinagem da placa W5100 ( www.daltro.eng.br/arduino/w5100.pdf e www.daltro.eng.br/arduino/mega2560.pdf  ) e não existe conexões elétricas nos pinos A0 a A5 para o circuito da placa, ou seja, é apenas o conector de acesso a placa principal (JANALOG).

- Vou comprar os capacitores para ver o que acontece e vou ver se consigo um osciloscópio para analisar os sinais... 

Agora dá uma olhada na resposta para o colega Wiechert e veja se consegue esclarecer o questionamento.

SDS,

Quanto ao questionamento dele, de fato isso acontece.

O chaveamento acontece quando vc solicita uma porta diferente da anterior. Se vc apenas adicionar o delay estará apenas deixando mais tempo a chave na posicao anterior.

A ideia seria deixar mais tempo na posicao desejada antes da leitura oficial.

Vc pode fazer isso com uma leitura, em outras palavras: desprezando a primeira leitura.

Teoricamente (carece de mais testes, mas sempre faço assim e fica bom), fazer uma leitura do canal desejado, delay(1), leitura do canal desejado (esse valendo) fica melhor.

Ainda, vc pode fazer mais de uma leitura para calculo de media.

Costumo fazer 4 ou 8 leituras. Fica melhor pensando que depois vc vai precisar dividir por 4 ou 8 e para o microcontraldor é um calculo super fácil. Já dividir por 10 nao seria tao simples, apesar de que de nada adianta ter dó do microcontrolador e depois usar delay()...

No tempo do 8051 com ADC na interrupção de tempo fazia-se primeiro a leitura e depois o chaveamento para o px canal. Isso dava tempo para a chave acomodar antes da px leitura. No Arduino nem sei se existe interrupção de final de conversão, se ele espera, etc. Fica tudo meio "caixa preta", embora para quem quer o código está disponível.

Eduardo,

Qual o código que usa para fazer essas leituras e calcular a média... tentei fazer isso e não consegui... 

SDS,

O ultimo que fiz ta assim:

analogRead(0); // Nao coloquei, mas opcionamente caberia aqui um delay(1) ou menos.

int Sensor=0;

for (char i=0; i!=4; i++) { Sensor+=analogRead(0);}

Sensor/=4;

Veja se te ajuda.

Valores maiores são otimos tb. Depende se vc tem tempo para perder.

Como uma int (com sinal) aceita valores até 32.768 vc pode usar até 32 no for().

Mas se não parou de pular com media de 16 por ex dificilmente vai resolver ficar só aumentando isso, vc tem algum outro problema. 

Olá Eduardo!

Não seria interessante atender a sugestão do amigo Rui dos tópicos anteriores e colocar um delay para garantir leituras confiáveis, já que é uma recomendação dos projetistas do arduino?

for (char i=0; i!=4; i++) { Sensor+=analogRead(0); delaymicroseconds(150);}

Abraço e bom carnaval a todos!

Eu acho que sim, faz sentido.

Por outro lado, nunca usei e deu certo.

Também os exemplos oficiais não costumam ter.

Enfim, é um capricho.

Dá uma olhadinha no final do tópico !

Sim Eduardo. Concordo, mas às vezes um capricho pode fazer a diferença.

Quando você lê um valor de um sensor e esse valor está coerente, não significa que está certo.

O correto é ler todas as especificações do sensor que acompanham o manual. Alguns deles recomendam determinado tempo entre as leituras para garantir um valor apurado. O sensor de qualidade do ar que uso, por exemplo, já recomenda um tempo de 20 milissegundos antes da primeira leitura.

Se você não seguir essas recomendações, vai funcionar do mesmo jeito, mas nada garante a exatidão da informação.

Alguns sensores também recomendam a utilização de um resistor para fazer a ligação com as portas, mas se vc não colocar o resistor também vai ler um valor do mesmo jeito.

No entanto...

Se a sua aplicação não exige exatidão, tudo bem, mas quando existem vidas em jogo, um capricho pode fazer a diferença

Abraço,

José Cintra

Olá,

Não sei qual a qual sensor colega se refere, pois não foi especificado o modelo ou o link para o datasheet.

Mas da forma como você relatou em sua postagem o delay parece ser necessário apenas durante a inicialização do sensor, com as informações disponíveis fica a impressão que depois da inicialização o delay entre leituras provavelmente seja desnecessário, sendo apenas um capricho que não irá afetar o resultado da leitura. Existe grande diferença entre o correto e necessário e um capricho, principalmente quando existem vidas em jogo...

Abraço.

Prezados colegas, Wiechert em especial.

O nosso amigo Rui nestes diálogos alertou que é necessário um delay entre as leituras analógicas para garantir uma leitura confiável e eu afirmo que esse delay pode ser até calculado, de acordo com o sensor ou qualquer dispositivo ligado nas portas analógicas, NÃO somente no startup.

Veja como fazer esse cálculo aqui:

https://www.quora.com/Why-is-a-little-delay-needed-after-analogRead...

Esse artigo mostra até o motivo desse delay e porque isso NÃO é um capricho.

Além disso, podem consultar o site oficial do Arduino em vários exemplos de leitura analógica, como, por exemplo o link abaixo: https://www.arduino.cc/en/Tutorial/AnalogReadSerial

Destaco uma parte do código:

void loop() {
  // read the input on analog pin 0:
  int sensorValue = analogRead(A0);
  // print out the value you read:
  Serial.println(sensorValue);
  delay(1);        // delay in between reads for stability
}

Veja em negrito o comentário do programador:

Delay ENTRE AS LEITURAS para garantir a ESTABILIDADE.

Repito: Se você não fizer esse capricho, vai funcionar, mas sua leitura está comprometida.

Alguns programadores mais responsáveis e que costumam ler manuais, ao invés do delay, fazem 2 leituras e desprezam uma delas.

Abraço,

José Cintra

Amigo, acho que você não leu a minha explicação inicial muito menos o link que eu coloquei neste tópico... 

Oque eu expliquei, e que também é mostrado no seu link é que o delay ou o descarte de leituras é preciso quando se faz a troca de um pino analógico... quando se faz leituras repetidas de um mesmo pino analógico isso não é necessário... 

Outra dica, as vezes fazer duas leituras descartando a primeira também não é garantia de ter leituras estáveis, devido a impedância de saída de alguns sensores e a impedância de entrada  do circuito do ATmega...

Tente ler o tópico todo com calma e reflita...

Abraço.

Ok. Wiechert, mas os exemplos que destaquei  são em cima da mesma entrada, não na troca. É só ler o código destacado.

Vamos deixar assim. Continue fazendo as leituras do seu jeito.

Não leve a mal, mas vou fazer como recomendam as fontes oficiais.  

RSS

© 2024   Criado por Marcelo Rodrigues.   Ativado por

Badges  |  Relatar um incidente  |  Termos de serviço