Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Atmega8 - контроль по тахометру
Форум разработчиков электроники ELECTRONIX.ru > Микроконтроллеры (MCs) > AVR
Jipper
Машина ВАЗ 2110. Делаю автозапуск на atmega8. При написании кода на СИ зашел в тупик, а именно при написании алгоритма контроля работы двигателя по тахометру. Сигнал буду брать с приборной панели с контакта, приходящий от ЭБУ.
Счетчик 16-битный, тактовая частота контроллера 4МГц, предделитель 64(может можно взять другой). Алгоритм такой: Стартером начинает крутить двигатель и как только двигатель завелся обороты поднимаются и нужно отпустить стартер. Предлагаю, при первом получении импульса с ЭБУ на тахометр, запускать счетчик и считать до тех пор, пока он не насчитает некое число(которое соответствует 400об/мин) между импульсами. Как только он насчитывает больше - отпускать стартер и переходить к контролю работы двигателя. Контроль заключается в следующем: Счетчик считает между импульсами и сравнивает полученное значение с условием( если например кто то нажал на педаль газа и обороты повысились выше 2000 об/мин). Если условие выполнилось - машина глохнет.
Подскажите как это организовать грамотно? Я только начинаю осваивать это все, без помощи трудновато написать самому

pfc
запоминаешь счётчик между импульсами холостого хода прогретого двигателя. При запуске если счётчик меньше запомненного - отпускаешь стартер.
Jipper
Цитата(pfc @ Mar 2 2015, 15:42) *
запоминаешь счётчик между импульсами холостого хода прогретого двигателя. При запуске если счётчик меньше запомненного - отпускаешь стартер.


Это я понимаю, а как это будет выглядеть в коде?
megajohn
Цитата(Jipper @ Mar 2 2015, 10:36) *
Подскажите как это организовать грамотно? Я только начинаю осваивать это все, без помощи трудновато написать самому


а классически не катит ?!
Код
starter_on();

for( int tout_s = 100; tout_s; tout_s-- )
{
   measure_start();
   wait_1sec();
   int impulses = measure_stop();
   if( impulses > 2000 )
      break;
}
starter_off();

void measure_start()
{
  timer_clear();
  timer_start();
}

int measure_stop()
{
  timer_stop();
  return timer_value();
}
alexeyv
У меня возникли следующие вопросы/замечания к Вашему проекту:
1. Как вы будете обходить иммобилайзер/сигнализацию?
2. Необходимо предусмотреть ограничение на время работы стартера (не более 10 сек), а также время простоя между попытками (более 30 сек)
3. Насколько я помню, для заводки а/м не достаточно крутить ТОЛЬКО стартером, минимум необходимо включить бензонасос
4. Я бы еще контролировал напряжение на АКБ, а то можно добиться полного разряда
5. Ну я надеюсь вы предусмотрели развязку между мегой и стартером
6. То что Вы не хотите купить сигналку с автозапуском и смонтировать ее на а/м, я понимаю - хотите сами разобраться..........
Jipper
Отвечу по всем вопросам)
1. Иммобилайзера нету, как обойти сигналку я уже сделал.
2. все временные задержки тоже в коде будут
3. Включаю зажигание и кручу стартер(как будто ключом завожу)
4. Вот это можно, чтобы автозапуск не сработал если на АКБ менее 10,5-11В
5. Развязка на 30А реле
6. Сигналку я купил с обратной связью в том году с мыслю что автозапуск нафиг не нужен, а сейчас что то загорелся желанием)
alexeyv
хорошо.
Я посоветую сделать так.
1. тахометр завести на пин внешнего прерывания, где сделать простой инкремент счетчика
2. включить таймер в режиме СТС примерно на 250/500 мсек
3. в основной программе, если подан сигнал включается реле стартера (напр выходной пин=1)
4. в прерывании таймера постоянно отслеживается показания тахометра (счетчик) и если он выше ЗНАЧЕНИЯ, то выключается реле стартера (соот выходной пин=0). после счетчик обнуляется
5. 400 об/мин - это мало, лучше контролировать 700..800 об/мин
Это процедура самого запуска

Есть еще основной алгоритм работы (упрощенный):
1. сидеть на связи и контролировать напряжение АКБ, температуру в салоне и на улице
2. Получив разрешение на запуск - отключить сигналку, проверить допустимые условия - напряжение, нейтраль на коробке передач, постановка на ручник, возможно температуру
3. включить главное реле и включить фары примерно на 10 сек
4. выключить фары и через примерно 10 сек пройти к процедуре запуска ДВС
5. При не успешной процедуре запуска, выключить стартер через 10 сек и подождать 30 сек, после - повторить запуск. Общее количество попыток - не более ТРЕХ
6. При успешном запуске - контролировать условия останова - температура ДВС, температура салона, время работы ДВС
7. При останове ДВС - включить сигналку

Jipper
Цитата(alexeyv @ Mar 3 2015, 09:51) *

Все что Вы описали это я и так учитываю..
Я делаю процедуру выхода из машины(поднят ручник, выключено зажигание-двигатель продолжает работу, ввыхожу из машины и ставлю на сигналку - двигатель глохнет, разрешение на автозапуск есть)
по части автозапуска я делаю так: по доп каналу сигнализации(открытие багажника) поступает сигнал на МК, замыкаю концевик багажника(как будто он открыт, тем самым отключается датчик удара), обхожу все блокировки, включаю зажигание и моргаю дальним, включаю стартер - машина завотидся..
Мне нужно только разработать контроль работы двигателя и контроль запуска. С таймерами и счетчиками пока только на Вы, поэтому трудности))
Jipper
Цитата(megajohn @ Mar 2 2015, 21:49) *
а классически не катит ?!
[code][/code]


Скажите пожалуйста этот код Вы сами написали или выдернули откуда то? мне бы полный вариант и чтоб понятней было, тяжело разобраться самому
Abell
Цитата(Jipper @ Mar 2 2015, 10:36) *
Предлагаю, при первом получении импульса с ЭБУ на тахометр, запускать счетчик и считать до тех пор, пока он не насчитает некое число(которое соответствует 400об/мин) между импульсами.

Все правильно, считать интервал между импульсами.
Цитата(Jipper @ Mar 2 2015, 10:36) *
Как только он насчитывает больше - отпускать стартер и переходить к контролю работы двигателя.

Когда насчитает меньше - тогда отпускать стартер. Больше частота - меньше период.
Jipper
Цитата(Abell @ Mar 6 2015, 11:22) *
Когда насчитает меньше - тогда отпускать стартер. Больше частота - меньше период.


Да, да.. это я и имел ввиду, чем выше обороты тем чаще импульсы проходят, соответственно между импульсами меньше насчитает. Алгоритм понятен, я не могу это реализовать в програмном коде.
Не могли бы Вы помочь?
Abell
megajohn уже помог, более чем sm.gif
Можно, например, использовать Т1 с прерыванием в режиме захвата по внешнему фронту laughing.gif
P.S. Кстати, всю эту систему надо будет еще отключать при ручном включении зажигания. alexeyv примерно все правильно посоветовал, только контролировать нейтраль и ручник надо ДО постановки на автозапуск.
Jipper
Abell,если бы этот код был более менее понятен, то вопросов не было бы)
Система будет отключаться автоматически,это предусмотрел уже
Abell
Jipper, конфигурацию таймера Т1 уже сделали?
Теперь разрешаем прерывания по переполнению и захвату.
Пишем функции обработки прерываний.
Если интервал между импульсами недопустимо велик - таймер переполняется, вызывается обработка прерывания по переполнению, это состояние ошибки.
Если импульс с тахометра пришел вовремя - вызывается прерывание по захвату, содержимое таймера сохраняется в регистре, функция обработки обнуляет таймер и сравнивает регистр захвата с предыдущим значением из предварительно заданной глобальной переменной.
Если результат больше - сохраняет регистр захвата в глобальную переменную.
Если результат намного меньше - двигатель завелся, стартер можно отпустить.
Как-то так, один из вариантов решения, если я все правильно понял и нигде не ошибся laughing.gif
Повторю - проверять состояние нейтрали, закрытых дверей и ручника надо ДО постановки на автозапуск, это тоже та еще задачка wink.gif
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.