Подключение форсунки к порту прерывания
- Войдите на сайт для отправки комментариев
Сб, 29/01/2022 - 00:05
Подскажите пожалуйста, как узнать время впрыска по прерыванию,
Определил пин для подключения, дальше не знаю...надо как то через micros ()
attachInterrupt(2, injector, RISING);
void injector() { //измеряем частоту на форсунке micros(); }
У любого интервала есть две точки - начало и конец. Ваш код выше запускает прерывание только при одном условии, а не при двух. Этого недостаточно.
Подумайте сначала, как вы сможете отличить начало впрыска от конца (по каким сигналам). а когда придумаете - просто замерьте разницу микрос между этими двумя отметками.
вот думаю , не могу придумать )
вот думаю , не могу придумать )
я вас не про программирование спрашиваю, а про технику. Как вы на моторе (или где у вас там форсунка) собираетесь засекать моменты начала и конца впрыска?
И какой там, кстати, примерно интервал?
ну как ток запустится двигатель. поступит сигнал с ЭБУ, с этого момента и засекать .... интервал ну это мне и узнать надо. вот накидал по аналогии как высчитывают прерывания спидометра , тахометра....
спасибо, в коде бы показать ))
код для тахометра нерабочий... ну фиг с ним.
третий (и последний) раз повторяю вопрос
В тахометре вы засекаете время между импульсами. А в форсунке вы что собрались засекать? Так, как в тахометре, для форсунки работать не будет, так вы сможете засечь интервал МЕЖДУ ВПРЫСКАМИ, а не сам впрыск.
Давайте, не ленитесь. попробуйте сделать усилие. Если нет - я спать пойду.
Код для тахометра не рабочий, да, потому что это не весь от него )
в форсунке хочу замерить время в течении которого форсунка открыта...
Сигнал поступил fr=1; -> Стартуем micros() , как ток сигнал меняется fr=0; (форсунка закрыта), записываем время time = micros(); в течении которого она была открыта....
Такая логика?
Такая логика?
Сигнал поступил fr=1; -> Стартуем micros() , как ток сигнал меняется fr=0; (форсунка закрыта), записываем время time = micros(); в течении которого она была открыта....
Такая логика?
ну почти... Только не "сигнал поступил", а сначала "сигнал изменился вверх" (форсунка открытв), а потом "сигнал изменился вниз" (закрыта). То есть ключевое то, что вы ловите не сам сигнал, а его изменения. И изменения вам нужны два разных, противоположных по знаку. Поэтому одним прерыванием тут не обойтись, нужно два, одно по подьему. другое по спаду.
Правда, посмотрев ваш код тахометра, я не думаю что вы напишете. По крайней мере не сами.
Интересно, а дребезг при включении форсунок бывает?
Ладно не ждите, идите спать, я тоже, не могу сообразить.... Как отобразить в коде ...
не знаю, вначале надо подключить и получить данные, время открытия )
Ладно не ждите, идите спать, я тоже, не могу сообразить.... Как отобразить в коде ...
и не сообразите. Вы для себя слишком сложную задачу поставили.
не знаю, вначале надо подключить и получить данные, время открытия )
можно без ардуины - возьмите осциллограф, заведите сигнал на него - импульс вы увидите прямо на экране. Там и замерить можно
у меня нету таких приборов
про измерение интервалов прерываниями посмотрите примеры в ветке по ссылке - примерно начиная с 40х сообщений и дальше. Только боюсь это сложновато для вас
http://arduino.ru/forum/pesochnitsa-razdel-dlya-novichkov/chtenie-shim-5-kgts
жестко там.... )
не знаю будет это работать на ардуине, самому интересно.))
p.s. да тут как то надо первый импульс правильно поймать а то мерять будем не то
шо то я не пойму, нафига его ловить, как придет сам так и начинать.... ) В смысле что с запуском двигателя появится импульс... Я не догоняю, что не так с моим вариантом ))
При получении импульса на входе с прерыванием, срабатывает void injector(). В обработчике из текущего значения системного таймера "micros()" отнимается предыдущее значение этого таймера, записанное в переменную micros_fr. Таким образом мы получаем время между импульсами, то бишь период, в микросекундах.
void loop() {
у тебя прерывание вызывается по изменению ножки с LOW на HIGH, ты считаешь период между импульсами, а не их длительность.
а я исходил из этого
Подскажите пожалуйста, как узнать время впрыска по прерыванию,
У stm32 есть режим таймера, когда когда он считает только при разрешении по входу. Этот режим используют для определения времени открытия форсунок. При закрытии входа - пропадании сигнала на форсунке, идёт прерывание, в котром можно считать величину и обнулить счётчик для следующего использования. Опять тема про правильный выбор МК под задачу.
и называется он pwm input mode, там только таймер правильно настроить и все, потом считывай два регистра с периодом и длительностью, люблю я stm-ки, а вот в отмеге даже не заю отчего таймеры тикают, подозреваю от одного источника.
а проверить пин на сигнал (LOW_HIGH) не вариант?
Автор, всё конечно хорошо, узнаете вы это время впрыска. Расскажите нам, что дальше вы будете делать с этим временем ? Или это просто хочу увидеть своими глазами который сейчас час)))). Любое измерение нужно, чтобы делать какой то вывод. Какой вывод вы будете делать, и как в дальнейшем будете использовать результат?
Я не догоняю, что не так с моим вариантом ))
При получении импульса на входе с прерыванием, срабатывает void injector(). В обработчике из текущего значения системного таймера "micros()" отнимается предыдущее значение этого таймера, записанное в переменную micros_fr. Таким образом мы получаем время между импульсами, то бишь период, в микросекундах.
вот именно, что не догоняете...
так вы получите именно время между импульсами, а вам нужна ширина импульса
Если считать. что на этой картинке осциллограмма работы форсунки, то длительность впрыска здесь обозначена как "ширина импульса". А ваш код измерит величину "один период", которую на моторе-то и мерить не надо, она и так известна.
и называется он pwm input mode, там только таймер правильно настроить и все, потом считывай два регистра с периодом и длительностью, люблю я stm-ки, а вот в отмеге даже не заю отчего таймеры тикают, подозреваю от одного источника.
СТМ конечно хорошо, но вообще задачка элементарно решается и на АВР, всего-то надо вовремя переключить прерывание с RAISING на FAILING. Я в #16 дал ссылку на ветку, где мы когда изгалялись, измеряя скважность ШИМ на атмеге. Там кода-то 15 строчек...
Правильный вопрос, а что дальше делать? STM не тратит время на измеренее. Сразу имеет ширину впыска и можем с ней работать - рассчитывать что надо и картинки рисовать.
У меня arduino mega, необходимо все это для того, чтобы в последующем вычислить расход топлива
Хм... за иллюстрацию спасибо , буду думать )
длительность впрыска здесь обозначена как "ширина импульса"
Почему вы решили, что это так? Форсунку можно отнести к механическим устройствам, у которой есть время открытия и время закрытия. Я в своё время смотрел осцилом на бэхах, так там именно периодом была регулировка количества подаваемого топлива. При этом ширина импульса была константой. И разработчиков можно понять, При одинаковой ширине импульса форсунка пропустит выверенный империческим путём объём топлива. А далее всё просто, ну вы поняли.
Для такой банальной задачи прерывания не нужны - http://arduino.ru/Reference/PulseIn
Почему вы решили, что это так? Я в своё время смотрел осцилом на бэхах, так там именно периодом была регулировка количества подаваемого топлива. При этом ширина импульса была константой.
тут спорить не буду, может и так. Я просто предположил.
Я ТРИ РАЗА добивался от ТС ответа, как именно он собирается измерять длительность впрыска. То что он в итоге ответил, было ближе к моей трактовке, чем к вашей.
Хотя из диалога очевидно, что ТС сам не знает, как это устроено и доверять ему нельзя
А ещё не нужно забывать - что мы понятия не имеем о каких именно форсунках речь. Я открыл Гугл и диву дался, насчитал минимум четыре варианта. И везде есть свои особенности, которые важно учитывать для расчета времени впрыска.
Возможно, это поможет, только это датчик скорости.
Не забываем что форсунка это индуктивность и там не прямоугольные импульсы, а с всплеском до 80...100в из-за самоиндукции. Я к тому что аппаратно нужно это учитывать
длительность впрыска здесь обозначена как "ширина импульса"
Почему вы решили, что это так? Форсунку можно отнести к механическим устройствам, у которой есть время открытия и время закрытия. Я в своё время смотрел осцилом на бэхах, так там именно периодом была регулировка количества подаваемого топлива. При этом ширина импульса была константой.
А период не связан с числом оборотов двигателя?
Период между сериями импульсов связан. А за каждый такт впрыска может выдаваться несколько импульсов на форсунку.
Я детально не разбирался, но по тому что в гугле нашёл - исполнения форсунок есть разные, но учитывать и что вы сказали тоже нужно. Короче тз не полное ))
У меня arduino mega, необходимо все это для того, чтобы в последующем вычислить расход топлива
Это утопическая идея. Во первых форсунки засоряются, и начинают пропускать меньше топлива. Во вторых компрессор создающий давление в топливной магистрали так же может работать нестабильно.
Расход топлива измеряют ультразвуковыми датчиками. В который раз повторю,- не лезьте в электронику авто, это может приводить к серьёзным авариям. Если хотите что то устанавливать, то только внешнее, максимум напряжение с аккумулятора, а то и он свой.
Ну, вообще говоря, форсунка может быть и емкостью. Но в этом случае импульсы все равно не прямоугольные, да и всплески могут быть.