Измерение оборотов в минуту с помощью квадратурного энкодера

Я пытаюсь создать контроллер оборотов в минуту для своего проекта. Для этой цели я использую квадратурный кодер (ppr=400) и Arduino Uno. Я использую приведенный ниже код для расчета оборотов двигателя постоянного тока. Я получаю показания на своем серийном мониторе. Однако этот ОБ / мин не совпадает с моим ручным расчетом (то есть когда я вычисляю об / мин Вручную с помощью секундомера - для более низких скоростей).

EDIT-> Eg - Вручную я получаю около 10 оборотов в минуту, но моя программа показывает 60 и более.>

Я использовал один вывод прерывания на своем Arduino UNO.

#define encoder0PinA  2
#define encoder0PinB  3
int power=6; // to power up the encoder
int gnd=4;  // to provide ground to the encoder
int motor=11; //motor PWM pin
int dir=10;
volatile unsigned int encoder0Pos = 0;

void setup() {
  pinMode(encoder0PinA, INPUT);
  digitalWrite(encoder0PinA, HIGH);       // turn on pull-up resistor
  pinMode(encoder0PinB, INPUT);
  digitalWrite(encoder0PinB, HIGH);       // turn on pull-up resistor
  pinMode(power,OUTPUT);
  pinMode(gnd,OUTPUT);
  digitalWrite(power,HIGH);
  digitalWrite(gnd,LOW);
  pinMode(motor,OUTPUT);
  pinMode(dir,OUTPUT); 
  digitalWrite(dir,LOW);

  attachInterrupt(0, doEncoder, RISING);  // encoder pin on interrupt 0 - pin 2
  Serial.begin (9600);
  Serial.println("start");    // a personal quirk
  analogWrite(motor,120); // to set a particular test RPM to the motor.
}

void loop() {
  encoder0Pos=0;
  delay(1000);
  float rpm=encoder0Pos/(400);
  Serial.println(rpm);
}

void doEncoder() {

  encoder0Pos++;
  }

Также я попробовал самый первый код по следующей ссылке "https://playground.arduino.cc/Main/RotaryEncoders".. В этом случае Arduino полностью прекращает передачу. Я попробовал тот же код на одной из установок моего друга ... удивительно, что он там работает. Не могу понять, где я ошибаюсь... Является ли мой подход к кодированию правильным?? Пожалуйста, просветите меня... Спасибо.

, 👍0

Обсуждение

Когда вы говорите, что ваши расчеты не совпадают, пожалуйста, опишите значения, которые производит каждый из них. Есть много способов, при которых что-то может "не сработать", @jose can u c

конечно, сэр, я отредактирую его как можно скорее., @CR7

Ваш квадратурный энкодер оптический или механический?, @jose can u c

Это оптический квадратурный кодер, @CR7

Кодирующее звено - https://m.aliexpress.com/item/32816515228.html, @CR7


1 ответ


1

Убедитесь, что кодер выдает 400 импульсов на каждой фазе. Это может быть 200 на каждой фазе за один оборот

Вместо того, чтобы сбрасывать счетчик импульсов, подсчитайте время, необходимое для выполнения одного оборота (как можно ближе, насколько вы можете судить), и включите двигатель только на это время, а затем снова выключите. Это позволит вам в более управляемой среде протестировать свой код, и он будет одинаковым(почти) каждый раз.

Вы вычисляете обороты в секунду с помощью своего кода, а не за минимальное количество импульсов/400(если это правильное число)=Обороты, которые вы очищаете каждые 1000 мс

Обеспечьте хорошие соединения на вашей проводке, так как не требуется много времени, чтобы прерывание сработало дважды, когда оно должно было сработать только один раз.

Использовать второй фазы энкодера, это то, что дает возможность для расшифровки сигналов и изменение dirrection, т. е. - несколько импульсов подряд(без каких-либо импульсов б) не равны движения, это значит либо мотор висит прямо на фазы линией, или что-то вызывает прерывание стрелять чаще, чем следует.

,

Почему код с игровой площадки Arduino не работает?, @CR7

Получение направления для меня не проблема... Получение оборотов в минуту или оборотов в минуту-моя главная забота.., @CR7