Fala pessoal

Estou com problema com o 4N25. Vou postar o circuito no post.

Eu fiz um contador de Pulso com o Arduino. Esse pulso é gerado em 12v.

Eu estou utilizando o optoacoplador 4N25 para gerar o mesmo sinal em 5v, para que o Arduino passa ler.

Hoje, estou testando com 2 placas do Arduino, sendo uma para gerar o sinal e outra a outra para ler.

Mas eu estou gerando um sinal de apenas 5 Hz e o meu contador fica contando registra vários ruídos. (ex: 3, 5, 20, 75...).

Preciso fazer alguma coisa a mais no circuito para funcionar? No datasheet, me parece que o 4N25 tem um atraso de apenas 2 us.

Obs 1: Estou utilizando Interrupção na porta 2 para fazer a leitura. Ela apenas incrementa quando percebe uma transição de descida.

Obs 2: Estou utilizando o Pull Up do Arduino.

Exibições: 3715

Anexos

Responder esta

Respostas a este tópico

bom dia Geraldo.

     Se vc me permitir, vou analisar seu código e se necessário fazer ajustes nele. Neste caso, também irei postar um circuito baseado no seu código. Assim vc poderá testar e ver se atende suas expectativas. Mas testarei antes no Proteus, de forma a dar mais confiabilidade, já que pra mim montar o circuito físico seria muito mais demorado.

     Uma nota: embora este último circuito do Cícero esteja ok, não é necessário montar aquele aparato com o LM393 para se conseguir obter um sinal "limpo" cuja quantidade de pulsos possa ser "contada". O LM393 é um "operacional" comparador, incomum de ser usado (seu design é baseado no clássico LM324, embora este seja muito mais versátil, podendo ser usado não somente como comparador mas também como um operacional de uso geral). Assim, eu não estimularia a utilização do LM393 ou outro comparador semelhante.

     Fico no aguardo de um ok da sua parte, sobre a permissão para analisar e "ajustar" seu código.

     Por hora, abrçs,

     Elcids

Elcids,

Fiz o teste com o circuito passado. Removi o pull up da porta que estou lendo o sinal.

Continuou o problema. Quando eu gero o sinal com um Arduino Mega, o Arduino Uno faz a contagem correta durante uns 10 segundos. Ai ele começa aumentar a quantidade de pulsos até um momento em que volta a contagem correta. Esse processo fica se repetindo.  :'(

Sobre o código, pode testar sem problema algum.

Será que pelo fato de eu estar utilizando uma protoboard pode estar afetando esse sinal?

ok Geraldo, boa noite.

     Eu analisei seu código e encontrei alguns problemas nele. Assim que eu tiver algum tempo, te explico o que ocorria ali, e porque acontecia este comportamento.

     Mas como vc me autorizou, refiz o código e implementei o Hardware no Proteus, e fiz a respectiva simulação com o "novo" código. Funcionou direitinho e é sempre estável.

     Usei técnicas "consagradas", as quais garantem este funcionamento correto e estável.

     Daqui a pouco estarei publicando aqui o código, assim como o Hardware respectivo (arquivo do Proteus).

     Vc notará que o código está documentado (com comentários) de forma a elucidar e justificar as ações aplicadas.

     Assim, daqui a alguns minutos terei publicado o resultado aqui.

    Abrçs,

    Elcids

Blz, Elcids. Fico no aguardo. Abraço

Bom dia Geraldo, 

O seu problema pode ser no sensor de rotação da roda dágua.

Creio que a rotação deve ser baixa. Muito simples de detectar com o Arduino. 

O sensor da roda deve estar gerando ruídos que podem ser interpretados como pulsos.

Qual é o sensor usado na roda dàgua ?

José, eu não tenho essa informação.

O teste que estou fazendo é fazendo a geração de Pulso com um Arduino Mega (Pulso em 5v) e testando o meu código contador com o Arduino Uno.

Já resolveu ?

Esse projeto é simples e não tem como dar errado. 

José, ontem a noite eu consegui resolver colocando um Filtro Passa-baixa ou Debounce. Não sei exato o porque ocorria esses ruídos, mas consegui resolver.

boa noite Geraldo.

     Como prometido, estou anexando os arquivos referentes aos ajustes no seu código original. Você notará, que o funcionamento é exatamente o mesmo, porém corrigi pequenos problemas que causavam falhas.

     Anexados, está também o arquivo de projeto do Proteus, juntamente com o arquivo "HEX" (necessário para a simulação) e a biblioteca do Arduino que usei no Proteus. Na pasta da biblioteca, há um arquivo TXT que instrui como usá-la).

     Também há um arquivo impresso em PDF do circuito. Vc notará que para gerar os pulsos, eu usei um Gerador de Sinais do Proteus. O funcionamento do código no Arduino, não depende da origem do sinal, desde que seja uma onda quadrada claramente definida. Mas caso vc deseje que eu acrescente um segundo Arduino para gerar os Pulsos a serem medidos, é só me avisar que providenciarei.

     Testei o simulador com pulsos de baixa frequência (1 a 10 Hz), e com pulsos de até 1kHz. Observe que se vc for medir frequencias mais baixas que 1Hz, necessitará de um intervalo de amostragem maior que 1 segundo, já que o período de um sinal assim, tem duração maior que 1 segundo (do contrário, não há como o programa detectar os edges da onda quadrada em apenas 1 segundo, já que a distância entre eles é maior que este período de tempo). Neste caso, se vc usar por exemplo um período de amostragem de 2 segundos, não se esqueça que para obter-se a taxa de pusos/segundo, precisará dividir o Contador de Pulsos por 2. Em suma: para um período de amostragem igual a "X" segundos, basta dividir o Contador de Pulsos por "X" para se obter a taxa por segundo. Mas se vc não for medir taxas menores que um Pulso por segundo, então nada precisa ser feito. Note que para o total de pulsos acumulados, nada muda, já que basta ir acumulando as novas medições do Contador de Pulsos, e o programa já está fazendo isso.

     Observe que "desliguei" a desabilitação e habilitação das Interrupções. Isto porque, devido à baixa taxa de pulsos e simplicidade do programa, o efeito disso na contagem de pulsos é desprezível, sendo portanto imperceptível.

     Também simplifiquei o "debouncing" do botão "RESET", pois pela forma como seu programa funciona, não é necessário nenhum tratamento especial para evitar falhas devido ao "bouncing" mecânico do botão. Apenas um simples e adequado "delay" consegue tratar isso, sem prejudicar a temporização do programa (que usa o "Millis" como referência). Você poderá atestar isso quando for verificar o funcionamento.

    Sobre o circuito, note que não usei o Pullup interno no pino de entrada dos Pulsos, pois a colocação de um resistor externo dá maior flexibilidade na escolha do valor do mesmo, de forma a garantir uma melhor qualidade nos pulsos digitais que vem do Opto-acoplador (veja o meu primeiro post). Apesar de eu ter colocado um resistor de 330 ohms para o LED emissor, o que permite valores mais baixos do resistor de coletor do Opto, preferi usar um valor de 33 kohms no coletor, pois isso garante pulsos de boa definição caso alguém deseje aumentar o resistor do LED do Opto, para por exemplo algo em torno de 1 kohm (e consequentemente reduzir a corrente de acionamento do LED).

     Para o botão "RESET", mantive o pullup interno do Atmega328 que vc já tinha usado. Isto porque para a função do botão não é necessário que o resistor tenha um valor muito definido, e o pullup interno do Atmega dá conta disso.

    Um comentário final: apesar do seu código original inicializar a "SERIAL" padrão do Arduino, não havia nenhum uso dela dentro do programa. Mesmo assim eu mantive a mesma. Caso vc venha a usá-la, atente para não prejudicar a temporização do programa, ou seja, é preciso analisar com um certo cuidado em que ponto vc enviaria mensagens (ou tratará comandos recebidos), para não comprometer a taxa de amostragem usada para o Contador de Pulsos. Caso vc venha a usar este recurso (a Serial), eu posso te instruir como fazer isso sem prejuízo para o funcionamento do programa.

      Como a formatação do editor do Arduino não é muito "amada", usei um editor externo (o NotePad++) para escrever as alterações no código. Claro que isso causa algumas chatices na "identação" quando abrimos o código no editor do Arduino (mas nem é tanto). Assim para aqueles que pertencem ao clube dos que não amam muito o editor do Arduino (isto me inclui), estou deixando junto anexado a impressão em PDF a partir do NotePad++, onde a sintaxe do C/C++ é bem evidenciada.

     Finalizando, um print do circuito simulado no Proteus, é mostrado a seguir:

     Caso necessite de algum esclarecimento sobre qualquer ponto, estou à disposição.

     Abrçs,

     Elcids

Anexos

RSS

© 2024   Criado por Marcelo Rodrigues.   Ativado por

Badges  |  Relatar um incidente  |  Termos de serviço