Qual é a precisão do Arduino usando codificadores rotativos?

15

Motores de passo geralmente são caros para um motor grande. No entanto, com um poderoso motor DC padrão e um codificador rotativo, você pode "simular" um motor de passo. Qual a precisão dos codificadores rotativos do Arduino apenas com um loop básico e sem muito outro código? Vai "perder um pulso" e não gravar rotação suficiente com frequência? Como posso lidar com isso com muito mais código? Existe uma maneira melhor de fazer isso? Interrompe a ajuda? Existe algum tipo de circuito que ajudaria com esse problema?

Nota: Provavelmente não excederá 4 rotações por segundo ... (Isso pode ser muito, mas se você estiver executando um mecanismo do tipo parafuso de avanço que seria de apenas 24 polegadas por minuto se houver 10 rotações por polegada de movimento linear. )

Pinguim anônimo
fonte
Eu usei codificadores rotativos que se recusavam a funcionar corretamente quando giravam rapidamente. Eu acho que varia com o preço.
jippie

Respostas:

10

Interrupções são o que você usaria nessa situação.

As taxas que você mencionou são lentas o suficiente, onde você provavelmente seria capaz de contá-lo dentro de um loop, no entanto, isso não é recomendado, pois um loop típico levará muitos ciclos de clock para ser concluído, e dependendo do número de instâncias por loop , você pode perder algumas contagens.

As interrupções são feitas para esse fim, pois podem ser acionadas a qualquer momento, independentemente do estado do loop.

Há uma função nomeada attachInterrupt()que receberá três argumentos.

  1. Pin de interrupção
  2. Rotina de serviço de interrupção
  3. Modo

Abaixo está um exemplo para contar uma interrupção

volatile int myCounter = 0;

void setup(){
    attachInterrupt(0, count, RISING);
}

void count(){
    myCounter++;
}

Os modos são os seguintes:

BAIXA, MUDANÇA, AUMENTAR, CAIR

Mais informações sobre o uso de interrupções podem ser encontradas aqui .

Dependendo do codificador usado, você precisará adaptar o código às suas necessidades e fazer mais alguns cálculos para determinar sua posição, mas esse deve ser um bom ponto de partida.

Editar Aqui está um exemplo de código do Arduino Sandbox para usar um codificador rotativo.

Matt Clark
fonte
11
Um detector de borda acionado por interrupção em um Duemilanove manipula facilmente 100 bordas por segundo (6500rpm em um motor).
Wayfaring Stranger
@ WayfaringStranger Então não há problema em um Uno, então. Obrigado!
Anonymous Penguin
11
@AnnonomusPerson - Quanto trabalho você está disposto a colocar? Se você ficar nu ( ISR_NAKED()), poderá pular a economia automática de contexto C e obter taxas de interrupção de 100 a 500 Khz sem problemas, mas basicamente está escrevendo o assembly em C nesse ponto.
Connor Lobo
11
Se você deseja um documento completamente banannas sobre como otimizar a porcaria absoluta da resposta à interrupção, consulte aqui . Colocar o código diretamente na tabela de interrupções para reduzir ainda mais a latência da interrupção!
Connor Lobo
11
Além disso, observe que, se você estiver buscando interrupções de baixa latência, a função attachInterrupt do arduino injeta uma sobrecarga adicional de chamada de função em comparação com o uso ISR()direto da interrupção .
Connor Lobo
3

Adicionando algumas referências a bibliotecas e exemplos já escritos, para permitir a comparação entre diferentes abordagens e experiências com velocidade versus suscetibilidade a etapas ausentes.

Leitura de codificadores rotativos: http://playground.arduino.cc/Main/RotaryEncoders

Codificador de quadratura muito rápido para o Arduino (com solução): http://www.hessmer.org/blog/2011/01/30/quadrature-encoder-too-fast-for-arduino/

Biblioteca Teensy Encoder: https://www.pjrc.com/teensy/td_libs_Encoder.html

Lendo o codificador rotativo no Arduino: http://www.circuitsathome.com/mcu/reading-rotary-encoder-on-arduino/

gwideman
fonte