Распределение зажигания на ATmega8

Вопросы настройки, программирования, прошивки микроконтроллеров и микросхем программируемой логики
Аватара пользователя
Steam
Грызет канифоль
Сообщения: 296
Зарегистрирован: Чт апр 19, 2007 15:27:28
Откуда: Мурманск, Россия
Контактная информация:

Распределение зажигания на ATmega8

Сообщение Steam »

Доброе время суток!
Разрабатываю устройство для распределения зажигания для 6-ти цилиндрового двигателя внутреннего сгорания.
Мною была начата тема в разделе "Теория" http://radiokot.ru/forum/viewtopic.php?f=21&t=50763 и в ходе обсуждения я пришёл к выводу, что удобнее и проще делать на МК.
Единственный МК, который оказался у меня в наличии ATmega8. Пользуюсь пакетом WinAVR.

На входе МК сигнал с датчика положения коленчатого вала (синусоида с синхроимпульсами в виде той же синусоиды с частотой в 2 раза меньшей):
Изображение
Амплитуда от 0.5 В до 250 В на максимальных оборотах (6 000 об/мин).

Так же ещё будет сигнал с датчика массового расхода воздуха (аналоговый сигнал).

Пока собираюсь только разобраться с датчиком коленвала.

Сигнал с датчика коленвала подаю на компаратор, получаю прямоугольный ипмпульсы, которые подаю на вход ICP1 МК. Для измерения длительности импульсов использую Input Capture Unit 1-ого таймера (срабатывание на нисходящем фронте). Изначально таймер выключен (на МК подаётся питания при повороте ключа в положение "зажигание"), при попадании первого нисходящего фронта на входе включается таймер (считаю что вполне подходит деление тактовой частоты процессора на 8 ).

Код прерывания:

Код: Выделить всё

ISR(TIMER1_CAPT_vect)
{
   unsigned int capture = ICR1;
   TCNT1 = 0x0000;   
   
   if (bit_is_clear(TIFR, TOV1))         // Если таймер не был переполнен, то продолжаем
   {
      if (TCCR1B == 0x00)
      {
         TCCR1B |= _BV(CS11);         // Включение таймера, если он был выключен
      }
      else
      {
         if (lastImp == 0)
         {
            lastImp = capture;         // если это первый импульс, то лишь сохраняем его длительность
         }
         else
         {
            if (capture > 1.5 * lastImp)
            {
               toothNum = 0;         // синхроимпульс определяется по его периоду
               syncImp();
            }
            else
            {
               toothNum++;   
            }
         }
      }
   }
   else
   {
      TCCR1B = 0x00;                  // Если таймер был переполнен,
      TIFR |= _BV(TOV1);            // то чистим флаг и показания таймера
   }
}


И вот получается, что как-то долго этот код весь выполняется...

Изображение
После синхроимпульса проходит 31.1 мкс! много слишком! (тактовая частота 12 MHz)

Не подскажите как оптимизировать код? Я вот вообще думаю, что придется писать на ассемблере эту часть.

P.S. Исходный код на Си в приложении

надо бы как-нибудь избавиться от умножения...
Вложения
main.c
исходный код
(1.67 КБ) 206 скачиваний
Гальваническое сопротивление - это восстание батареек
kison
Первый раз сказал Мяу!
Сообщения: 29
Зарегистрирован: Ср апр 13, 2011 17:23:12

Re: Распределение зажигания на ATmega8

Сообщение kison »

Steam писал(а):И вот получается, что как-то долго этот код весь выполняется...

Не подскажите как оптимизировать код? Я вот вообще думаю, что придется писать на ассемблере эту часть.

P.S. Исходный код на Си в приложении

надо бы как-нибудь избавиться от умножения...

Код: Выделить всё

//if (capture > 1.5 * lastImp) 
if (capture > (lastImp+(lastImp>>1))
Аватара пользователя
Kavka
Мудрый кот
Сообщения: 1810
Зарегистрирован: Чт июн 10, 2010 08:55:35
Откуда: Сибирские Афины

Re: Распределение зажигания на ATmega8

Сообщение Kavka »

Steam писал(а):Пользуюсь пакетом WinAVR.

В общем случае при использовании плавающей точки полезно подключать математическую библиотеку.
Когда уже ничего не помогает - прочтите, наконец, инструкцию.
Лучший оптимизатор находится у вас между ушей. (Майкл Абраш, программист Quake и QuakeII)
Избыток информации ведёт к оскудению души - Леонтьев А. (сказано в 1965 г.)
Аватара пользователя
radio-kot
Собутыльник Кота
Сообщения: 2584
Зарегистрирован: Вт сен 14, 2010 10:27:19

Re: Распределение зажигания на ATmega8

Сообщение radio-kot »

Steam писал(а): надо бы как-нибудь избавиться от умножения...
вместо умножения на 1.5 надо сдвигом поделить на 2 и результат сложить с делимым.

Можно использовать таблицу. Тоже быстро.

Рекомендую вам использовать ATmega128 а если обязательно DIP то хотябы мегу32 или 16.

Еще - надо несколько импульсов пропустить (момент начала кручения очень нестабилен), затем по нескольким замерить период.
Последний раз редактировалось radio-kot Ср июл 13, 2011 09:09:53, всего редактировалось 1 раз.
Будете проходить мимо- проходите!
Аватара пользователя
ARV
Ум, честь и совесть. И скромность.
Сообщения: 18544
Зарегистрирован: Чт дек 28, 2006 08:19:56
Откуда: Новочеркасск
Контактная информация:

Re: Распределение зажигания на ATmega8

Сообщение ARV »

я дико извиняюсь: а что это за датчик такой в автомобиле, что выдает аж 250 вольт?!
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...

Мой уютный бложик... заходите!
Аватара пользователя
radio-kot
Собутыльник Кота
Сообщения: 2584
Зарегистрирован: Вт сен 14, 2010 10:27:19

Re: Распределение зажигания на ATmega8

Сообщение radio-kot »

Датчик положения колен вала - ДПКВ

Кстати это указано прямо над картинкой сигнала. :))

Можно использовать atmega168 DIP-28 ( заказать по почте недорого ) на 20 МГц. :beer:
Будете проходить мимо- проходите!
Аватара пользователя
ARV
Ум, честь и совесть. И скромность.
Сообщения: 18544
Зарегистрирован: Чт дек 28, 2006 08:19:56
Откуда: Новочеркасск
Контактная информация:

Re: Распределение зажигания на ATmega8

Сообщение ARV »

если это оно http://2a2.ru/esud/d_pkv1.html то я удивлен... в характеристиках нагрузка датчика почему-то разная для минимума и максимума напряжений... а если взять нагрузку 10К - на ней тоже 250 вольт будет?!
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...

Мой уютный бложик... заходите!
Аватара пользователя
radio-kot
Собутыльник Кота
Сообщения: 2584
Зарегистрирован: Вт сен 14, 2010 10:27:19

Re: Распределение зажигания на ATmega8

Сообщение radio-kot »

ЭДС, внутрен и нагрузочное сопротивл, закон ома. Калькулятор.
Будете проходить мимо- проходите!
Аватара пользователя
ARV
Ум, честь и совесть. И скромность.
Сообщения: 18544
Зарегистрирован: Чт дек 28, 2006 08:19:56
Откуда: Новочеркасск
Контактная информация:

Re: Распределение зажигания на ATmega8

Сообщение ARV »

по алгоритму:
во-первых, не надо останавливать таймер, обнулять его счетчик. надо при каждом прерывании по синхроимпульсу определять разность между ТЕКУЩИМ значением ICR1 и ПРЕДЫДУЩИМ (т.е. от предыдущего прерывания).
во-вторых, не надо делать анализ "первое прерывание или не первое" - т.к. импульсы следуют постоянно и с большой частотой, то ошибка вычисления единственного первого импульса никак не скажется на работе устройства
в-третьих, в прерывании не надо никаких вычислений делать, тем более умножений/делений, и тем более с плавающей точкой! взяли ICR1, вычислили разность, проверили флаг переполнения (если нужно - хотя, скорее всего, не нужно), сохранили разность куда-то и все. в совновном цикле затем вычисляем все эти параметры по полученной разности.

все это в общих чертах, конечно... не догма
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...

Мой уютный бложик... заходите!
Аватара пользователя
ARV
Ум, честь и совесть. И скромность.
Сообщения: 18544
Зарегистрирован: Чт дек 28, 2006 08:19:56
Откуда: Новочеркасск
Контактная информация:

Re: Распределение зажигания на ATmega8

Сообщение ARV »

radio-kot писал(а):ЭДС, внутрен и нагрузочное сопротивл, закон ома. Калькулятор.
ну-ка ну-ка, поясните, как это при помощи калькулятора ИЗМЕНЯЕТСЯ нагрузка? ;) написано в ТТХ:
- минимальное напряжение на нагрузке 10К - 0,2 вольта
- максимальное на нагрузке 100К - 250 вольт.

вопрос: какой идиот измеряет и нормирует параметры НА РАЗНЫХ нагрузках? при работе что, нагрузка меняется? каклькулятор ни при чем
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...

Мой уютный бложик... заходите!
Аватара пользователя
radio-kot
Собутыльник Кота
Сообщения: 2584
Зарегистрирован: Вт сен 14, 2010 10:27:19

Re: Распределение зажигания на ATmega8

Сообщение radio-kot »

Наверно измерял не идиот а сотрудник которому поручили это сделать.

Почему нельзя приводить параметры для разной нагрузки, что тут удивительного ?

Вот такие данные они решили опубликовать. Их право. И думаю сделано грамотно.

Вот их послание разработчику:

Если входное не менее 10 кОм можете быть уверены в получинии сигнала не менее 200 мВ

Если входное не превышает 100 кОм можете быть уверены что напруга не превысит 250 вольт
Будете проходить мимо- проходите!
Аватара пользователя
ARV
Ум, честь и совесть. И скромность.
Сообщения: 18544
Зарегистрирован: Чт дек 28, 2006 08:19:56
Откуда: Новочеркасск
Контактная информация:

Re: Распределение зажигания на ATmega8

Сообщение ARV »

radio-kot писал(а):Почему нельзя приводить параметры для разной нагрузки, что тут удивительного ?
гм... ну как бы здравый смысл подсказывает, что, например, приводить параметры гальванического элемента на нагрузке 0,0001 Ома - глупо, хотя законы физики не нарушаются... или писать о мощности лампы накаливания при питающем напряжении 1 вольт, хотя рабочее у нее 220...
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...

Мой уютный бложик... заходите!
Аватара пользователя
radio-kot
Собутыльник Кота
Сообщения: 2584
Зарегистрирован: Вт сен 14, 2010 10:27:19

Re: Распределение зажигания на ATmega8

Сообщение radio-kot »

Я давно подозревал что в БОШЕ сборище идиотов работает.
Будете проходить мимо- проходите!
Аватара пользователя
ARV
Ум, честь и совесть. И скромность.
Сообщения: 18544
Зарегистрирован: Чт дек 28, 2006 08:19:56
Откуда: Новочеркасск
Контактная информация:

Re: Распределение зажигания на ATmega8

Сообщение ARV »

radio-kot писал(а):Я давно подозревал что в БОШЕ сборище идиотов работает.
прошу показать, как вычислить максимальное напряжение с датчика на нагрузке 10К.
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...

Мой уютный бложик... заходите!
Аватара пользователя
radio-kot
Собутыльник Кота
Сообщения: 2584
Зарегистрирован: Вт сен 14, 2010 10:27:19

Re: Распределение зажигания на ATmega8

Сообщение radio-kot »

Неужели непонятно ? Вроде по-русски написано выше.

radio-kot писал(а): Если входное не превышает 100 кОм можете быть уверены что напруга не превысит 250 вольт


Или вы не можете решить что больше 10 или 100 ? :))

Указаны граничные значения параметров для проектирования интерфейса.
Будете проходить мимо- проходите!
Аватара пользователя
ARV
Ум, честь и совесть. И скромность.
Сообщения: 18544
Зарегистрирован: Чт дек 28, 2006 08:19:56
Откуда: Новочеркасск
Контактная информация:

Re: Распределение зажигания на ATmega8

Сообщение ARV »

мне не нужны граничные, у меня нагрузка 10К, я должен точно знать, какое напряжение будет в максимуме, чтобы рассчитать защитные цепи правильно. КАК?
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...

Мой уютный бложик... заходите!
Аватара пользователя
radio-kot
Собутыльник Кота
Сообщения: 2584
Зарегистрирован: Вт сен 14, 2010 10:27:19

Re: Распределение зажигания на ATmega8

Сообщение radio-kot »

ТРЕТИЙ раз повторяю !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!

Ваша нагрузка не превышает 100 кОм значит напряжение на датчике не превысит 250 вольт.

Вам этого не достаточно для расчета зашиты ?

Инженеру этого достаточно - он сделает вход системы неубиваемым 300 вольтами и 250 вольт его ни как не убьет.

Резистор последвательно и два встречно параллельных диода 4148 шунтом. :beer:

=================

Очевидно что никак вы не сможете по ним вычислить конкретное значение. Так как датчик генерит вместе с диском, а диски бывают разными.

На лампе написано 100 Вт при 230 вольтах. Как рассчитать ее мощность при 210 вольтах ? По данным производителя на лампе - никак. Только измерить и посчитать.
Будете проходить мимо- проходите!
Аватара пользователя
ARV
Ум, честь и совесть. И скромность.
Сообщения: 18544
Зарегистрирован: Чт дек 28, 2006 08:19:56
Откуда: Новочеркасск
Контактная информация:

Re: Распределение зажигания на ATmega8

Сообщение ARV »

граничные условия даются в виде РАМОК, а не двух углов. например, область безопасной работы полевика - это именно ОБЛАСТЬ на графике, и любая конкретная точка внутри него может быть использована для нужд разработчика. если бы производители полевиков рассуждали точно так же, как разработчики датчика, то они могли бы написать: при напряжении 1 вольт допустим ток 100 ампер. при напряжении 10 вольт - 15 ампер, и на этом ограничиться. однако, из этих данных не следует, что при напряжении 5 вольт будет допустим ток 50 ампер - он остается неизвестным и НЕОПРЕДЕЛИМЫМ. поэтому я и сказал, что подобный подход - глупость. правильнее было бы указать ГРАНИЦЫ так: при нагрузке 10К минимальное напряжение 0,2 вольта, максимальное 100 вольт. при нагрузке 100К минимальное 1,5 вольта, максимальное 250. всяко лучше это
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...

Мой уютный бложик... заходите!
Аватара пользователя
radio-kot
Собутыльник Кота
Сообщения: 2584
Зарегистрирован: Вт сен 14, 2010 10:27:19

Re: Распределение зажигания на ATmega8

Сообщение radio-kot »

Этих данных нет так как диски бывают разными, поэтому их и не публикую.

А главное они и не нужны инженерам автомобильным.
Будете проходить мимо- проходите!
Аватара пользователя
radio-kot
Собутыльник Кота
Сообщения: 2584
Зарегистрирован: Вт сен 14, 2010 10:27:19

Re: Распределение зажигания на ATmega8

Сообщение radio-kot »

ARV писал(а):граничные условия даются в виде РАМОК, а не двух углов.
Вы своим глазам не верите ?

Очевидно что и так вот дают граничные условия. Они же даны ИМЕННО ТАК.

Дана прямоугольня область в которой лежит сигнал датчика в стстеме координат "сопротивление нагрузки" - "напряжение".

Мне они абсолютно ясны и морю автопризводителей использующих эти датчики тоже ясны.

Для разработки интерфеса абсолютно достаточны:

Интерфейс не должен повреждаться сигналом "250 вольт + запас" и должен уверено распознавать сигнал от 200 мВ, должен иметь входное сопротивление от 10 до 100 кОм

Какие еще данные нужны ? Никаких.
Будете проходить мимо- проходите!
Закрыто

Вернуться в «Микроконтроллеры и ПЛИС»