Страница 1 из 2
Распределение зажигания на ATmega8
Добавлено: Вт июл 12, 2011 20:50:02
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. Исходный код на Си в приложении
надо бы как-нибудь избавиться от умножения...
Re: Распределение зажигания на ATmega8
Добавлено: Ср июл 13, 2011 01:20:22
kison
Steam писал(а):
И вот получается, что как-то долго этот код весь выполняется...
Не подскажите как оптимизировать код? Я вот вообще думаю, что придется писать на ассемблере эту часть.
P.S. Исходный код на Си в приложении
надо бы как-нибудь избавиться от умножения...
Код: Выделить всё
//if (capture > 1.5 * lastImp)
if (capture > (lastImp+(lastImp>>1))
Re: Распределение зажигания на ATmega8
Добавлено: Ср июл 13, 2011 08:27:40
Kavka
Steam писал(а):Пользуюсь пакетом WinAVR.
В общем случае при использовании плавающей точки полезно подключать математическую библиотеку.
Re: Распределение зажигания на ATmega8
Добавлено: Ср июл 13, 2011 09:02:58
radio-kot
Steam писал(а): надо бы как-нибудь избавиться от умножения...
вместо умножения на 1.5 надо сдвигом поделить на 2 и результат сложить с делимым.
Можно использовать таблицу. Тоже быстро.
Рекомендую вам использовать ATmega128 а если обязательно DIP то хотябы мегу32 или 16.
Еще - надо несколько импульсов пропустить (момент начала кручения очень нестабилен), затем по нескольким замерить период.
Re: Распределение зажигания на ATmega8
Добавлено: Ср июл 13, 2011 09:08:59
ARV
я дико извиняюсь: а что это за датчик такой в автомобиле, что выдает аж 250 вольт?!
Re: Распределение зажигания на ATmega8
Добавлено: Ср июл 13, 2011 09:10:25
radio-kot
Датчик положения колен вала - ДПКВ
Кстати это указано прямо над картинкой сигнала.
Можно использовать atmega168 DIP-28 ( заказать по почте недорого ) на 20 МГц.

Re: Распределение зажигания на ATmega8
Добавлено: Ср июл 13, 2011 09:17:53
ARV
если это оно
http://2a2.ru/esud/d_pkv1.html то я удивлен... в характеристиках нагрузка датчика почему-то разная для минимума и максимума напряжений... а если взять нагрузку 10К - на ней тоже 250 вольт будет?!
Re: Распределение зажигания на ATmega8
Добавлено: Ср июл 13, 2011 09:22:16
radio-kot
ЭДС, внутрен и нагрузочное сопротивл, закон ома. Калькулятор.
Re: Распределение зажигания на ATmega8
Добавлено: Ср июл 13, 2011 09:23:07
ARV
по алгоритму:
во-первых, не надо останавливать таймер, обнулять его счетчик. надо при каждом прерывании по синхроимпульсу определять разность между ТЕКУЩИМ значением ICR1 и ПРЕДЫДУЩИМ (т.е. от предыдущего прерывания).
во-вторых, не надо делать анализ "первое прерывание или не первое" - т.к. импульсы следуют постоянно и с большой частотой, то ошибка вычисления единственного первого импульса никак не скажется на работе устройства
в-третьих, в прерывании не надо никаких вычислений делать, тем более умножений/делений, и тем более с плавающей точкой! взяли ICR1, вычислили разность, проверили флаг переполнения (если нужно - хотя, скорее всего, не нужно), сохранили разность куда-то и все. в совновном цикле затем вычисляем все эти параметры по полученной разности.
все это в общих чертах, конечно... не догма
Re: Распределение зажигания на ATmega8
Добавлено: Ср июл 13, 2011 09:31:23
ARV
radio-kot писал(а):ЭДС, внутрен и нагрузочное сопротивл, закон ома. Калькулятор.
ну-ка ну-ка, поясните, как это при помощи калькулятора ИЗМЕНЯЕТСЯ нагрузка?

написано в ТТХ:
- минимальное напряжение на нагрузке
10К - 0,2 вольта
- максимальное на нагрузке
100К - 250 вольт.
вопрос: какой идиот измеряет и нормирует параметры НА РАЗНЫХ нагрузках? при работе что, нагрузка меняется? каклькулятор ни при чем
Re: Распределение зажигания на ATmega8
Добавлено: Ср июл 13, 2011 09:37:14
radio-kot
Наверно измерял не идиот а сотрудник которому поручили это сделать.
Почему нельзя приводить параметры для разной нагрузки, что тут удивительного ?
Вот такие данные они решили опубликовать. Их право. И думаю сделано грамотно.
Вот их послание разработчику:
Если входное не менее 10 кОм можете быть уверены в получинии сигнала не менее 200 мВ
Если входное не превышает 100 кОм можете быть уверены что напруга не превысит 250 вольт
Re: Распределение зажигания на ATmega8
Добавлено: Ср июл 13, 2011 09:43:46
ARV
radio-kot писал(а):Почему нельзя приводить параметры для разной нагрузки, что тут удивительного ?
гм... ну как бы здравый смысл подсказывает, что, например, приводить параметры гальванического элемента на нагрузке 0,0001 Ома - глупо, хотя законы физики не нарушаются... или писать о мощности лампы накаливания при питающем напряжении 1 вольт, хотя рабочее у нее 220...
Re: Распределение зажигания на ATmega8
Добавлено: Ср июл 13, 2011 09:48:24
radio-kot
Я давно подозревал что в БОШЕ сборище идиотов работает.
Re: Распределение зажигания на ATmega8
Добавлено: Ср июл 13, 2011 09:51:41
ARV
radio-kot писал(а):Я давно подозревал что в БОШЕ сборище идиотов работает.
прошу показать, как вычислить максимальное напряжение с датчика на нагрузке 10К.
Re: Распределение зажигания на ATmega8
Добавлено: Ср июл 13, 2011 09:54:01
radio-kot
Неужели непонятно ? Вроде по-русски написано выше.
radio-kot писал(а): Если входное не превышает 100 кОм можете быть уверены что напруга не превысит 250 вольт
Или вы не можете решить что больше 10 или 100 ?
Указаны граничные значения параметров для проектирования интерфейса.
Re: Распределение зажигания на ATmega8
Добавлено: Ср июл 13, 2011 09:59:39
ARV
мне не нужны граничные, у меня нагрузка 10К, я должен точно знать, какое напряжение будет в максимуме, чтобы рассчитать защитные цепи правильно. КАК?
Re: Распределение зажигания на ATmega8
Добавлено: Ср июл 13, 2011 10:04:51
radio-kot
ТРЕТИЙ раз повторяю !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
Ваша нагрузка не превышает 100 кОм значит напряжение на датчике не превысит 250 вольт.
Вам этого не достаточно для расчета зашиты ?
Инженеру этого достаточно - он сделает вход системы неубиваемым 300 вольтами и 250 вольт его ни как не убьет.
Резистор последвательно и два встречно параллельных диода 4148 шунтом.
=================
Очевидно что никак вы не сможете по ним вычислить конкретное значение. Так как датчик генерит вместе с диском, а диски бывают разными.
На лампе написано 100 Вт при 230 вольтах. Как рассчитать ее мощность при 210 вольтах ? По данным производителя на лампе - никак. Только измерить и посчитать.
Re: Распределение зажигания на ATmega8
Добавлено: Ср июл 13, 2011 10:10:52
ARV
граничные условия даются в виде РАМОК, а не двух углов. например, область безопасной работы полевика - это именно ОБЛАСТЬ на графике, и любая конкретная точка внутри него может быть использована для нужд разработчика. если бы производители полевиков рассуждали точно так же, как разработчики датчика, то они могли бы написать: при напряжении 1 вольт допустим ток 100 ампер. при напряжении 10 вольт - 15 ампер, и на этом ограничиться. однако, из этих данных не следует, что при напряжении 5 вольт будет допустим ток 50 ампер - он остается неизвестным и НЕОПРЕДЕЛИМЫМ. поэтому я и сказал, что подобный подход - глупость. правильнее было бы указать ГРАНИЦЫ так: при нагрузке 10К минимальное напряжение 0,2 вольта, максимальное 100 вольт. при нагрузке 100К минимальное 1,5 вольта, максимальное 250. всяко лучше это
Re: Распределение зажигания на ATmega8
Добавлено: Ср июл 13, 2011 10:27:31
radio-kot
Этих данных нет так как диски бывают разными, поэтому их и не публикую.
А главное они и не нужны инженерам автомобильным.
Re: Распределение зажигания на ATmega8
Добавлено: Ср июл 13, 2011 10:33:08
radio-kot
ARV писал(а):граничные условия даются в виде РАМОК, а не двух углов.
Вы своим глазам не верите ?
Очевидно что и так вот дают граничные условия. Они же даны ИМЕННО ТАК.
Дана
прямоугольня область в которой лежит сигнал датчика в стстеме координат "сопротивление нагрузки" - "напряжение".
Мне они абсолютно ясны и морю автопризводителей использующих эти датчики тоже ясны.
Для разработки интерфеса абсолютно достаточны:
Интерфейс не должен повреждаться сигналом "250 вольт + запас" и должен уверено распознавать сигнал от 200 мВ, должен иметь входное сопротивление от 10 до 100 кОм
Какие еще данные нужны ? Никаких.