Проект бескулачкового двигателя

Я пытаюсь запустить бескулачковый двигатель, и мне нужно отслеживать угловое положение коленчатого вала двигателя. Для этого у меня есть колесо с 30 магнитами, прикрепленными к коленчатому валу, так что, когда колесо вращается вместе с коленчатым валом, датчик Холла обнаруживает магнит и добавляет +1 к счетчику магнитов. Когда один полный оборот завершен (т.е. когда прошло 30 магнитов), я сбрасываю счетчик на 0. Вот код:

const int hall = 2;
int hallcounter = 0;
int hallstate = 0;
int lasthallstate = 0;
unsigned long triggerTime;
unsigned long last_triggerTime;
unsigned long timeGap;
unsigned long last_timeGap;
unsigned int degree;
unsigned int state;
int newstate;


void setup() {
  pinMode(hall, INPUT_PULLUP);
  Serial.begin(115200);
  pinMode(10, OUTPUT);    // устанавливает цифровой вывод 10 в качестве выхода
  pinMode(11, OUTPUT);    // устанавливает цифровой вывод 11 в качестве выхода
  attachInterrupt(0, magnet_detect, RISING);//Инициализируем цифровой вывод прерывания 2
  digitalWrite(10, HIGH); //инициализировать реле при открытии
  digitalWrite(11, HIGH); //второе реле
  degree = 0;
}


 void loop()
 {
  // Компилятор говорит, что это необходимо, иначе правительство. берет мою кошку
   }

void magnet_detect() {
      hallcounter ++;
     
      if (hallcounter==30)
      {
        //Serial.println(состояние);
        Serial.println("missing tooth");
        hallcounter = 0; 
        state++; // Вот это мусор, и вы это знаете.
      }
    
      Serial.println(hallcounter);
    
     //степень = счетчик * 6;
     if ((state % 2) == 0) { //Bool не работал, поэтому начался пожар в мусорном баке.
        Serial.print("ETAT ADM 1 ");
        if (1 <= hallcounter && hallcounter <= 17) { //РЕДАКТИРОВАНИЕ ЗДЕСЬ ВВОД
        digitalWrite(10, LOW); // включает цифровой вывод 10
        }
        else {
        digitalWrite(10, HIGH);  // отключает цифровой контакт 10
        }
     }
     if ((state % 2) == 1) {
        Serial.print("ETAT ECH 2 ");
        if (18 <= hallcounter && hallcounter <= 29) { //РЕДАКТИРОВАТЬ ЗДЕСЬ EXHAUST
        digitalWrite(11, LOW); // включает цифровой вывод 13
        }
        else {
        digitalWrite(11, HIGH);  // отключает цифровой вывод 13
        }
     }
  lasthallstate = hallstate;
}

Вот проблема: датчик Холла подключен к цифровому контакту 2, но когда проходит один магнит, вместо отправки одного импульса он выдает случайное количество импульсов (от 5 до 10), поэтому слишком много добавляется к " ;прилавок".

Вот модель датчика Холла, который я использую: https://www.amazon.fr/Magnétique-Linéaire-Compatible-Microcontrôleurs-Raspberry/dp/B09WN2HZBS/ref=sr_1_8?__mk_fr_FR =ÅMÅŽÕÑ&amp;crid=3V5JE4FIHXWWA&amp;keywords=capteur+effet+hall+arduino&amp;qid=1675534680&amp;sprefix=capteur+effet+hall+arduino%2Caps%2C71&amp;sr=8-8

Есть ли шанс решить проблему? Я просто хочу получить один импульс от датчика, а не 10 (он должен вести себя как датчик «все или ничего»).

Или мне просто нужно купить датчик Холла другого типа?

Спасибо

, 👍0

Обсуждение

Вы пробовали регулировать потенциометр на модуле датчика Холла?, @VE7JRO

DuckDuckGo "Эффект Холла тахометра Arduino", @JCA34F

Да, я отрегулировал потенциометр в соответствии с силой магнита., @alexandre rogojan

держите ISR коротким... обновляйте счетчики и устанавливайте только флаги... выполняйте печать внутри loop()... ISR означает * прерывание процедуры обслуживания * ( magnet_detect() ), @jsotola

у вас есть доступ к осциллографу или логическому анализатору?, @jsotola

Здравствуйте, я постараюсь сократить ISR. У меня сейчас нет доступа к осциллографу., @alexandre rogojan

начните с этого... он покажет вам, с чем вы имеете дело... https://github.com/gillham/logic_analyzer/, @jsotola


1 ответ


0

Я подумал, что это может быть из-за дребезга сигнала. Вот версия кода без ISR, использующая задержку в 8 миллисекунд для фильтрации отказов:


const int hall = 2;
int hallcounter = 0;
int hallstate = 0;
int lasthallstate = 0;
unsigned int state;
int newstate;


void setup() {
  pinMode(hall, INPUT);
  Serial.begin(115200);
  pinMode(10, OUTPUT);    // sets the digital pin 10 as output
  pinMode(11, OUTPUT);    // sets the digital pin 11 as output
  digitalWrite(10, HIGH); //initialize relays at open
  digitalWrite(11, HIGH); //second relay
}


 void loop()
 {
   hallstate = digitalRead(hall);
   if (hallstate != lasthallstate) {
     if (hallstate == HIGH) {
       hallcounter ++;
       Serial.println(hallcounter);

     }
     delay(8);
   }
   lasthallstate=hallstate;

   if (hallcounter==29){
     Serial.println("RESET");
     hallcounter=0;
     state++;
   }
   if ((state%2)==0){
     //Serial.println("ETAT ADM 1");
     if (1 <= hallcounter && hallcounter <= 17){
       digitalWrite(10,LOW);
     }
     else{
       digitalWrite(10,HIGH);
     }
   }
   if ((state%2)==1){
     //Serial.println("ETAT ECH 2");
     if (18 <= hallcounter && hallcounter <= 27){
       digitalWrite(11,LOW);
     }
     else if (hallcounter == 28){
       digitalWrite(11,HIGH);
     }
   }

 }

Теперь проблема в том, что я не могу запустить двигатель с 30 магнитами на коленчатом валу: при 900 об/мин задержка в 8 мс заставляет меня терять почти 40 градусов вращения коленчатого вала.

,