Пытаюсь посчитать количество полных оборотов мотор-редуктора с помощью прерываний. Прикрепил на выходной вал тонкую полоску из металла, она проходит через оптопрерыватель. Пин прерывания 21 физически соединил с пином 31, от которого поступает сигнал с оптопрерывателя. За 2 секунды мотор успевает сделать 3-4 оборота. Но в сериал порте показывает не корректные значения. То оно считает верно, то зависает на 1-м обороте. Не могу понять в чём проблема.
Вот что мне пишет в сериал порте:
14:09:45.175 -> Кнопка нажата, мотор стартанул
14:09:45.409 -> Кол-во оборотов: 1
14:09:46.012 -> Кол-во оборотов: 2
14:09:46.616 -> Кол-во оборотов: 3
14:09:47.177 -> Мотор отключился, прошло 2 сек.
14:09:50.800 -> Кнопка нажата, мотор стартанул
14:09:51.448 -> Кол-во оборотов: 1
14:09:52.846 -> Мотор отключился, прошло 2 сек.
14:09:56.100 -> Кнопка нажата, мотор стартанул
14:09:56.520 -> Кол-во оборотов: 1
14:09:57.124 -> Кол-во оборотов: 2
14:09:57.726 -> Кол-во оборотов: 3
14:09:58.146 -> Мотор отключился, прошло 2 сек.
14:10:01.074 -> Кнопка нажата, мотор стартанул
14:10:01.260 -> Кол-во оборотов: 1
14:10:01.864 -> Кол-во оборотов: 2
14:10:03.116 -> Мотор отключился, прошло 2 сек.
А вот сам код программы:
Вот что мне пишет в сериал порте:
14:09:45.175 -> Кнопка нажата, мотор стартанул
14:09:45.409 -> Кол-во оборотов: 1
14:09:46.012 -> Кол-во оборотов: 2
14:09:46.616 -> Кол-во оборотов: 3
14:09:47.177 -> Мотор отключился, прошло 2 сек.
14:09:50.800 -> Кнопка нажата, мотор стартанул
14:09:51.448 -> Кол-во оборотов: 1
14:09:52.846 -> Мотор отключился, прошло 2 сек.
14:09:56.100 -> Кнопка нажата, мотор стартанул
14:09:56.520 -> Кол-во оборотов: 1
14:09:57.124 -> Кол-во оборотов: 2
14:09:57.726 -> Кол-во оборотов: 3
14:09:58.146 -> Мотор отключился, прошло 2 сек.
14:10:01.074 -> Кнопка нажата, мотор стартанул
14:10:01.260 -> Кол-во оборотов: 1
14:10:01.864 -> Кол-во оборотов: 2
14:10:03.116 -> Мотор отключился, прошло 2 сек.
А вот сам код программы:
C++:
#define INTERRUPT_PIN 21 /*пин прерывания*/
#define OPTICAL_ENCODER 31 /*сигнальный пин оптопрерывателя*/
/*DIGITAL PINS USABLE FOR INTERRUPTS: 2, 3, 18, 19, 20, 21
(pins 20 & 21 are not available to use for interrupts while
they are used for I2C communication)*/
int MoveUP = 6;
int Motor_Action_Pin = 27; /*пин включения драйвера двигателя*/
bool Button; /*pin 33*/
bool Action = 0; /*переменная запуска действия - вращения мотора*/
long Step = 0; /*счётчик оборотов*/
long Timer = 0;
unsigned long Motor_Timer = 0;
void setup() {
pinMode(MoveUP, OUTPUT);
pinMode(27, OUTPUT);
pinMode(31, INPUT);
pinMode(33, INPUT);
digitalWrite(Motor_Action_Pin, HIGH);
Serial.begin(9600);
attachInterrupt(digitalPinToInterrupt(INTERRUPT_PIN), Read_Enc, LOW);
}
void loop() {
Button = digitalRead(33);
if(Button == 1 && Action == 0 && millis() - Timer >= 100)
{
Action = 1;
Step = 0;
analogWrite(MoveUP, 50);
Serial.println("Кнопка нажата, мотор стартанул");
Timer = millis();
Motor_Timer = millis();
}
if (Action == 1 && millis() - Motor_Timer >= 2000)
{
Action = 0;
analogWrite(MoveUP, LOW);
Serial.println("Мотор отключился, прошло 2 сек.");
}
}
void Read_Enc() {
if (digitalRead(OPTICAL_ENCODER))
{
Step++;
Serial.print("Кол-во оборотов: ");
Serial.println(Step);
}
}