Olá pessoal,

Estou precisando de uma ajudinha, pois os pulsos gerados estão fora do esperado.

Meu disco encoder tem 20 buracos e teoricamente ao completar 1 volta ele teria gerado 20 pulsos.

Mas ocorre que ele só está completando 1 volta com +/-70 pulsos e fora que o motor nunca para na mesma posição.

Meu objetivo em suma é controlar essa posição do motor com base nos pulsos gerados pelo encoder.


Meu código está disponível no anexo.

Outra coisa... Vocês tem alguma dica para melhorar o contato do jumper macho com o slot no arduino? Notei que isso também tem grande influência na leitura dos pulsos, pois tem uma pequena folga na conexão.

Estou usando:

- Arduino UNO R3

Optocoupler module with LM393 comparator

- Motor DC

- Disco Encoder

 

Exibições: 842

Anexos

Responder esta

Respostas a este tópico

Boa noite FP,

sugestão:

Remova o code que colou na área de texto e anexe como arquivo.

Rui

Feito. Obrigado.

Qual é a rotação (RPM) desse motor ? É bem lento?

Como consegue identificar que uma volta corresponde à 70 pulsos?

Acho interessante que envie uma foto visível da sua montagem - encoder + disco ótico.

Qual é a rotação (RPM) desse motor ? Acredito que a velocidade de rotação esteja ligada ao PWM. Não fiz medições, mas considero, da forma como estou usando, como rápida.

Como consegue identificar que uma volta corresponde à 70 pulsos? A velha técnica da tentativa e erro (empiricamente). E também para confirmar o número usei um print fora da rotina de interrupt.

Acho interessante que envie uma foto visível da sua montagem - encoder + disco ótico. Feito. O D0(fio azul) do sensor vai no Digital 2 do arduino.

Oi FP, 

sugiro você reduzir o code para identificar o problema do encoder.

Faça um code simples que gire o motor de forma lenta e tente identificar qtos pulsos o

arduino recebe do encoder..

Rui

Rui,

Segui seu conselho e fiz um teste de código mínimo...

E também retirei a roda (evitar interferência do atrito com o chão) e alinhei bem o disco encoder entre o emissor e receptor do sensor óptico. Conclusões:

"analogWrite( pino_B_IA, 255-PWM )"

PWM = 110 => analogWrite( pino_B_IA, 145)

Se D0 liga no pino Dig2, então  1 volta = 75 pulsos

Se D0 liga no pino Dig3, então 1 volta = 110 pulsos (Bizarro isso)

Muitas vezes ele conta 75 pulsos, mas não concluiu a volta.

Substitui o sensor óptico por outro igual...

Se D0 liga no pino Dig2, então  1 volta = 75 pulsos

Se D0 liga no pino Dig3, então 1 volta = 140 pulsos...

PWM = 190 => analogWrite( pino_B_IA, 65 )

Se D0 liga no pino Dig2, então  1 volta = 62 pulsos

O sistema está totalmente imprevisível no momento =(

Anexos

Primeiro teste :

Gire o disco ótico com a mão e conte os pulsos com o seu programa .

A fresta do emissor ou do sensor otico é estreita o bastante para captar apenas um pulso quando o buraco do disco ótico passa entre eles?

RPM =  RPS x 60

Uma rotação  = 20 pulsos . 

1 RPM = 3 pulsos/segundo  - correto ?

Consegui resolver!

O problema era no código onde eu estava iniciando a interrupção com um dos argumentos errado.

Era: attachInterrupt(0, contador, FALLING);

Ficou: attachInterrupt(digitalPinToInterrupt(pino_SenOP), contador, FALLING);

Onde o primeiro argumento é o pino configurado para interrupção (No caso do UNO vc pode usar o d2 e o d3).

Segundo é o método de rotina, que no meu caso é um contador de pulso.

Terceiro é quando ocorre. No meu projeto vai ser nas bordas de descida.

A precisão ainda não é 100%, mas pelo menos está dentro do aceitável.

Anexos

RSS

© 2024   Criado por Marcelo Rodrigues.   Ativado por

Badges  |  Relatar um incidente  |  Termos de serviço