RPM-код Arduino с квадратурным кодировщиком 600ppr

Я пытаюсь настроить arduino uno таким образом, чтобы он измерял число оборотов в минуту на моем кодере. До сих пор мне удавалось выяснить, как точно измерить обороты для первого значения, однако я изо всех сил пытаюсь сбросить значение в конце цикла, поэтому вместо того, чтобы давать мне фактические обороты, они просто увеличиваются с предыдущими данными. , Вот мой код для лучшего понимания того, что я имею в виду …

// Red - 5V
// Black - GND

const int encoder_a = 2; // Green - pin 2 - Digital
const int encoder_b = 3; // White - pin 3 - Digital
long encoder = 0;
long encoderO=0;void setup() {
Serial.begin(9600);
pinMode(encoder_a, INPUT_PULLUP);
pinMode(encoder_b, INPUT_PULLUP);

attachInterrupt(0, encoderPinChangeA, CHANGE);
attachInterrupt(1, encoderPinChangeB, CHANGE);
}

void loop() {
Serial.println(encoder/2400.00*60);
delay(1000);
}

void encoderPinChangeA() {
encoder += digitalRead(encoder_a) == digitalRead(encoder_b) ? -1 : 1;
}

void encoderPinChangeB() {
encoder += digitalRead(encoder_a) != digitalRead(encoder_b) ? -1 : 1;
}

1

Решение

Я бы попытался немного реструктурировать код. Это главным образом для разделения скорости и направления, так как они не зависят друг от друга. Например:

long encoder_pulse_counter = 0;
long direction = 1void setup() {
Serial.begin(9600);
pinMode(encoder_a, INPUT_PULLUP);
pinMode(encoder_b, INPUT_PULLUP);

attachInterrupt(0, encoderPinChangeA, CHANGE);
attachInterrupt(1, encoderPinChangeB, CHANGE);
}

void loop(){
long speed = encoder_pulse_counter/2400.00*60; // Not sure, encoder not specified
Serial.println(direction*speed);
encoder_pulse_counter = 0; // Clear variable just before counting again
delay(1000);
}void encoderPinChangeA(){
encoder_pulse_counter += 1;
direction = digitalRead(encoder_a) == digitalRead(encoder_b) ? -1 : 1;
}

void encoderPinChangeB(){
encoder_pulse_counter += 1;
direction = digitalRead(encoder_a) != digitalRead(encoder_b) ? -1 : 1;
}

Я не тестировал этот код, поэтому могут быть небольшие ошибки. Но я думаю, что разделение расчетов будет намного проще. Надеюсь это поможет!

0

Другие решения

Хороший ответ от Весселя. Некоторые небольшие ошибки в предоставленном коде, полный рабочий и проверенный код:

const int encoder_a = 3; // Pin 3
const int encoder_b = 5; // Pin 5
long encoder_pulse_counter = 0;
long direction = 1;

void encoderPinChangeA()
{
encoder_pulse_counter += 1;
direction = digitalRead(encoder_a) == digitalRead(encoder_b) ? -1 : 1;
}

void encoderPinChangeB()
{
encoder_pulse_counter += 1;
direction = digitalRead(encoder_a) != digitalRead(encoder_b) ? -1 : 1;
}

void setup()
{
Serial.begin(9600);
pinMode(encoder_a, INPUT_PULLUP);
pinMode(encoder_b, INPUT_PULLUP);
attachInterrupt(0, encoderPinChangeA, CHANGE);
attachInterrupt(1, encoderPinChangeB, CHANGE);
}

void loop()
{
long speed = encoder_pulse_counter/1024.00*60; // For encoder plate with 1024 Pulses per Revolution
Serial.print("RPM: ");
Serial.println(direction*speed);
encoder_pulse_counter = 0; // Clear variable just before counting again
delay(1000);
}
0

По вопросам рекламы [email protected]