Инжектор (диплом) | OPPOZIT.RU | мотоциклы Урал, Днепр, BMW | оппозитный форум, ремонт и тюнинг мотоциклов
Home

Инжектор (диплом)

оппозитчик Hubster
чтоб поменять аватар - читай FAQ
нахождение: Челябинск, ул. Яблочкина

Друк мой Серг попал :):):) ибо так получилось что у него курсовой по микроконтроллерам и он выпросил у препода инжектор. (вернее только контроллер к нему), препод же услыша о такой благородой цели сказал что если он сделает работающий контроллер (ТОЛЬКО КОНТРОЛЛЕР БЕЗ МОТОЦИКЛА) то и диплом ему зачтет. так что появился офигеннейший стимул контроллер таки сдлеать.
как я уже где-то писал, проц Мега 162
в качестве АЦП для снятия показаний со всех устройств - одна микруха MAX 161

Hubster's picture

логика мегасквиртовская.... исходный код для мегасквирта я на их сайте взял (да простят меня разработчики) там в пояснениях вся логика расписана.
сижу вот, из тех блок-схем в CodeVisionAVR потихонечку пишу код. если кому интересно, буду выкладывать помаленьку.

то есть таблица 8*8 (обороты/показания MAP сенсора) для определения времени открытия форсунки
и поправки от угля открытия заслонки, Лямбда зонда, напряжения в сети

З.Ы. не надо писать сообщения типа "НАКУZ` ДНЕПРУ ИНЖЕКТОР".

ЖУЙ! Если карбурерных табуреток даже не выпускают уже, тогда на кой нам Оппозитчикам оставаться в каменном веке? Если специально разработанные системы стоят ожуеть как много(прям как первые тачки с индексом "i"), то самый доступный вариант СДЕЛАЙ САМ. Ну, или в этом случае ПРЕДЛОЖИ ТОВАРИЩУ ДИПЛОМНУЮ РАБОТУ(и сам ей пользуйся)

Hubster's picture

Данные аналоговые 1. Положение ручки газа/дроссельной заслонки
2. напряжение в сети
3. Показания Map-sensor
4. показания Лямбда зонда
5. Возможно показания второго лямбдазонда (для устранения неодинаковости форсунок) но это вряд-ли.

Данные цифровые - положение заслонки на распредвалу (обычный датчик холла и одна большая шторка в 180 градусов)

Датчик на маховике - стандартный индуктивный, 60-2 отверстий в маховике.

Итого нам желательно иметь 3 прерывания от внешних событий и 4 порта ввода вывода с 8 пинами для датчиков (а если использовать АЦП MAX 161 у него 8-канальный мультиплексор см тут http://www.gaw.ru/html.cgi/txt/doc/adc/adc_6.htm и нужно гораздо меньше проводков) AVR также программируется с COM-порта без всяких дополнительных программаторов, у него есть JTAG так что съэмулировать присутствие двигателя можно будет без особых проблем при наличии компа... плюс 4 счетчика два восьми и два шестнадцатиразрядных. и стоит это чудо 100 рублей. вот мы его и выбрали

Hubster's picture

всем мозг запудрил.цифровые данные в смысле логические.

Hubster's picture

в общем поправка от напряжения в сети. (предполагаем что форсунка механизм линейный и сила открывающая иглу зависит только от напряжения в сети, соответственно время которое тратится на закрытие - ее линейная функция)

inject_time=inject_time+(13.2-voltage)/13.2*inject_time;

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

Hubster's picture

коррекция от Лямбда-зонда осуществляется только в том случае когда обороты менее 4000 и скорость открывания дроссельной заслонки менее порогового уровня (типа газ открутил - нефиг об экономии жалеть)

как коррекцию осуществлять пока не знаю, наверное в зависимости от показания датчика буду прибавлять/убавлять переменную поправочную, (не будет выборки по таблице, сложно настраивать) правдаиз-за плавающей переменной запаздывание будет

Hubster's picture

Датчик детонации днепру/уралу не нужен. У меня и у Серга Днепры (11 у меня и 16 у него) степень сжатия 7, какая детонация при такой степени сжатия? кроме того датчик детонации срабатывает от шумов в цилиндрах а двигло и так шумное.

t и p масла зачем??? от них количество смеси не зависит никак... ДМРВ неплох конечно, у него точность выше чем у МАP сенсора, но датчик абсолютного давления позволяет осуществлять высотную коррекцию. я по горам ездить не собираюсь, но турбину от пылесоса можно будет ради прикола поставить. в этом случае ДМРВ будет давать неточные рез-ты.

нахрен мощнее блок? если я смогу купить этот АЦП вообще проблем не будет. он дорогой падла, 35 евров стоит, зато 8 каналов по 8 разрядов. где мне внешних устройств взять аналоговых, пока не знаю :)

на евро2 в России всем глубоко наплевать, это изврашшение какое-то. между прочим в мурзилке написано что Днепры-скрямблеры последнего выпуска (малая серия) с ДеллОртовскими карбами в Евро3 вписываются... вроде бы как. хрен с ним с нейтрализатором. ты бы еще рекуперацию тработаных газов посоветовал....

по датчику детонации спрсите у AlexeyZ. у него мегасквиртовский инж. этого датчика нету, детонации нет.

Hubster's picture

С МАХ161 я обломался... нету его. буду покупать AD7824 или AD7828. там 4х8 разрядов,как раз 4 устройства внешних. и стоит он у нас 526 рублей в розницу. это не 35 евров :)

с поправкой от напряжения я намудрил: меняю на вот это

inject_time=inject_time*(voltage)/13.2;

естественно абсолютные значения приведу к тому виду который будет выдавать АЦП, цифры это так, чтобы понятнее было. получается что прои падении напряжения до 6.5 вольт форсунка будет открыта в два раза дольше, при напряжении в 18 вольт в полтора раза меньше.

Возникает вопрос - влияет ли напряжение на электромагните форсунки на ее пропускную способность? ХЗ. к сожалению форсунки с бензонасосом насосом пока нету и поэкспериментировать не могу. если напряжение влияет только на скорость открытия, а не на пропускную способность, формулу прийдется изменить, и менять не все время открытия инжектора а только незначительную поправку к нему. то есть принимаем что с вазовскими форсунками на ХолостомХоду время открытия 2мс, при падении напряжения до 7 вольт будет 2.5 мс а не 4 мс например... жду ваших мнений.

Hubster's picture

размышляю также на тему распредеделенны впрыск или моновпрыск.

за моновпрыск - конструктивно проще. меньше вопросов типа в какой же цилиндр лить бенз. минусы то же что и при установке автокарба. чуть-чуть ошибся с направлением факела форсунки, в одном цилиндре смесь будет богаче, в другом беднее и тд.

распределенный впрыск - нужны впускные коллектора с отверстиями под форсунки, их нужно варить. я правда откопал две спинки хромированные от кровати. внутр диаметр 32 мм, и как раз изгибаются под 90 градусов. в отверстия впускного клапана влязят натягом. осталось выточить штуковину по форме повторяющую вид прокладки под карб только из металла и толщиной 7-8 мм. с болтиком фиксирующим. а в трубах отверстие и вварить кусок трубки под форсунку. но где мне станок фрезерный найти в нашем городе, пока не знаю. и варить не слишком толстую трубу я не возьмусь.We Need HELP!

Hubster's picture

некоторое время назад была Камасутра с дроссельной заслонкой. если брать Вазовскую, получится пробема аналогичная установке автокарба - как ее соединить с впускными коллекторами. в общем я решил принести в жертву свой запасной карбюратор Москвичевский... жалко его конечно, но что-то мне подсказывает что скоро и москвич прийдется распилить и сдать на металолом. в общем карб тщательно разобрали и выкинули из него все жиклеры, заслонку воздушню (это которые внизу, могу путать названия) оставили только верхнюю и сам корпус карба. металлнические вставки которые вставлениы в диффузоры чтобы обеспечить сужения сечения требуемое, выбил трубой и молотком. получилось нетчто,конструктивно не отличающееся от вазовской дроссельной заслонки, с возможностью привода от стандартного тросика, и одинакового размера отверстиями после заслонки. диаметр их примерно 35 мм, так что трубы 32 мм как раз туда входят. сегодня пойду в гараж делать фотографии этого устройства.

Hubster's picture

я не могу вставить картинки. у меня нет доступа к
.imageshack. :(

Зачем внешний АЦП, если в ATmega есть внутри? быстродействия, 8-ми каналов и 8 бит хватит. На сайте мегасквирта подробно описаны датчики, работа форсунок. ВАЗовские форсунки, те что у меня, имеют производительность около 140 мл/мин с родным регулятором давления. От напряжения зависит только время открытия, производительность=const. НЕ ШУНТИРУЙ ФОРСУНКУ ДИОДОМ!, от этого они "зависают" на большей частоте. Используй драйвер как у Сквирта, или как я TDF1778 и подобные. У меня фотки на "хомяке"- не изобретай велосипед. Конструкция рождена в долгих размышлениях. Но возможны и другие варианты.
Впрыск делай попарно-одновременный для диплома достаточно. Ну а если хочешь творить и времени достаточно... Кстати каботает устойчивей чем фазированый, пробовал и так.
Моторолловский асемблер легко перекладывается на "меговский" (есть опыт). Хотя я бы многое сделал по другому на Меге - форсунки аппаратно по таймеру, зажигание тоже возможно.
В общем много что могу рассказать, только писать лень :)
При <8 MIPS на моторолле и около 16 MIPS на меге, меги должно хватить, одно неудобство - в меге нет аппаратного деления, а в 908 есть... А оно довольно часто необходимо. Чтоб облегчить задачу я старался все подогнать к молулю 2^n, делится просто сдвигом.

Hubster's picture

Насчет велосипеда - тут почти все на этом сайте его изобретают. это же интереснее чем готовым решением воспользоваться :) А я вообще от микроконтроллеров далек, я же строитьел по образованию. добыл книгу по AVR сегодня, читаю, понял что можно встроеным обойтись. про время открытия уже до меня дошло. Форсунки собираюсь по таймеру открытыми держать.

кстати про заслонку - вазовская при полном ее закрытии все равно пропускает воздух через себя? (типа устройство холостого хода)?? москвичевскую мне нужно напильником похоже дорабатывать.. там щелей много... у дросселя. а у залонки количества смеси, которая внизу, проблема с приводом второй заслонки, а если оставить одну не знаю хватит ли ее пропускной способности

Hubster's picture

Попарно-одновременный в смысле поливать бензом закрытый клапан второго котла?

зачем аппаратное деление частоты? ну, пока что необходимости не увидел, возвожно позже встетится. я-то сейчас только алгоритмы на Си пишу, потом отдам все Сергу, пусть разбирается.

ИМХО стабилизатор напряжения форсунки от пониженного напряжения не спасет. генератор например умрет по дороге... поправка все равно нужна.

Обогащение смеси - у нас в холодное время не слишком-то поездишь, все равно больша часть зимы -15, 20 а в прошлую зиму до -40 температура падает. а условия заводки при +10 и при +20 не слишком отличаются. так что автоматическое предстартовое обогащение можно сделать кнопочное. хочу, нажал кнопку, форсунки чуть-чуть долше будут открыты. хотя вряд ли. сейчас не это главная проблема.

Hubster's picture

ну уж нет. никаких повышающи трансформаторов.
будет поправка на напряжение и все.

у 162 меги нету ацп. у 163 есть. у 323 есть. зато у 162 меги куча прерываний и 4 таймера.

Hubster's picture

заготовки заслонки тут.
http://photofile.ru/users/hubster/2314562/40700132/

и вообще все картинки сюда буду выкладывать

Hubster, насчет интереснее, это функция времени... f(t).

>>Попарно-одновременный в смысле поливать бензом закрытый клапан второго котла?

-Да. Пока клапан закрыт, причем горячий, половина порции топлива испаряется. Холостые 100% стабильнее.

>>зачем аппаратное деление частоты?

-а кто сказал "частоты"? посмотри систему команд. чтоб разделить 120 на 100 тебе потребуется подпрограмма или макрос. Я, вообще, говорю про Ассемблер, на Сях может и памяти не хватить...

Ну дерзай, раз такой самонадеяный :)

koren, форсунки работают и от 6 вольт, весь вопрос во времени открытия.

Hubster's picture

а, про деление понятно. я там старался где можно на целочисленную арифметику все заменить, правда там где интерполяция в таблице без деления будет не обойтись. вообще в компиляторе Си деление есть, а как он это там реализует, я не знаю. (это уже не моя проблема,сдвигом он его делает или хз.) Сейчас сижу, пишу эту штуку на Си. (ассемблера я не знаю)

AlexeyZ, интерес - функция времени?? может быть.

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

Hubster's picture

во всем процессе деление нужно только при интерполяции во время выборки из таблицы. а при 4х мегагерцах и 6000 оборотах за один цикл 80000 операций происходит. так что вполне меги может хватить. не хватит - кварц на 8 мегагерц куплю.

поправку на время открытия поменял с пропорции на таблицу из 16 значений. чтобы не делить.

поправку от лямбды с самого начала сделал плавающей, там практически целочисленная арифметика...

Yurik, у меня прошивка на базе Extra, так что у меня таблицы сейчас 12х12, особой разницы с 8х8 не заметил.
кСТАТИ, имея счастье видеть таблицы контроллера впрыска ДирГора, заметил их явное сходство с моими.

Hubster's picture

прочитал датащитт, там 2 таймера 16бтых и 2 8битных, времени свбодного у меги все равно будет куча, определение текущей фазы процесса по отверстиям в маховике, дырок 60-2, пропущенные отверстия за 90 градусов до ВМТ. правда насчет 90 градусов не знаю, пока что. маховик я разметил, но дыок пока не сверлил. про UART пока не думал. а выборка 8х8 или 12х12 по времени ненамного отличается.

На первой версии впрыска у меня было зажигание на ATmega8, все по зубьям. Другими словами, дискретность регулировки зажигания была 3 градуса, а погрешность (грубо) +-1,5 градуса.
Как вы думаете, заметен-ли момент переключения? Канечно нет! Т.е. ловить 1 градус, а тем более десятые - нездоровый максимализм.

Hubster's picture

как так 3 градуса если шаг зубов 6 градусов??
хочешь сказать что у тебя было всего 3 положения опережения(типо 6 градусов - низкие обороты, 12-средние, 18-высокие)? или я чего-то недопонял :(

Hubster's picture

Разбирался с таймерами. итого 16-ти разрядный обслуживает датчик положения коленвала. я правда пока не прочитал как узнать текщее содержимое таймера, но пришел к следующим выводам:

при 4 мегагерцахи коэфф. предделителяя таймера 64 счетчик работает с частотой 62500 герц, то есть весь таймер он перебирает за секунду, промежуток между двумя зубами на 6000 оборотах он посчитает как 10, на 600 оборотах как 100. остальное неиспользуется никак. по идее дискретности из 90 значений на рабочий промежуток оборотов должно мне хватить...

таймер восьмиразрядный при предделителе 256 перебирает свои 256 значений за 0,016384 секунды, а время впрыска колеблется от 0.002 до 0.015 так в статье Диргора про инжекторы написано. в общем лажа какая-то получается, грубо слашком. так что похоже прийдется брать 162 мегу с двумя таймерами по 16 разрядов или как-то еще обходиться. или два восьмиразрядных таймера последовательно соединять.

Hubster's picture

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

З.Ы. у меня CodeVisionAVR C Compiler, у него выставляется частота счетчика. (то есть предделитель там не указывается)

Hubster, при 60-2 1 зуб на 6 градусов, и соответственно через 3 градуса фронты. Очень удобно считать события, а не время.

Hubster's picture

такой вопрос назрел: если я например хочу открыть форсунку, будет ли работать такой способ - беру один из счетчиков который FFFF c прескалером 64, кварц у меня 8 мегагерц, тогда получается что когда счетчик досчитает до 125 проидет ровно 1 милисекунда (ну, 10 мс - 1250 соответственно), ну а таймер настроен что когда прерывание Compare_match с требуемым значением происходит, один из входов значение меняет на 0, форсунка закрывается, а таймер сбрасывается. ключи у меня такие-же как в мегасквирте.

З.Ы. Всем спасибо за помощь!

Hubster's picture

нет, я немного про другое говорю... я про само управление форсунками. можно ли к ним обращаться как так что ток подал - она открылась, убрал напряжение - закрылась, никаких особо хитрых алгоритмов нету?
П.С. скоро выложу результат того что на Си написал по поводу алгоритма работы самого инжектора (без коммуникации с компом, ее не я пишу)

Hubster's picture

помимо алгоритма надо еще собрать железо электронное и железо двигательное. ну к примеру заслонку от Тазика я купил позавчера за 1300, и бюджет на январь-февраль исчерпан :( пока что у меня кроме самого контроллера и пары микрух нету ничего... а дроссель еще нужно стыковать с патрубками которрые идут к бошкам и еще куча всего.. так что первый пуск будет нескоро, самое обидное что сам виновник торжества (у которого собственно диплом по этой теме, пока не чешется). диплом то только в сентябре, а так пока можно ничего не делать. (а я до недавнего времени микроконтроллеры на картинке видел :)) . у меня МАССА времени уходит на изучение Си и контроллеров вообще. да, еще проблема - скажите название эмулятора Атмелов какого-нибудь, в особенности Меги32). по поводу стыковки я обнаружил кстати что в выход заслонки с натягом влазит стандартный дезодорант, а еще у меня есть гнутая хромированная труба диаметром 32 мм, (по ходу дела раньше была спинкой советской кровати.) как все это стыковать, уже придумал, но нет сварки которая может такую тонкую сталь варить. у меня аппаратус размером с тумбочку и неепической мощностью. сет не выдерживает, поэтому им я не пользуюсь.

Hubster, если форсунки ВАЗ, можно просто открывать и закрывать напряжением. У них сопротивление около 10 Ом. Если меньше будет, или ШИМ или резистор последовательно. Открытие около 1 vc? поэтому просто прибавляй к времени открытия. Время открытия зависит от напряжения, поэтому делай коррекцию.

Возьми megasquirt.ASM от Мегасквирта, там с коментариями подробно описан алгоритм. По крайней мере разъяснит многое.

Hubster, Наверное банку от дезодоранта к кроватной дужке тежеловато будет приварить, но в принципе возможно. Только банка ведь еще и луженая. Надо будет лудь снять. Короче пиши реально что к чему приварить. Мы рядом. Так что приварим. И еще заслонка диаметром 45 мм переразмерена. Для Урала в самый раз на 40.

Hubster's picture

родичи лишили меня компа пока я в Ебурге был, так я остался без черновиков. сижу заново прогу переписываю. (бумажная копия сохранилась). форсунки решил просто открывать-закрывать. напряжением. мегаскфиртовскую прошивку нашел, разбираюсь.

по причине отсутствия компа занимался железом. в общем с другом пошли на авторынок и купили девайс который у каждого стритрейсера должен под подушкой лежать - насадка на выхлопную трубу с раздвоителем 2-из-одного. наружный диаметр большой трубы такой же как у дезодоранта, то есть с натягом влазит в выпускное отверстие заслонки. герметизации подвергается неплохо, минусы - длинная штуковина (15 см). также проблема изготовить затычку, перекрывающую вспомогательные отверстия (регулятор ХХ). отец пообещал мне помочь если что, но сомневаюсь что зэки ее смогут выточить. решил сделать ее из стеклопластика. (бумажный вариант распечатал, к заслонке приложил - подходит) если кому надо, картинки выложить могу. к головам крепление трубок - решил сделать через проставку аналогичную прокладке между головой и карбом. толщиной 10 мм. у трубку металлическую туда загнать и раскернить ее с той стороны или приврить, пока не знаю. железячки вроде к след. неделе выточат.

Hubster's picture

обломали меня с некоторыми детальками, а именно с штуковинами для крепелния впускных патрубков/форсункодержателей к головам. в итоге пошел в местный Влеомото и купил там стандартные переходники, (с горизонтального посадочного места на вертикальное) две штуки. они оказались аллюминивыми, так что некоторое время у меня ушло на то чтобы определить какой клей их клеит. в общем выясноилось что холодная сварка очень даже неплохо приклеивается к ним, особенно если поверхность обезжирить ацетоном и ошкурить. не уверен в том что от высокой температуры вся эта конструкция проживет достаточно времени, в общем опыт покажет.

скачал протеус 6.9.4, схему там нарисовал, пытаюсь отладить

вроде бы картинка

Hubster's picture

в общем, о алгоритмах:

nterrupt [EXT_INT0] void ext_int0_isr(void)
{
crank=1;
if (old_count*3<count) {
rpm=old_count;
phase=0;
count=0;
ignnotfired=0;
} если период между зубьями в три раза больше предудущего, значит начальная точка, переменная PHASE - текущая фаза процесса. (начальная точка за 30 градусов до ВМТ)

if (old_count*3>count) {
rpm=count;
old_count=count;
count=0;
phase++;
} а если период не изменился, то обычный зуб, инкрементируем переменную Phase. Count - счетчик времени между зубьями

if (phase>116) {
phase=0;
error=1;
}
} а если фазовая переменная превысила 116 и не сбросилась, то значит ошибка где-то, и не заметил контролер начала отсчета
(забыл сказать - прерывание ИНТ0 - датчик КВ)

interrupt [TIM0_COMP] void timer0_comp_isr(void)
{
проверка переполнения
if (count>65535) { слишком большой промежуток между зубьями
if (ft==1){ а если повторилось, значит
crank=0; //не крутится кранкшафт :)
count=0; //счетчик обнуляем
ft=0; флаг сбрасываем 0
}
if (ft==0){ а если в первый раз
count=0;
ft=1; выставляем флаг в 1
}
}

count++; а так вообще счетчик увеличиваем и увеличиваем. переполнение генерируется 125000 раз в секунду. для того чтобы на 6000 об мин времени как раз хватает считать.

З.Ы. заранее знаю что у меня тут ошибка. раньше я считал время между восходящими фронтами (начала зубов), потом AlexeyZ посоветовал насчет опережения зажигания не по времиени, а по событиям. в результате косяки есть с той частью проги которая за начало отсчета отвечает. в переменные count и old_count нужно какие-то средние значения записывать... в общем об этой проблеме я пока не думал.

Эта часть за УОЗ отвечает
if (rpm<138){ //обороты более 900
if (rpm<srpm_rpm_table[0]) {
UOZ=srpm_table[0];
}
if (rpm<srpm_rpm_table[1]) {
UOZ=srpm_table[1];
}
if (rpm<srpm_rpm_table[2]) {
UOZ=srpm_table[2];
}
if (rpm<srpm_rpm_table[3]) {
UOZ=srpm_table[3];
}
if (rpm<srpm_rpm_table[4]) {
UOZ=srpm_table[4];
}
if (rpm<srpm_rpm_table[5]) {
UOZ=srpm_table[5];
}
if (rpm<srpm_rpm_table[6]) {
UOZ=srpm_table[6];
}
if (rpm<srpm_rpm_table[7]) {
UOZ=srpm_table[7];
}

} По пороговым значениям оборотов выбираем УОЗ из таблички соответствующей. интерполяции нету, но можно впихнуть при желании числа в таблице - колво зубьев, которые нужно отсчитать прежде чем подать сигнал на катушку зажигания

if (rpm>138){ //при оборотах менее 900
if (tps<20) { //если ручка газа практически не выкручена

НЕ УСПЕЛ ПОКА ВПИХНУТЬ ПЛАВНОЕ РЕГУЛИРОВАНИЕ ОБРОТОВ ХХ при помощи УОЗ
}
if (tps>20) { //если газ выкручен, UOZ=28; фиксированный уоз мин оборотв.
}
}

if (phase>=UOZ){ // тут я хотел что если переменная фазу превысила значенпе которое в переменнгой UOZ находится, а факта зажигания не было, произвести зажигание, а флаг зажигания ignnotfired обнулить. а устанавливать его как раз при достижении КВ начала отсчета
if (ignnotfired) {
ЗАЖИГАНИЕ ВПИХНУТЬ. в Ногу 2 Порта С записать 1
ignnotfired=0;
}
}

Hubster's picture

про лямбдазонд

if (rpm>83) { обороты меньше 1500
goto skip_ego_correction; пропустить коррекцию (возможен холостой или принудительный хх)
}
if (warmup) {режим прогрева (t<40)
goto skip_ego_correction;
}
if (tps>175) {газ выкручен, опять пропуск
goto skip_ego_correction;
} итого лямбда коррекция только на средних оборотах про прогретом движке и не сильно выкрученном газе (крейсерский режим)

if (lambda<25) lambda_korr=lambda_korr+2; //Áåäíààÿ ñìåñü
if (lambda>25) lambda_korr=lambda_korr-2;
if (lambda_korr<-125) lambda_korr=-125;
if (lambda_korr>125) lambda_korr=125;

сделал ОЧЕНЬ примитивно по причине того что не знаю, смогу ли сделать нормальную выбрку по таблице. если напряжение превышает полвольта, смесь обедняется, если меньше полувольта, обогащается. 125 это в моих единицах примерно 1 мс
skip_ego_correction:{
lambda_korr=0;
}

Hubster's picture

исправил все глюки - теперь программка может даже роль электронного зажигания исполнять - /*****************************************************
This program was produced by the
CodeWizardAVR V1.25.1 Evaluation
Automatic Program Generator
© Copyright 1998-2006 Pavel Haiduc, HP InfoTech s.r.l.
http://www.hpinfotech.com

Project : HOPE
Version : 0.00
Date : 23.02.2007
Author : HUB
Company : HUB
Comments:
ignition module

Chip type : ATmega32
Program type : Application
Clock frequency : 8.000000 MHz
Memory model : Small
External SRAM size : 0
Data Stack size : 512
*****************************************************/

#include <mega32.h>

int rpm; //обороты
int ft; //код ошибки, флаг переполн. счетчика
unsigned int count,old_count; //счетчик периода коленвала
int phase; // текущ. фаза процесса, Max(Phase)=(Nзубов-Nпрпущенных)*2

// External Interrupt 0 service routine
interrupt [EXT_INT0] void ext_int0_isr(void)
{
//если старый период в полтора раза меньше нового (пропущ.зуб)
if ((old_count+old_count)>=count) {
rpm=count;
old_count=count;
phase++;
}

//если старый период в полтора раза больше нового- обычный зуб
else {
rpm=old_count;
phase=0;
old_count=count;
}

if (phase>116) {
phase=0;
}

count=0;

}

// External Interrupt 1 service routine
interrupt [EXT_INT1] void ext_int1_isr(void)
{
// Place your code here

}

// External Interrupt 2 service routine
interrupt [EXT_INT2] void ext_int2_isr(void)
{
// Place your code here

}

// Standard Input/Output functions
#include <stdio.h>

// Timer 0 output compare interrupt service routine
interrupt [TIM0_COMP] void timer0_comp_isr(void)
{
if (count>65535) {
if (ft==1){
count=0; //обнуляем счетчик
ft=0;
}
if (ft==0){
count=0; //обнуляем счетчик
ft=1; //флаг повторн. переполнения уст. в 1
}
}

count++; //счетчик инкрементируем.
}

unsigned char adc_data;
#define ADC_VREF_TYPE 0x20

// ADC interrupt service routine
interrupt [ADC_INT] void adc_isr(void)
{
// Read the 8 most significant bits
// of the AD conversion result
adc_data=ADCH;
}

// Read the 8 most significant bits
// of the AD conversion result
// with noise canceling
unsigned char read_adc(unsigned char adc_input)
{
ADMUX=adc_input|ADC_VREF_TYPE;
#asm
in r30,mcucr
cbr r30,__sm_mask
sbr r30,__se_bit | __sm_adc_noise_red
out mcucr,r30
// sleep
cbr r30,__se_bit
out mcucr,r30
#endasm
return adc_data;
}

// Declare your global variables here
int lambda0,lambda; //Лябда-переменные
int warmup; //прогрев
int ent,ent0; //температуры двигла
int voltage0,voltage; //напряжения в сети
int map0,map; //давление в коллекторе
int tps0,tps; //рукоять газа

void main(void)
{
// Declare your local variables here

// Input/Output Ports initialization
// Port A initialization
// Func7=In Func6=In Func5=In Func4=In Func3=In Func2=In Func1=In Func0=In
// State7=T State6=T State5=T State4=T State3=T State2=T State1=T State0=T
PORTA=0x00;
DDRA=0x00;

// Port B initialization
// Func7=In Func6=In Func5=In Func4=In Func3=In Func2=In Func1=In Func0=In
// State7=T State6=T State5=T State4=T State3=T State2=T State1=T State0=T
PORTB=0x00;
DDRB=0xFF;

// Port C initialization
// Func7=Out Func6=Out Func5=Out Func4=Out Func3=Out Func2=Out Func1=Out Func0=Out
// State7=0 State6=0 State5=0 State4=0 State3=0 State2=0 State1=0 State0=0
PORTC=0x00;
DDRC=0xFF;

// Port D initialization
// Func7=Out Func6=Out Func5=Out Func4=In Func3=In Func2=In Func1=In Func0=In
// State7=0 State6=0 State5=0 State4=T State3=T State2=T State1=T State0=T
PORTD=0x00;
DDRD=0xE0;

// Timer/Counter 0 initialization
// Clock source: System Clock
// Clock value: 8000.000 kHz
// Mode: CTC top=OCR0
// OC0 output: Disconnected
TCCR0=0x09;
TCNT0=0x00;
OCR0=0x40;

// Timer/Counter 1 initialization
// Clock source: System Clock
// Clock value: 8000.000 kHz
// Mode: CTC top=OCR1A
// OC1A output: Discon.
// OC1B output: Discon.
// Noise Canceler: Off
// Input Capture on Falling Edge
// Timer 1 Overflow Interrupt: Off
// Input Capture Interrupt: Off
// Compare A Match Interrupt: Off
// Compare B Match Interrupt: Off
TCCR1A=0x00;
TCCR1B=0x09;
TCNT1H=0x00;
TCNT1L=0x00;
ICR1H=0x00;
ICR1L=0x00;
OCR1AH=0x00;
OCR1AL=0x00;
OCR1BH=0x00;
OCR1BL=0x00;

// Timer/Counter 2 initialization
// Clock source: System Clock
// Clock value: 8000.000 kHz
// Mode: Normal top=FFh
// OC2 output: Disconnected
ASSR=0x00;
TCCR2=0x01;
TCNT2=0x00;
OCR2=0x00;

// External Interrupt(s) initialization
// INT0: On
// INT0 Mode: Rising Edge
// INT1: On
// INT1 Mode: Rising Edge
// INT2: On
// INT2 Mode: Falling Edge
GICR|=0xE0;
MCUCR=0x0F;
MCUCSR=0x00;
GIFR=0xE0;

// Timer(s)/Counter(s) Interrupt(s) initialization
TIMSK=0x02;

// USART initialization
// Communication Parameters: 8 Data, 1 Stop, No Parity
// USART Receiver: On
// USART Transmitter: On
// USART Mode: Asynchronous
// USART Baud rate: 9600
UCSRA=0x00;
UCSRB=0x18;
UCSRC=0x86;
UBRRH=0x00;
UBRRL=0x33;

// Analog Comparator initialization
// Analog Comparator: Off
// Analog Comparator Input Capture by Timer/Counter 1: Off
ACSR=0x80;
SFIOR=0x00;

// ADC initialization
// ADC Clock frequency: 1000.000 kHz
// ADC Voltage Reference: AREF pin
// Only the 8 most significant bits of
// the AD conversion result are used
ADMUX=ADC_VREF_TYPE;
ADCSRA=0x8B;

// Global enable interrupts
#asm("sei")
count=0;
old_count=0;
phase=0;
tps=3;
while (1)
{
PORTB=RPM
}
}

но по факту она пока что выводит в ПОРТВ обороты в двоичном виде. можно цифровой тахометр сделать. сейчас работаю над АЦП чтобы переменные аналоговые считывать в нужное время...

З.Ы. кто-нибудь может обмерить размеры форсунки от ВАЗ?? очень нужны. или сгоревшую мне по почте прислать :)

Ну давайте еще в ассемблере коды выложите, а то компилировать долго

Hubster's picture

Aquinax, а что тебя конкретно интересует? мы тут не торопимся, к маю наверное закончим то что с мозгами связано... пока что нечего выкладывать. все что появляется, рано или поздно оказывается тут. если надо, я тебе на мыло пришлю файлы протеуса (симулятора) и прошивку, посмотришь....

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

Hubster's picture

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

По наброскам схемы - НЕТУ схемы в железе. всю отладку делаю в Протеусе, и пока в нем не будет работать все как часы за железо даже браться не буду. кроме того, какие сложности в схеме могут быть? кроме контроллера там будет блок питания, бллок распознавания сигналов с индуктивного датчика, микруха для управления шаговым двигателем, и микросхема для управления форсунками.

По микросхемам - TA8025 распознавание сигналов с индуктивного датчика

TDF1778 (наверное) управление форсунками

UDN2916 (наверное) упарвление шаговым движком РХХ

это все про электронику. там самые большие проблемы. а про железо - как я уже писал, залонка от инжекторной десятки, раздвоитель на два цилиндра - из раздвоителя для глушителя. от него к бошкам - шланг от хитрого пылесоса. (обнаружил шланг, на металлическая спираль облитая чем-то вроде ПВХ. гнется очень хорошо, прочный, нет отверстий а главное внутренняя поверхность практически не ребристая) крепление форсунок не делал пока что ибо сильно занят.

Hubster, маладес! Этож грандиозная работа. Хотябы ничего специфичного. Но РС-232 немного как бы устаревший, как дискета в 3.5 дюйма. Был бы УСБ, да еще с возможностью подключения к ноуту для тонкой настройки.

Hubster's picture

Добрался до компа наконец-то. для RS-232 нужна одна микруха МАХ232 и все. в меге32 УСАРТ есть,так что связь по кому не представляет проблем. для УСБ надо что-о мудрить и лишние элементы в схему вводить. кроме того у меня есть 2 старых компа у которых УСБ нету. а в гараж ноутбук тащить или новый комп боязно

А переходник с КОМ на УСБ поможет? Та же асинхронка.

Hubster's picture

kashei, на тазиках каждая форсунка на циллиндр. если 1.5 литра то цилиндр 375 кубов. у моего Днепра 325 кубов. и что ты там про производительность говоришь. кроме того в любом магазине можно купить ее.

а в данный моент у меня вообще нету денег ни на какие форсунки.

Hubster, я тебе вродь в аску написал, глянь..., тож хочу сделать себе инжектор, есть мега32, на ней попытаюсь сделать. Слушай а в общем алгоритм инжектора как выглядит? мож где глянуть можно?

Yurik, благодарствую :)

...там я уже был

sega80, код моторолы легко перекладывается на мегу. Команды похожи, только нет апаратного деления (в 8 и 16 меге). Я оттуда брал некоторые части для зажигания на меге8. Даже оставил протокол для RS232 и смотрел состояние зажигания Megasquirt-овской прогой.

AlexeyZ, спасибо за инфу, щас парю АЦП меговское, вродь чего-то получается, но далеко не всё...

Всётаки клёвая весч - протеус, чего хош засимулирует :)

User login