Quebra do codificador rotativo PWM de 360 graus
Quebra do codificador rotativo PWM de 360 graus
Descrição
Este tipo de chave é um codificador rotativo incremental. Na verdade, é o mais amplamente usado de todos os codificadores rotativos devido ao seu baixo custo e capacidade de fornecer sinais que podem ser facilmente interpretados para fornecer informações relacionadas ao movimento, como velocidade.
Ao girar, o codificador rotativo pode contar a frequência de pulso de saída na direção positiva e reversa durante a rotação, ao contrário de um contador de potenciômetro rotativo sem limitação de contagem. Com o botão no codificador rotativo, ele pode ser redefinido para seu estado inicial começando do zero.
Código de teste
redPin int = 2;
int yellowPin = 3;
int greenPin = 4;
int aPin = 6;
int bPin = 7;
botãoPin int = 5;
estado interno = 0;
período longo int = 5000; // Tempo em verde ou vermelho
período curto int = 700; // Período de tempo ao mudar
int targetCount = shortPeriod;
contagem interna = 0;
configuração vazia ()
{
pinMode (aPin, INPUT);
pinMode (bPin, INPUT);
pinMode (buttonPin, INPUT);
pinMode (redPin, OUTPUT);
pinMode (yellowPin, OUTPUT);
pinMode (greenPin, OUTPUT);
}
void loop ()
{
contagem ++;
if (digitalRead (buttonPin))
{
setLights (HIGH, HIGH, HIGH);
}
outro
{
mudança int = getEncoderTurn ();
int newPeriod = longPeriod + (alterar * 1000);
if (newPeriod> = 1000 && newPeriod <= 10000)
{
longPeriod = newPeriod;
}
if (count> targetCount)
{
setState ();
contagem = 0;
}
}
atraso (1);
}
int getEncoderTurn ()
{
// retorna -1, 0 ou +1
estático int oldA = LOW;
estático int oldB = LOW;
resultado int = 0;
int newA = digitalRead (aPin);
int newB = digitalRead (bPin);
if (newA! = oldA || newB! = oldB)
{
// Alguma coisa mudou
if (oldA == LOW && newA == HIGH)
{
resultado = - (oldB * 2 - 1);
}
}
oldA = newA;
antigoB = novoB;
resultado de retorno;
}
int setState ()
{
if (estado == 0)
{
setLights (HIGH, LOW, LOW);
targetCount = longPeriod;
estado = 1;
}
else if (estado == 1)
{
setLights (HIGH, HIGH, LOW);
targetCount = shortPeriod;
estado = 2;
}
else if (estado == 2)
{
setLights (LOW, LOW, HIGH);
targetCount = longPeriod;
estado = 3;
}
else if (state == 3)
{
setLights (LOW, HIGH, LOW);
targetCount = shortPeriod;
estado = 0;
}
}
void setLights (int red, int yellow, int green)
{
digitalWrite (redPin, vermelho);
digitalWrite (yellowPin, amarelo);
digitalWrite (greenPin, verde);
}