Снятие показаний с датчика Холла автомобиля

Glinka0
Offline
Зарегистрирован: 13.03.2017
volatile float lastflash;
int RPM;

void setup() {
  Serial.begin(9600);  //открыть порт
  attachInterrupt(0,sens,RISING); //подключить прерывание на 2 пин при повышении сигнала

}
void sens() {
  

  RPM=(15000000/(micros()-lastflash));   //4 сигнала за один оборот
    lastflash=micros();  //запомнить время последнего оборота
}

void loop() {
  if ((micros()-lastflash)>1000000){ //если сигнала нет больше секунды
    RPM=0;  //считаем что RPM 0
  }
  Serial.println(RPM);   //вывод в порт

}

Здравствуйте.Пытаюсь снять обороты двигателя с помощью штатного датчика Холла.Сначала прилепил 2 провода,один на минус аккумулятора ,второй через делитель на сигнальный провод Холла,показания уходили в космос из-за наводок от -7500 до 28000.

Взял обычную фольгу и экранировал провод,начали выводиться более правдивые значения ,однако они всё-равно пляшут(в логе-показания ,когда мотор работал ровно).Так вот,как получить нормальные значения?Может у кого-то есть похожие наработки?Код использую ,,стандартный" для датчика Холла,только делю показания на 4 

 

 

 

andriano
andriano аватар
Offline
Зарегистрирован: 20.06.2015

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

Пока не избавитесь от помех, говорить о коде преждевременно.

(кстати, в коде Вы тоже нахомутали - будь здоров! Зачем float? Зачем два раза из прерывания вызываете millis(), а затем дважды приводите ее к float? Зачем деление в прерывании? Если 4 сигнала за оборот, есть ли уверенность, что они распределены равномерно по углу поворота?)

Glinka0
Offline
Зарегистрирован: 13.03.2017

Хорошо.

Если я  использую для подавления помех  схему ,как в уроке Блума на конденсаторе и тригере шмидта она будет работать?

Как я понял расчёт конденсатора выглядит так:

Максимальные обороты двигателя 7000 в мин -- 116,6 в секунду 

следовательно 466,7 импульсов в секунду-- 2,1 микросекунда на импульс

Значит нам надо подобрать ёмкость конденсатора C=время затухания /R 

Резистор подтяжки на 10кОм 

C=2.1*(10^-3) / 10000 =210 нанофарад

Я прав или бред?

 


unsigned long lastflash;
int RPM;

void setup() {
  Serial.begin(9600);  //открыть порт
  attachInterrupt(0,sens,RISING); //подключить прерывание на 2 пин при повышении сигнала

}
void sens() {
  RPM=1000000/(micros()-lastflash);  //расчет
  lastflash=micros();  //запомнить время последнего оборота
}

void loop() {
  if ((micros()-lastflash)>1000000){ //если сигнала нет больше секунды
    RPM=0;  //сигналы в секунду
  }
  Serial.println(RPM);   //вывод в порт
  
}

Код немного подправил.Если например  в прерывании сделать как счётчик (значение++) а потом в цикле его обнулять,то точность получается ниже,чем в моём варианте (задавал на другой ардуине изменение сигнала каждую милисекунду для проверки )

 

MaksVV
Offline
Зарегистрирован: 06.08.2015

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

Glinka0
Offline
Зарегистрирован: 13.03.2017

Благодарю.Взял оптопару 4N25 ,резистор на диод 200 Ом,на подтяжку эмиттера 470 Ом.Всё замечательно работает,правда забыл ,что на один оборот КВ 2 сигнала,а не 4.

va_dos2
Offline
Зарегистрирован: 02.04.2021

Знаю, что было давно, но не осталось ли схемы подключения?

MaksVV
Offline
Зарегистрирован: 06.08.2015