как считать импульсы

Yer
Offline
Зарегистрирован: 12.02.2016

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

vde69
Offline
Зарегистрирован: 10.01.2016
Yer
Offline
Зарегистрирован: 12.02.2016

счетчик импульсов как можно написать 

Клапауций 322
Offline
Зарегистрирован: 31.12.2015

Yer пишет:

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

класс титановый велосипед StopWatch.

kulon
Offline
Зарегистрирован: 02.03.2016

Этот длительность импульса считает, и почему-то везде пишут типа не использовать (т.к. пока оно выполняется все остальное замирает)...

DIYMan
DIYMan аватар
Offline
Зарегистрирован: 23.11.2015

attachInterrupt?

Yer
Offline
Зарегистрирован: 12.02.2016

как рабоать с attachInterrupt что то не понял справочнике

Arhat109-2
Offline
Зарегистрирован: 24.09.2015

Считать импульсы и не завешивать МК для иных задач можно несколькими способами:

1. Счетным входом любого счетчика, который выведен у Ардуин (не у всех и не все присутствуют). Заводите счетный сигнал на вход счетчика и по сигналам от 0 таймера (каждые 1024мксек) можете смотреть сколько насчитал счетчик. Это если импульсы относительно короткие: к примеру 10мксек даст погрешность в 10/1024 или около 1%; 100мксек уже около 10% или увеличивать время подсчета. Этим методом у меня (библиотека arhat.h есть github и тут тема) считается частота от датчика цвета TCS3200 ещё и с автоподстройкой времени счета для сохранения приемлемой точности (файлик tcs3200.h для Мега2560, 5-й таймер). Если на прерывание по переполнению 0 таймера, к типовому обработчику добавить callback функцию, то она будет вызываться каждые 1024мксек и читать данные со счетчика без ошибок во времени. Такой хук есть в этой же библиотеке.

2. Подсчет количества прерываний на каком-нибудь входе за время заданное тем же 0 таймером (к примеру). Например, можно завести сигнал на PCINT и считать его, как это сделано у меня для подсчета импульсов от энкодеров (pcint.h, tsc.h). Ограничения теже самые.

3. Можно считать не количество импульсов а их период (длительность) и пересчитывать в количество за заданное время. Это для относительно длинных и регулярных импульсов. В этом случае, удобно использовать прерывания PCINT, поскольку они срабатывают и по фронту и по спаду сигнала. Остается только измерить время между этими событиями. Так у меня считается дальность от ультразвукового датчика HCSR04 (hcsr04.h). В той же библиотеке есть пример "как" (TSC_PulseIn.ino).

4. Можно считать длительность импульса через сигнал захвата таймера ICP, но этот способ также требует "слегка поизвращаться" с анализом фронта и спада - требуется перепрограммирование таймера "на лету" и вычисление разности показаний, что уже не так удобно.

Arhat109-2
Offline
Зарегистрирован: 24.09.2015

Yer пишет:
как рабоать с attachInterrupt что то не понял справочнике

Да никак с ним не надо работать. Есть ISR(). Курите interrupt.h из файлов компилятора avr-gcc. Там всё просто.

attachInterrup() это больше эмуляция, чем обработка прерываний, насколько помню.

Yer
Offline
Зарегистрирован: 12.02.2016

спасибо за отклик можешь по подробнее рассказать про ISP 

Arhat109-2
Offline
Зарегистрирован: 24.09.2015

А что там подробнее? Это макрос, который создает обработчик прерывания и сажает его на заднный вектор. Вот собственно и всё.

Например, обработчик переполнения нулевого таймера - тот который собственно и "считает время", которое вы получаете через millis() или delay():

// моя версия, упрощенно:
ISR(timer0_OVF_vector)
{
   msecs++; // увеличиваем глобал: количество миллисекунд (по 1024мксек) от включения Дуньки
}

// ну и ранее есть описание типа такого:
static volatile unsigned long msec=0;

Как конкретно называется то или иное прерывание - смотреть interrupt.h. Название вектора однозначно определяет его точку входа и какие прерывания он обрабатывает. Соответствующее прерывание должно быть разрешено в setup(). Как - смотрите описание той части МК, прерывания которых вы хотите обрабатывать. У Ардуино Мега2560 их аж 56 штук.

По таймерам есть вектора: по переполнению таймера, по срабатыванию каналов ШИМ (A,B или C), по сигналу на ноге захвата ICP. Итого 5 штук для 16-битного таймера, если его нога ICP разведена на плате - это 4 и 5 таймер. 1 и 3 - такой ноги не имеют на плате Arduino Mega, зато они есть на плате Arduino Core2560. Ну и по остальным прерываниям и контроллерам: надо смотреть конкретную модель, что она имеет, а что на ней "забыли" развести.

В целом, без конкретики скзать что-то детальнее .. ну не знаю.

Клапауций 322
Offline
Зарегистрирован: 31.12.2015

kulon пишет:

Этот длительность импульса считает, и почему-то везде пишут типа не использовать (т.к. пока оно выполняется все остальное замирает)...

кто что везде пишет и что замирает, пока что выполняется?

Yer
Offline
Зарегистрирован: 12.02.2016

я еще изучаю ардуино по этому тяжело мне понять,где можно найти примеры чтобы легче понять

Yer
Offline
Зарегистрирован: 12.02.2016

занимаюсь программированием плк овен на языке ST ,как легче разобратся с программированием ардуино

Клапауций 322
Offline
Зарегистрирован: 31.12.2015

Yer пишет:

занимаюсь программированием плк овен на языке ST ,как легче разобратся с программированием ардуино

пей пиво Оболонь.