Врет тахометр на Arduino Due

STALKER1204
Offline
Зарегистрирован: 28.09.2015

Добрый день. На первичном валу двигателя установил 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);
}

 

dimax
dimax аватар
Offline
Зарегистрирован: 25.12.2013

STALKER1204, а что у вас считает формула в 25 строке?

jeka_tm
jeka_tm аватар
Offline
Зарегистрирован: 19.05.2013

офтоп. dimax помоги пожалуйста с хронографом

STALKER1204
Offline
Зарегистрирован: 28.09.2015

2 магнита замер в 1 секунду. Нужны обороты в мин.

STALKER1204
Offline
Зарегистрирован: 28.09.2015

Есть какие идеи?

dimax
dimax аватар
Offline
Зарегистрирован: 25.12.2013

STALKER1204, нужно проверить исходный сигнал - снимайте осцилограммы входного сигнала на высоких оборотах. Нужно проверить как обрабатывает ваш скетч входной сигнал -подавайте вместо датчика холла сигнал с генератора с регулируемой частотой , регулируйте частоту, проверяйте что выводит генератор и ваш скетч. После этих проверок будет ясно кто виноват и что делать.

STALKER1204
Offline
Зарегистрирован: 28.09.2015

Прошу прощения, забыл написать о том, что все проверено. Осцилографом и тактовым генератором. Форма сигнала - норм. Наблюдается именно "завышение" частоты. Причем - нелинейное. Холостые обороты - совпадают. 800 - 800. Далее при 1500 реальных - 1900 дуня. и так далее. При 5000 - 6500.

На осцилограмме "левых" импульсов (искал наводки от высоковольтных проводов) нет. Провода экранированые. 

После оптопары формиуются имульсы практически прямоугольные, без "дребезга" с амплитудой +3.3 V. 

Если бы считалось меньше - тут все понятно. Искать в направлении не срабатывания элементов цепи.

Тут же картина иная. Или удлиняется временной интервал или каким то образом идут какие то ложные прерывания.

Пробовал откзаться от таймера. Засекал время от millis() считал в loop количество импульсов за интервал времени. Картина аналогичная.

 

brokly
brokly аватар
Offline
Зарегистрирован: 08.02.2014

Осциллограмму покажите.

dimax
dimax аватар
Offline
Зарегистрирован: 25.12.2013

STALKER1204, что для вас норма -мы не знаем. Вы и так не сообщили ни каких деталей, какие датчики холла, хорошо ли они работают от 3,3в. Осциллограмма -обязательно. Ваш скетч хоть и примитивный, но явных косяков не имеет, за исключением 19 строки. Не знаю как для DUE а для UNO в качестве первого параметра указывается не номер ноги, а номер прерывания. Но может в дуе это не так, лень проверять, тем более как говорите работает.

nik182
Offline
Зарегистрирован: 04.05.2015

У меня подобное было связано с дребезгом контактов. Небольшая задержка внутри прерывания, примернрно четверть времени от длительности сигнала на максимальной частоте полностью решило проблему ( В вашем случае rpm_count() ). Задержка чисто программная. Остатка времени хватает на обработку, особенно на малых оборотах.

trembo
trembo аватар
Offline
Зарегистрирован: 08.04.2011

Serial.begin(115200); Угадал ? Нет ?

dimax
dimax аватар
Offline
Зарегистрирован: 25.12.2013

nik182, так там же датчик Холла, откуда дребезгу взяться?  Может им питания не хватает. У меня вот есть классические  датчики с компаратором a3144e,  так у них минимальное напряжение по даташиту 4,5в. Ясное дело, что от 3,3 они начнут глючить..

STALKER1204
Offline
Зарегистрирован: 28.09.2015

Так в скетче же написано 9600.

Хотя..... Возможно. Надо будет проверить.

 

STALKER1204
Offline
Зарегистрирован: 28.09.2015

К сожалению сейчас осцилограмму не могу сфотографировать. Но там все в норме.  Будет возможность - обязательно сфоткаю и покажу. 

Датчик холла SS411, питание у него 12 Вольт. к ардуине подключен через оптопару. Я об этом написал вроде. Ну кроме вольтажа. 

У Due прерывания можно повесить на любую ногу. В целях унификации с Мегой - 3 нога - 1 прерывание для меги. 

С номером прерывания никак не связано. Ибо тогда вообще бы не работало. Возможно глюк в Due. К сожалению другой нету. Попробую на Mege 2560, нужно только будет у нее птитание переключить.

 

 

MagicianT
Offline
Зарегистрирован: 03.10.2015

Софт работает как часы, вот мой дебаг:

 

#include <DueTimer.h>

const int RPM_PIN=3;
volatile int rpm                = 0;    // Тахометр
volatile int rpm_tik            = 0;    // Импуслы тахометра

volatile boolean dybler;
volatile boolean kontrol;

void rpm_count(){
  rpm_tik++;
  dybler = !dybler;
  digitalWrite( 8, dybler);
}

void SensorData(){
  rpm = rpm_tik;
  rpm_tik = 0;
  kontrol = !kontrol;
  digitalWrite( 9, kontrol);
}

void setup(){
   Serial.begin(9600);
   pinMode(RPM_PIN,INPUT);
   attachInterrupt(RPM_PIN,  rpm_count,  RISING);
   Timer3.attachInterrupt(SensorData);
   Timer3.start(1000000);
pinMode( 8, OUTPUT);
pinMode( 9, OUTPUT);
}

void loop(){
    Serial.println(rpm/2*60);
    delay(500);
}

Сайт ардуино действительно не рекомендует атачИнтерапт как у вас, но я не менял и всё  работает.

Цитата:
 

Syntax

attachInterrupt(digitalPinToInterrupt(pin), ISR, mode); (recommended)
attachInterrupt(interrupt, ISR, mode); (not recommended)
attachInterrupt(pin, ISR, mode) ;

(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.

 

 
MagicianT
Offline
Зарегистрирован: 03.10.2015

Да и ещё, библиотеку скачал последнюю 1.4.7 для ДуеТаймер.

Никакой разницы:
//   attachInterrupt(RPM_PIN,  rpm_count,  RISING);
   attachInterrupt(digitalPinToInterrupt(RPM_PIN), rpm_count,  RISING);   

 

 

STALKER1204
Offline
Зарегистрирован: 28.09.2015

Спасибо. После работы поеду на корабль пробовать.

STALKER1204
Offline
Зарегистрирован: 28.09.2015

 

attachInterrupt(digitalPinToInterrupt(RPM_PIN), rpm_count,  RISING);   

Все ок.

Странно. Спасибо.

nik182
Offline
Зарегистрирован: 04.05.2015

dimax пишет:

....откуда дребезгу взяться?  

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

STALKER1204
Offline
Зарегистрирован: 28.09.2015

Дребезг был бы виден на осцилографе. 

nik182
Offline
Зарегистрирован: 04.05.2015

У меня дребезг несколько микросекунд. Один - два импульса. Их видно когда рассматриваешь один фронт с разверткой 5мкс на клетку. если смотреть на весь меандр, хотя бы 1 период, то не видны. Но я  не настаиваю. У меня поля по полторы тесла бегают не далеко.