#1 2017-06-16 17:45:14

ENiAC90
Участник
Зарегистрирован: 2017-06-16
Сообщений: 6

Космические значения при использовании attachInterrupt. Тахометр

Приветствую, Господа. Мои безмятежные представления об осовоении Ардуины впервые наткнулись на камень.
Ближе к сути — Делаю элементарный тахометр. Классическая схема "Магнит—Датчик Холла".

Screenshot_3-1024x568.png

Использую простейшее прерывание от того-же AlexGyver (а сложных и не бывает):

unsigned long lastflash;
int RPM;

void setup() {
  Serial.begin(9600);  //открыть порт
  attachInterrupt(0,sens,RISING); //подключить прерывание на 2 пин при повышении сигнала
}
void sens() {
  RPM=60/((float)(micros()-lastflash)/1000000);  //расчет
  lastflash=micros();  //запомнить время последнего оборота
}

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

И всё бы хорошо, но у него всё работает и очень красиво и точно показывает RPM, а у меня и еще нескольких комментаторов на Ютубе — заоблачные значения, среди которых преобладают 28896 и 19264.

Мое подключение: F5ndaVNcYIpOLhRLGg93pupBNXL4j8NZaDwEMQyuiq5WSU5BO6xUEIu8_D2hf88pB3nSkaRWWLyK_FomBF0JrrGGaxO-14Jt3El_soByQKRmNwOQklO-2uMUDuvEtCZJ9RXTuZ1zcgq3qFi92dv06bxUbKuHnJOCMt5wKPk08SJpPiR1nC2u-VfUhYkyYT1D9v1ohIGSClAjlyePwuGHuTJQzuSNCFJxZvmwUTkK9OwUtQ5mp8s1YfecrdRf_6hd_QYZ6MFMX2pDjFpywJQSnaKuGvEPJjJk1OGQ8ZWEcAtRg4GAYV5fGHkyngAVIz8rYPXAzRlVrG4RE5FqpWqODeNAAs9FzcfpZnfyliQI2NZU81Ka2PNsrcAmEhLMb9b4i8ZPmDg-MuBeeKYWRmHRNaH9OHy0hbTmMODwxveixJEy0XOOJEMA_Kb9fXyz8V1MFGpaZKEqXExqFZrXC2Yc6xxIMGt-bu9mb12xFlzgV6r6lfYTh4j463QXyDQaRSXbiryxsoMseqqidt7-7k4qxsAyvO3CNfk6aO0IoexY5e9sBH0KLLJHNX079eVsZcCQdzNpTOZ8I5TtwYbzKcsbTfhfvRlrpzMIx0nRCmAo4DzSWsWjV4OBLw=w1299-h974-no


Господа, одна надежда на Вас. Пните меня в нужную сторону, ибо у меня уже психоз. Гугл уже содрогается от моих запросов по "ардуино", "прерываниям" и "датчикам холла". И ведь даже у буржуев такой проблемы я не замечал.

Большое спасибо за уделенное время.

#2 2017-06-16 18:19:01

Вячеслав Азаров
Участник
Из Запорожье
Зарегистрирован: 2017-05-25
Сообщений: 570

Re: Космические значения при использовании attachInterrupt. Тахометр

Все должно работать. Может сигнал шумит (дребезжит)?

#3 2017-06-16 18:25:14

ENiAC90
Участник
Зарегистрирован: 2017-06-16
Сообщений: 6

Re: Космические значения при использовании attachInterrupt. Тахометр

Именно. Если в функцию прерывания запихнуть счетчик, то он будет увеличиваться на 5-15 и больше за одну протяжку магнита. С виду — именно дребезг. Но как у готового цифрового модуля может быть дребезг? (Чувствительность настраивал по многу раз, да и у других-то всё работает именно в таком простом варианте) Ладно, когда я подключаю геркон со стягивающим резистором (тут мех контакт, и логично делать задержку на устаканивание), но и с модулем ДХ и с Герконом — значения одни и те-же 28896 и 19264 yikes . Бывают и отрицательные иногда.

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

Редактировался ENiAC90 (2017-06-16 18:27:18)

#4 2017-06-16 19:09:57

Вячеслав Азаров
Участник
Из Запорожье
Зарегистрирован: 2017-05-25
Сообщений: 570

Re: Космические значения при использовании attachInterrupt. Тахометр

ENiAC90 пишет:

Именно. Если в функцию прерывания запихнуть счетчик, то он будет увеличиваться на 5-15 и больше за одну протяжку магнита. С виду — именно дребезг. Но как у готового цифрового модуля может быть дребезг? (Чувствительность настраивал по многу раз, да и у других-то всё работает именно в таком простом варианте) Ладно, когда я подключаю геркон со стягивающим резистором (тут мех контакт, и логично делать задержку на устаканивание), но и с модулем ДХ и с Герконом — значения одни и те-же 28896 и 19264 yikes . Бывают и отрицательные иногда.

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

У вас питание датчика на D3 заведено, а не на VCC.

#5 2017-06-16 19:20:46

ENiAC90
Участник
Зарегистрирован: 2017-06-16
Сообщений: 6

Re: Космические значения при использовании attachInterrupt. Тахометр

Да это у автора кода. Я запитал на VCC.

#6 2017-06-16 20:01:25

Вячеслав Азаров
Участник
Из Запорожье
Зарегистрирован: 2017-05-25
Сообщений: 570

Re: Космические значения при использовании attachInterrupt. Тахометр

ENiAC90 пишет:

Да это у автора кода. Я запитал на VCC.

hmm  Может битый? Проверьте качество сигнала с датчика. И попробуйте сделать pinMode(2, INPUT_PULLUP);

Редактировался Вячеслав Азаров (2017-06-16 20:06:45)

#7 2017-06-16 21:55:05

renoshnik
Участник
Зарегистрирован: 2017-04-03
Сообщений: 145

Re: Космические значения при использовании attachInterrupt. Тахометр

Датчик Холла какой ???

#8 2017-06-17 17:58:51

ENiAC90
Участник
Зарегистрирован: 2017-06-16
Сообщений: 6

Re: Космические значения при использовании attachInterrupt. Тахометр

Датчик использую вот такой https://arduino-kit.ru/catalog/id/modul … lineynyiy_
1176.jpg

В видео у Алекса https://www.youtube.com/watch?v=x2fLvS8Ms9w (ну красиво-жи!) используется такой

big.jpg

Оба имеют цифровые выходы. Оба подключаются к NANO. Причем я пробовал на двух МК, приобретенных в разных магазинах.

Я сразу подумал, что датчик шалит, но при подключении геркона (обычного, велосипедного) по этой схеме:bf491542f2b043e340d9c81c5e8d3b55.jpeg
происходит то-же самое. Нереальное количество прерываний за один проход.



Я пробовал фильтровать так:

void sens() { 
   RPM = round(60/((float)(millis()-lastflash)/1000)); //Сразу считаю RPM

if (RPM != 0) {               //Если RPM текущее не равно нулю (при неправильных срабатываниях)
    
    if ((RPM - RPM_0) > 1000)  //Если нет "космической" разницы с предыдущим значением
   {
     RPM = RPM_1;             //Уравниваем
    }

tm1637.display(((RPM+RPM_0+RPM_1)/3));  //Вывожу среднее из трех последних

if (switch1 == 1) { 
    RPM_1 = RPM; switch1 = 0;
    } else { 
      RPM_0 = RPM; switch1 = 1;
    }

  }
  
  lastflash = millis();  

}

Кое как сие решение работает, но даже не смотря на этот кривой костыль, всё равно проскакивали залётные значения.

Как понять, что датчик глючный? И в нём ли дело, если с герконом работает так-же?... (сейчас попробую pinMode(2, INPUT_PULLUP);)
А что если ардуинки гумн.... да не, не может быть!

#9 2017-06-17 20:05:46

renoshnik
Участник
Зарегистрирован: 2017-04-03
Сообщений: 145

Re: Космические значения при использовании attachInterrupt. Тахометр

https://geektimes.ru/post/286410/

https://drive.google.com/file/d/0B8MrxcpVmXk7c3h5NjRtdVc0c00/view?usp=sharing

https://drive.google.com/file/d/0B8MrxcpVmXk7dG51WUN6cGRTcVU/view?usp=sharing

Редактировался renoshnik (2017-06-17 20:27:25)

#10 2017-06-17 20:41:35

renoshnik
Участник
Зарегистрирован: 2017-04-03
Сообщений: 145

Re: Космические значения при использовании attachInterrupt. Тахометр

unsigned long lastflash;
int RPM;

void setup() {
  Serial.begin(9600);  //открыть порт
  attachInterrupt(0,sens,RISING); //подключить прерывание на 2 пин при повышении сигнала
}
void sens() {
  RPM=(1000000.0/(float)(micros()-lastflash))*60;  //расчет
  lastflash=micros();  //запомнить время последнего оборота
}

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

Редактировался renoshnik (2017-06-17 20:43:37)

#11 2017-06-18 15:51:17

ENiAC90
Участник
Зарегистрирован: 2017-06-16
Сообщений: 6

Re: Космические значения при использовании attachInterrupt. Тахометр

Господа! Огромнейшее спасибо всем, кто откликнулся! Вячеслав Азаров оказался прав. Датчик — отвратительнейшего качества! Я не мог в это поверить, ведь они же продаются сотнями на Алиэкспресс и в наших магазинах (кстати его я купил в этом магазине http://arduino-ua.com/prod1203-modyl-da … olla-a3144). И в интернете нет АБСОЛЮТНО никаких негативных отзывов о их работе, посему я думал, что сам дурак! Сегодня абсолютно случайнейшим образом наткнулся на это видео:

Я подофигел (хотя бывалых, уверен, таким не испугаешь). Осциллограф сорвал покровы и обнажил качество работы сего модуля. Теперь отчетливо понятно, почему у меня заоблачные значения получались в прерываниях. Но зачем здесь компаратор и подстроечный резистор?.. Как говорится, с этим вопросом я жил ровно 2 минуты.

Очень надесюсь, что эта тема поможет новичкам не биться лбом о стену, и быть готовым к таким некачественным датчикам.

Единственное, чем я могу объяснить сходство нереального количества срабатываний геркона и сего ДХ в промежуточном положении магнита — геркон имеет дребезг, и я попробую его завязать через RC цепь с триггером Шмитта (который при подключении питания от ардуины на 14-ю и 7-ю ногу почему-то даёт космический шум в мои колонки).

Следующим видео у автора было:

Если бы я купил сразу такой датчик, я бы не получил такой печальный, но нужный опыт.

(Можно-ли попросить модератора изменить название темы на "Остерегайтесь бракованных китайских датчиков. Сумасшедший Датчик Холла." Чтобы не вводить людей в заблуждения, в которое попал я)?

Еще раз огромное спасибо вам!

#12 2017-06-18 16:50:17

Вячеслав Азаров
Участник
Из Запорожье
Зарегистрирован: 2017-05-25
Сообщений: 570

Re: Космические значения при использовании attachInterrupt. Тахометр

ENiAC90 пишет:

Господа! Огромнейшее спасибо всем, кто откликнулся! Вячеслав Азаров оказался прав. Датчик — отвратительнейшего качества! Я не мог в это поверить, ведь они же продаются сотнями на Алиэкспресс и в наших магазинах (кстати его я купил в этом магазине http://arduino-ua.com/prod1203-modyl-da … olla-a3144). И в интернете нет АБСОЛЮТНО никаких негативных отзывов о их работе, посему я думал, что сам дурак! Сегодня абсолютно случайнейшим образом наткнулся на это видео:

Если бы я купил сразу такой датчик, я бы не получил такой печальный, но нужный опыт.

(Можно-ли попросить модератора изменить название темы на "Остерегайтесь бракованных китайских датчиков. Сумасшедший Датчик Холла." Чтобы не вводить людей в заблуждения, в которое попал я)?

Еще раз огромное спасибо вам!

Возможно, что датчик тут и ни причем. Китайцы не виноваты. Собственно элемент Холла аналоговый. Без триггера Шмидта, просто с компаратором, от будет себя вести как геркон, на границе напряженности магнитного поля, давая "дребезг". Кроме триггера Шмидта можно еще применить фильтр нижних частот, для нормирования двоичного сигнала.

#13 2017-06-18 17:22:08

ENiAC90
Участник
Зарегистрирован: 2017-06-16
Сообщений: 6

Re: Космические значения при использовании attachInterrupt. Тахометр

Почти согласен. Но другие модули, тоже имея компаратор и похожую развязку, подключаются "одним проводом" без бубна и шаманств, и выдают стабильный цифровой сигнал, с которым может работать даже ребёнок. Да и зачем делать такую "сложную схему" и продавать ее за 2 бакса, если нуждно еще что-то аппаратно мудрить?))

А если человек захочет аналоговый сигнал — то он возьмет сам ДХ без обвязки на плате, и наваяет необходимые ему фильтры (хотя с аналоговым сигналом у этого датчика проблем не заметил, значения меняются от 515 до 200, стабильно и без скачков/дребезга, и этого достаточно для определения магнитного поля, но не для прерываний).

#14 2017-06-19 05:55:48

Вячеслав Азаров
Участник
Из Запорожье
Зарегистрирован: 2017-05-25
Сообщений: 570

Re: Космические значения при использовании attachInterrupt. Тахометр

ENiAC90 пишет:

А если человек захочет аналоговый сигнал — то он возьмет сам ДХ без обвязки на плате, и наваяет необходимые ему фильтры (хотя с аналоговым сигналом у этого датчика проблем не заметил, значения меняются от 515 до 200, стабильно и без скачков/дребезга, и этого достаточно для определения магнитного поля, но не для прерываний).

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

Быстрое сообщение

Введите сообщение и нажмите Отправить

Подвал раздела