Автомобили, топлинни машини, алтернативни горива > Запалителни системи
Запалителни системи с управление на предварението
koko5:
ddt4 = dt4 - dt3; - Тук се прави някакъв графичен опит за решавване, който не е коректен.
dt - време
ddt - скорост
dddt - ускорение
От тук горното твърдение, че скоростта е разлика на две времена издиша...
Затова не работи алгоритъма.
------------------------------------------------------
Относно таймеррите...
Предполагам си разгледал ПДФ-а който качих - там концепцията е двата таймера да се редуват на четен, нечетен оборот, а третия да мери оборотите.
При мен единия брои оборотите и времената, втория задава времето за зареждане, третия времето за "почивка" на бобината.
При Румен вероятно е различно, тъй като няма как с 3 таймера да управлява 4 канала.
По всяка вероятност с единия брои оборотите(при него е по точно защото това става на половин оборот при 2 канала) а с останалите два прави това което аз правя, но ги пуска по различен начин, така че да не се застъпват.
При теб как е?
Твоя процесор е бърз и прекъсванията сигурно не са му проблем, но винаги може да се оптимизира кода. :)
juliang:
Макар че не съм се задълбавал с тоя аванс процесор, да ви изложа как аз бих тръгнал:
Имам времето за завъртане T-2(преди 2 оборота), времето Т-1(преди 1 оборот). Ако Т-2 > Т-1 - мотора ускорява. Иначе - забавя. Или пък оборотите са постоянни. Мога да изчисля делта Т и да "предскажа" колко ще е времето за завъртане Т на оборота, в който сме в момента и оттам да пресметна кога да хвърля искрата.
Таймера... не можете ли да ползвате един таймер, който да измери "от началото до изчисленото време за подаване на искрата" и после "от както сме подали искрата до предполагаемото завършване на оборота"?
Примерно имаме 200 мс цикъл. Изчислили сме, че трябва да хвърлим искра на 165 мс. Настройваме си таймера на 165, пускаме го като дойде сигнал от ЕКУ-то, като изтече хвърляме искрата и после мерим от нея докато дойде следващия сигнал от ЕКУ-то (което трябва да е горе-долу след 35 мс, или ако е по-малко или по-голямо - това ще е делта Т). Така с един таймер ще измервате хем времето на един пълен цикъл, хем времето когато трябва да хвърлите искрата.
koko5:
А тези 200 мс с какво ги измерваш? Това са ти времената Т-2,Т-1,Т....... тоест един таймер е постоянно зает със тях.
С втория таймер определяш момента на искрата(както предлагаш). Да, но за да имаме искра някой трябва да зареди бобината преди това - ето тук идва третия таймер. Ще кажеш че втория вече е своводен, но... ако имаме забавяне има риск той да ни затрябва за следващата искра, а още да не се е освободил.
Дотук ти трябват три таймера(както и на мен). Но казваме че искаме(много хубаво нали :) ) да управляваме ОЩЕ една бобина с НАЛИЧНИТЕ таймери. Какво правим? Почваме едно цепене на времената на половинки или... измисляме нова концепция!
Все пак да попитам... разработваш ли нещо - дай малко информация :) ... или просто от интерес по темата?
valex:
Скорост, ускорение са относително наименования. Имам предвид, че разликата между предното и сегашното време на оборота ще е същото както и сегашното и бъдещото време. И така нататък за другите междинни обороти. Съответно по същата логика и за 'ускорението'.
Скоростта на процесора не е много по-голяма - само 16 пъти. Пускам ти часта в прекъсването. Погледни какво се прави по таймер 0.1mS.
Имам организиран софтуерен таймер ма 0.1mS по който се следят времента на запускане и спиране на инжектора и бобината. Принципно тук могат да се добавят и другите канали на инжекторите. Като всичко е предварително пресметнато като времена. Оборотите се мерят в същия този таймер, кото софтуерно се брои до прекъсване от датчика на хол. Принципно по-правилно е да се ползват таймера за тези измервания.
juliang:
Начи... не съм се пробвал още с ТАП-а. Ограничих се с ламбда контрола, тъй като не съм много в час със силовата страна на решението - как да управлявам тоците към бобините.
После - езика С за тия процесори за мен е извращение - направо се губя в тоя код... просто съм свикнал да го ползвам за компютър, не за тия процесори. Това което съм правил е било на чист асемблер. Става поне за мен малко по-разбираемо, а и предполагам по-бързо.
Явно нещо не ме разбрахте:
Имаш таймер TMR0. Знаеш че трябва да пуснеш искра на 165-тата мс. ЕКУ-то подава сигнал за искра. Ти си пускаш таймера. Имаш 2 варианта - или таймера да изтече, или да дойде втори сигнал от ЕКУ-то. Втория вариант означава че нещо яко си се ушил в сметките, защото означава че нямаш предварение, а закъснение. Евентуално би могло да се получи ако имаш значително увеличаване на оборотите за 1 такт, но не съм сигурен дали може чак толкова да се промени за 1 оборот.
Имаш измерени времена Т-2 = 220, Т-1 = 210. Очакваното време на този оборот е 200, ако мотора продължи да увеличава оборотите си. Теб ти трябва пускане на искрата с аванс 30 мс. Поставяш таймера на 170 (200-30). на 170-та мс. хвърляш искрата и поставяш таймера в режим "stopwatch" за да засечеш колко мс след тия 170 ще дойде новия сигнал от ЕКУ-то. Приемаме че идва след 45 мс. Преместваш променливите - Т-2 става 210, Т-1 става 170+45 = 215. Усещаш че мотора забавя въртенето си. Изчисляваш новото Т - ще е 220. Изчисляваш че трябва да хвърлиш искрата на 220-30 = 180 мс. Слагаш таймера на 180. Хвърляш искрата. Пускаш същия таймер на хронометър и засичаш кога ще дойде новия сигнал от ЕКУ-то.... и така нататък.
Така с един таймер ще мериш хем времето между два импулса на ЕКУ-то, хем ще имаш времето когато трябва да хвърлиш искрата.
Естествено тия времена са условни - в тях трябва да вкараш и времената за изпълнение на самия код на програмата, което става след като напишеш кода.
Навигация
[0] Списък на темите
Премини на пълна версия