Проект бескулачкового двигателя
Я пытаюсь запустить бескулачковый двигатель, и мне нужно отслеживать угловое положение коленчатого вала двигателя. Для этого у меня есть колесо с 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ÅŽÕÑ&crid=3V5JE4FIHXWWA&keywords=capteur+effet+hall+arduino&qid=1675534680&sprefix=capteur+effet+hall+arduino%2Caps%2C71&sr=8-8
Есть ли шанс решить проблему? Я просто хочу получить один импульс от датчика, а не 10 (он должен вести себя как датчик «все или ничего»).
Или мне просто нужно купить датчик Холла другого типа?
Спасибо
1 ответ
Я подумал, что это может быть из-за дребезга сигнала. Вот версия кода без 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 градусов вращения коленчатого вала.
- В чем отличие датчика Холла от индуктивного?
- Измерение скорости ветра с помощью анемометра с эффектом Холла
- Измерение скорости ветра с помощью датчика Холла
- Почему падение напряжения вызывает изменение аналоговых показаний датчика Холла?
- Почему показания датчика Холла меняются, когда я записываю их в последовательный порт?
- Управление скоростью BLDC со встроенным контроллером (Hall out, PWM in)
- Как начать написание кода для датчика эффекта Холла?
- Мгновенная остановка двигателя при неисправности датчика Холла
Вы пробовали регулировать потенциометр на модуле датчика Холла?, @VE7JRO
DuckDuckGo "Эффект Холла тахометра Arduino", @JCA34F
Да, я отрегулировал потенциометр в соответствии с силой магнита., @alexandre rogojan
держите ISR коротким... обновляйте счетчики и устанавливайте только флаги... выполняйте печать внутри
loop()
... ISR означает * прерывание процедуры обслуживания * ( magnet_detect() ), @jsotolaу вас есть доступ к осциллографу или логическому анализатору?, @jsotola
Здравствуйте, я постараюсь сократить ISR. У меня сейчас нет доступа к осциллографу., @alexandre rogojan
начните с этого... он покажет вам, с чем вы имеете дело... https://github.com/gillham/logic_analyzer/, @jsotola