Врет тахометр на Arduino Due
- Войдите на сайт для отправки комментариев
Пнд, 11/07/2016 - 08:07
Добрый день. На первичном валу двигателя установил 2 магнита, установил датчик холла. Данные с датчика холла поступают на Arduino due. На малых оборотах двигателя все соответствует истине. Но при увеличении оборотов показания начинают завышаться. Так при оборотах 5000-5500 - получаю значение 6600 и выше. В чем может быть проблема? Код ниже:
#include <DueTimer.h> const int RPM_PIN=3; volatile int rpm = 0; // Тахометр volatile int rpm_tik = 0; // Импуслы тахометра void rpm_count(){ rpm_tik++; } void SensorData(){ rpm = rpm_tik; rpm_tik = 0; } void setup(){ Serial.begin(9600); pinMode(RPM_PIN,INPUT); attachInterrupt(RPM_PIN, rpm_count, RISING); Timer3.attachInterrupt(SensorData); Timer3.start(1000000); } void loop(){ Serial.println(rpm/2*60); delay(500); }
STALKER1204, а что у вас считает формула в 25 строке?
офтоп. dimax помоги пожалуйста с хронографом
2 магнита замер в 1 секунду. Нужны обороты в мин.
Есть какие идеи?
STALKER1204, нужно проверить исходный сигнал - снимайте осцилограммы входного сигнала на высоких оборотах. Нужно проверить как обрабатывает ваш скетч входной сигнал -подавайте вместо датчика холла сигнал с генератора с регулируемой частотой , регулируйте частоту, проверяйте что выводит генератор и ваш скетч. После этих проверок будет ясно кто виноват и что делать.
Прошу прощения, забыл написать о том, что все проверено. Осцилографом и тактовым генератором. Форма сигнала - норм. Наблюдается именно "завышение" частоты. Причем - нелинейное. Холостые обороты - совпадают. 800 - 800. Далее при 1500 реальных - 1900 дуня. и так далее. При 5000 - 6500.
На осцилограмме "левых" импульсов (искал наводки от высоковольтных проводов) нет. Провода экранированые.
После оптопары формиуются имульсы практически прямоугольные, без "дребезга" с амплитудой +3.3 V.
Если бы считалось меньше - тут все понятно. Искать в направлении не срабатывания элементов цепи.
Тут же картина иная. Или удлиняется временной интервал или каким то образом идут какие то ложные прерывания.
Пробовал откзаться от таймера. Засекал время от millis() считал в loop количество импульсов за интервал времени. Картина аналогичная.
Осциллограмму покажите.
STALKER1204, что для вас норма -мы не знаем. Вы и так не сообщили ни каких деталей, какие датчики холла, хорошо ли они работают от 3,3в. Осциллограмма -обязательно. Ваш скетч хоть и примитивный, но явных косяков не имеет, за исключением 19 строки. Не знаю как для DUE а для UNO в качестве первого параметра указывается не номер ноги, а номер прерывания. Но может в дуе это не так, лень проверять, тем более как говорите работает.
У меня подобное было связано с дребезгом контактов. Небольшая задержка внутри прерывания, примернрно четверть времени от длительности сигнала на максимальной частоте полностью решило проблему ( В вашем случае rpm_count() ). Задержка чисто программная. Остатка времени хватает на обработку, особенно на малых оборотах.
Serial.begin(115200); Угадал ? Нет ?
nik182, так там же датчик Холла, откуда дребезгу взяться? Может им питания не хватает. У меня вот есть классические датчики с компаратором a3144e, так у них минимальное напряжение по даташиту 4,5в. Ясное дело, что от 3,3 они начнут глючить..
Так в скетче же написано 9600.
Хотя..... Возможно. Надо будет проверить.
К сожалению сейчас осцилограмму не могу сфотографировать. Но там все в норме. Будет возможность - обязательно сфоткаю и покажу.
Датчик холла SS411, питание у него 12 Вольт. к ардуине подключен через оптопару. Я об этом написал вроде. Ну кроме вольтажа.
У Due прерывания можно повесить на любую ногу. В целях унификации с Мегой - 3 нога - 1 прерывание для меги.
С номером прерывания никак не связано. Ибо тогда вообще бы не работало. Возможно глюк в Due. К сожалению другой нету. Попробую на Mege 2560, нужно только будет у нее птитание переключить.
Софт работает как часы, вот мой дебаг:
Сайт ардуино действительно не рекомендует атачИнтерапт как у вас, но я не менял и всё работает.
Syntax
(not recommended Arduino Due, Zero,MKR1000 only)
https://www.arduino.cc/en/Reference/AttachInterrupt
Сигнал подал с генератора, на 8-м пине делённая на 2, на 9-м 0.5 Гц, на сериале (Инпут /2) х 60 как и должно быть.При 200 Гц на 3-м, 8-ой выдаёт 100 и сериал 6000.
Да и ещё, библиотеку скачал последнюю 1.4.7 для ДуеТаймер.
Спасибо. После работы поеду на корабль пробовать.
attachInterrupt(digitalPinToInterrupt(RPM_PIN), rpm_count, RISING);
Все ок.
Странно. Спасибо.
....откуда дребезгу взяться?
У меня работает железка с датчиком Холла в условиях переменных магнитных полей. При подходе к точке переключения Холла таки дребезг случается.
Дребезг был бы виден на осцилографе.
У меня дребезг несколько микросекунд. Один - два импульса. Их видно когда рассматриваешь один фронт с разверткой 5мкс на клетку. если смотреть на весь меандр, хотя бы 1 период, то не видны. Но я не настаиваю. У меня поля по полторы тесла бегают не далеко.