Блин, изложенное в сообщ. 249 содержит ошибку. Выражение (currMicros - pulse[i]) не должно присутствовать в вычислениях окончания импульса. Вообще, если не нужно учитывать ширину входного импульса, а просто добавлять к нему некоторое время, то скетч можно немного упростить. В конечном виде он может выглядеть так:
/* Main.ino file generated by New Project wizard
*
* Processor: ATmega328P
* Compiler: Arduino AVR
*/
#define IN_1_PIN 2
#define IN_2_PIN 3
#define IN_3_PIN 4
#define IN_4_PIN 5
#define IN_5_PIN 6
#define IN_6_PIN 7
#define OUT_1_PIN 8
#define OUT_2_PIN 9
#define OUT_3_PIN 10
#define OUT_4_PIN 11
#define OUT_5_PIN 12
#define OUT_6_PIN 13
void setup() {
// инициализируем выходы
for (int i = OUT_1_PIN; i < OUT_6_PIN + 1; i++) {
digitalWrite(i, LOW);
pinMode(i, OUTPUT);
}
// инициализируем входы
for (int i = IN_1_PIN; i < IN_6_PIN + 1; i++) {
pinMode(i, INPUT);
}
}
// p_ext -- знач. в мкс. доб. времени для каждого канала
uint16_t p_ext[6] = {2200, 2200, 2200, 2100, 2300, 2500};
static uint32_t pulse[6];
uint8_t prev_in_state = 0xFF;
void loop(){
while (1) {
uint8_t in_state = PIND; // фиксируем состояние всех 6-х входов
uint8_t currBit = 2; // бит вх. порта, минус один
for (int i = 0; i < 6; i++) { // сканируем все каналы
currBit <<= 1; // бит влево к тек. каналу
if ((in_state & currBit) != currBit) { // если на канале низкий уровень
if ((prev_in_state & currBit) == currBit) { // если в прошлый раз был высокий
PORTB |= (1 << i); // ставим высокий уровень на соотв. выходе
}
} else if ((prev_in_state & currBit) != currBit) { // вх. импульс закончился ?
pulse[i] = p_ext[i] + micros(); // = когда надо гасить выход
} else if ((signed long int)(pulse[i] - micros()) <= 0) { // не надо ли гасить выход?
PORTB &= ~(1 << i); // да, гасим
}
}
prev_in_state = in_state; // сохраняем текущее состояние входов
}
}
PS. Еще в вышеприведенном скетче учитывается переполнение счетчика micros().
2 вопрос prev_instate как определяет вход высокий или низкий.если его значения постоянный 0xFF(111111111)
currbit не двигает вход, а говорит состояние какого бита(входа) мы анализируем, prev_instate это стартововое значение состояния импульсов, когда непонятно какая форсунка в каком состоянии. После первого цикла туда сохраняется последнее состояние форсунок и оно меняется каждый цикл.
1) какое-то время размышлял, как назвать эту переменную. С одной стороны это бит, который в каждом проходе алгоритма (внутри цикла) смещается на разряд влево. С другой стороны, с помощью данного бита проверяется в каком состоянии канал. Переменная должна называться то ли currBit -- текущий бит, то ли currCh -- текущий канал. Слово текущий означает здесь канал, над которым алгоритм производитс действия. Выбрал все-таки "бит", хотя и к "каналу" это не меньше относится.
Переменной перед началом цикла присваивается значение 2. Двоичный вид этого числа будет таким: 00000010. в то время, как под входы используются шесть старших разрядов порта B и в отсутствие импульсов их состояние будет таким: 111111xx, где x -- неопределенное или безразличное значение, т.к. алгоритм два младших разряда не использует. И вот перед началом цикла биты встали, как написано выше:
CurrBit: 0 0 0 0 0 0 1 0
PORTB: 1 1 1 1 1 1 x x
Цикл начинается со сдвига влево бита переменной
CurrBit 0 0 0 0 0 1 0 0
в следующей строке выполняется операция логического "И". Результатом логического "И" двух чисел всегда будет некое число, где единицы будут выставлены только в тех разрядах, в которых они присутствуют в обоих числах. Другими словам, результатом операции "И" над PORTB и CurrBit в данном случае будет:
CurrBit 0 0 0 0 0 1 0 0
PORTB 1 1 1 1 1 1 x x
====================
0 0 0 0 0 1 0 0
Результат оказался равен значению самой CurrBit и это означает, что на первом входе высокий уровень. Если бы там был низкий уровень, то результатом операции логического "И" было бы
команды внутри блока if буду выполняться тогда, когда на текущем входе ноль. Если на входе единица, то будет выполняться блок else.
Единица в переменной currBit в начале тела цикла смещается на одну позицию влево и все действия каждый раз будут происходить над следующим по порядку каналом. Цикл крутится шесть раз. Одинаковые действия производятся над каждым из шести каналов.
2) prev_in_state -- переменная, в которой хранятся значение битов порта B (входы), которые были актуальными на момент предыдущего прохода цикла for (и значение у нее не всегда 0XFF). Логика тут простая -- если одни и те же разряды (биты) в обеих переменных отличаются, значит в канале, чьи биты разные, случилось некое событие. Под событием здесь имеется ввиду либо переход из высокого состояния в низкое, либо наоборот. Если биты одинаковые, значит с прошлой проверки ничего не изменилось.
Если биты разные, то алгоритм проверяет эту разницу и определяет, что произошло. Если некий бит в prev_in_state сохранен как единица, а в in_state он же уже в нуле, то значит пришел импульс открытия форсунки на соотв. канале. Если наоборот, был нулем, а стал единицей, то импульс только что закончился.
Изменение состояния входа с низкого на высокий (окончание управляющего импульса) отслеживается алгоритмом в строке 48. Как только обнаруживается такой переход, алгоритм в строке 49 запрашивает текущее значение счетчика микросекунд c помощью вызова функции micros(), складывает его с константой "уширения" из массива p_ext и запоминает в массиве pulse время (в микросекундах), когда импульс нужно будет прекратить. В последующих циклах проверки состояния входов, заодно сравнивается значение соотв. элемента массива pulse c текущим значением счетчика микросекунд в строке 50. Если pulse меньше, то на соответствующем выходе выставляется низкое значение и тем самым импульс открытия форсунок на выходе завершается.
В строке 50 проверка условия выглядит несколько необычно. По идее, проверка счетчика микросекунд могла бы иметь простой и наглядный вид
if (micros() >= pulse[i]) {
// переводим выход в высокое состояние
}
Это замечательно бы работало, если счетчик микросекунд не переполнялся бы каждые 72 минуты (примерно). Но так как счетчик имеет ограниченную разрядность и переполнение неизбежно, чтобы исключить ошибку в формировании длительности выходных импульсов, проверка выполняется в форме, учитывающей переполнение (строка 50).
Здравствуйте скетч отлично все работает,но с расходы большие на 100км расходуется 21-22литров газа.У дяди стоит гбо stag-4 от его машины снял показания на холостом ходу и на резких оборотах двигателя.
Как видно на гарфике при холостом ходу у газа разница с топливом где то 6 мс ,а при резком нажатии на педаль тот же 6 мс остается а остальное заполняется с пило образным сигналом.У меня при резком нажатии на педаль точно такой сигнал подает что и топливо отсюда и расход большой.Можно ли сделать подавать такой сигнал на ардуино
Пила там похоже затем, чтобы немного придушить форсунку. Не совсем понятно, что они таким образом пытались изобразить. Не проще ли было сделать, чтобы впуск газа на больших оборотах заканчивался раньше, чем "бензиновый" импульс ? Как раз об этом писал тот чувак, которого я здесь цитировал.
Можно сделать время задержки открытие постоянной скажем 5,5-6мс на холостом а на больших оборотах тоже оставался 6мс.Может не будет пилы зато можно закрыт форсунку так как на холостых оборотах период импулсьов составляет 160мс а на больших оборотах может менятся до 40мс
Я на своей когда резко увеличивал обороты смесь по лямбду зонду увиличвался (сильно обогашалься) и когда обороты уже упали смесь оставался обагашенной 4-6 секунды и потом падал до нормальной состоянии. До этого у меня стояла 2-поколение ГБО с рдеуктора на прямую через смеситель подавался смесь на входной коллектор тогда расход был стабыильный 15-16литров на 100км
Чет я немного поразмыслил над этой пилой и возникло подозрение, что пилу они туда загнали неспроста. Ширина входного импульса зависит ведь не только от оборотов, но и от других параметров. Информационная ценность ее величины не равна нулю и ее тоже нужно учитывать. Вот они и учитывают. Получается, основной объем газа запускают в течение укороченного (относительно входящего) импульса, а потом пилой формируют добавку пропорционально ширине входного импульса.
Stag-4 стоит мап сенсор в основном по нему он определяет аквтокорекцию ,если пилуобразную сигнал трудно будет сделать и по пробовать подавать постоянную 6мс импулсь может что то получится.Так как время полного открытия форсунки составляет 5мс в таких пилообразных сигналах он точно не откроется
Не, открывают они ее точно по приходу импульса, а вот где-то ближе к середине подают пилу. Такой трюк лишь прикрывает форсунку, не давая ей закрыться полностью. Подозреваю, что изменяя параметры пилы, а проще ШИМ-сигнала, можно как-то регулировать величину прикрытия и тем самым управлять объемом газового "довеска".
Вот ваопрос, форсунка это соленоид с якорем? Если так, то эти импульсы работают как в обычном режиме с рэле, там подают напряжние срабатывания как правило полное допустимое, а потом оставляют напряжение удержания. В данном случае наверное решается проблема тока обратной индукции и как следствие надежное закрытие форсунки в четко определенный момент времени. По поводу гигантского расхода топлива не стал говорить раньше, а то професиАнал а5021 еще что ни будь нелепое взвизгнул. Кто то еще кроме меня предлогал создать таблицу коэффициэнотов зависимости с оборотами. Скетч остается таким же плюс длительность умножается на этот коэффициент в зависимости от оборотов.
По поводу гигантского расхода топлива не стал говорить раньше, а то професиАнал а5021 еще что ни будь нелепое взвизгнул.
Ну конечно все знал заранее. Сказать только не мог. Как тот пес. На деле же все выглядит так, что способностей у вас только и хватило, как весьма неуклюжим образом попытаться выставить себя умником задним числом. Какой расход выйдет не знал никто, ни я, ни владелец машины, ни уж тем более вы. Молчали бы лучше, гражданин провидец. Поверит теперь вам кто-то, что вы чего-то там "не стали говорить раньше". Ага. Сочиняйте-сочиняйте.
Цитата:
Кто то еще кроме меня предлогал создать таблицу коэффициэнотов зависимости с оборотами. Скетч остается таким же плюс длительность умножается на этот коэффициент в зависимости от оборотов.
Так чего ж не создадите, если уже давно "предлогал" ? Или у вас специализация лишь гундосить под руку, разннобразный бред преимущественно?
Yer пишет:
Можно сделать так чтобы подавал только 5.5-6мс на всех режимах двигателя
Можно. Только расчитывать на приемлемый результат сложно. Если есть интерес экспериментировать, перенесите выражение в строке 49 на позицию сразу за строкой 46. Тогда ширина выходных импульсов будут считаться от начала входного импульса, а массив индивидуальных значений будет содержать ширину импульса в абсолютных цифрах, а не в приращениях.
По поводу гигантского расхода топлива не стал говорить раньше, а то професиАнал а5021 еще что ни будь нелепое взвизгнул.
Ну конечно все знал заранее. Сказать только не мог. Как тот пес. На деле же все выглядит так, что способностей у вас только и хватило, как весьма неуклюжим образом попытаться выставить себя умником задним числом. Какой расход выйдет не знал никто, ни я, ни владелец машины, ни уж тем более вы. Молчали бы лучше, гражданин провидец. Поверит теперь вам кто-то, что вы чего-то там "не стали говорить раньше". Ага. Сочиняйте-сочиняйте.
Цитата:
Кто то еще кроме меня предлогал создать таблицу коэффициэнотов зависимости с оборотами. Скетч остается таким же плюс длительность умножается на этот коэффициент в зависимости от оборотов.
Так чего ж не создадите, если уже давно "предлогал" ? Или у вас специализация лишь гундосить под руку, разннобразный бред преимущественно?
Yer пишет:
Можно сделать так чтобы подавал только 5.5-6мс на всех режимах двигателя
Можно. Только расчитывать на приемлемый результат сложно. Если есть интерес экспериментировать, перенесите выражение в строке 49 на позицию сразу за строкой 46. Тогда ширина выходных импульсов будут считаться от начала входного импульса, а массив индивидуальных значений будет содержать ширину импульса в абсолютных цифрах, а не в приращениях.
Скажите спасибо что у человека после вашего испражнения двигатель не стуканул. Вашему апломбу и невежеству можно только посочувствовать. Гавнокодерствуйте дальше.....
Скажите спасибо что у человека после вашего испражнения двигатель не стуканул.
Че обидка душит, что несмотря на всю вашу желчь и аппокалиптические предсказания, ничего не сбылось? Хреновый, значит, вы предсказатель и провидец. На себя, стало быть и обижайтесь.
Цитата:
Вашему апломбу и невежеству можно только посочувствовать.
Да мне вобщем-то все равно, какие галлюцинации вас там мучают. Хотите сочувствуйте, хотите злорадствуйте. Это целиком ваши проблемы.
Цитата:
Гавнокодерствуйте дальше.....
Спасибо, что разрешили. А то я прямо даже не знал, как быть дальше без вашего отеческого напутствия.
Я вот только не пойму, какого рожна вы тут вообще делаете? Вы ж мне пару недель назад с необыкновенным пафосом рассказывали, что вам с мелкими контроллерами иметь дело западло и вы никак не можете позволить себе тратить на подобную фигню ваше драгоценное время, ибо масштаб вашей личности для творчества требует исключительно самого мощного железа. И вот вместо того, чтобы упиваться этим самым мощным железом, вы сидите тут чуть ли не безвылазно и плете отборную хрень про то, что по вашим же словам вас интересовать никак не может. Совсем не запоминаете, что успели наплести в предыдущие дни? Записывайте на бумажку, а то так и будете постоянно попадать в глупое положение.
Вы пришли мне сообщить, что на котах закончился ваш ум? Я жду там вашего ответа, а его все нет. Ведь такой у вас был блистательный выход. Появились во всем белом. Поумничали, но мой вопрос вас поставил в такой тупик, что вы заткнулись на несколько дней и похоже, что так и не придумали, как спасать свою репутацию. Да еще и досикус, ваш лепший кореш, обосрался со своими шестидесятиразрядными сдвигами. Сидят теперь корифеи, обтекают, а что дальше делать и чего плести, никто не знает. Положеньице у вас обоих, не позавидуешь. Эксперты стм32 фиговы.
Можно это делать, но только по факту, то есть когда импульс закончился. Приходит - отмеряем, решаем, выдаём. По ходу - невозможно, нет способа предсказать будущее.
я так понимаю стандартные программные триггера один по переднему фронту другой по заднему вполне решают (предсказывают будущее) ...люди тексты парсят голым хардвером...http://cherkessk.su/people/user/1/blog/45/...а программно можно всё )))
Что значит "вообще" ? Кто захотел, свои версии выдвинул. И обсуждение нормальное было. Ровно до того момента, как два барана, по привычке вышли пальцы погнуть, да так неудачно сразу обосрались, что и сказать теперь ничего не могут, опасаются, как бы еще больше собственного дерьма не нахлебаться.
Спасибо всем кто откликнулся на мои вопросы,если честно кроме а5021 никто реальных программ не написал может у кого то времени нет может желании. Суть не в том если кто то хочет решит задачу написать программу я только рад, а те которые не хотят помочь написанием давайте не будем мешать и оскорблять тех которые пытаются с уважением Yer
Вот вариант с жестко заданной в p_ext длиной выходного импульса по каждому каналу. Лично мне он не кажется перспективным, но проверить, возможно, будет интересно:
/* Main.ino file generated by New Project wizard
*
* Processor: ATmega328P
* Compiler: Arduino AVR
*/
#define IN_1_PIN 2
#define IN_2_PIN 3
#define IN_3_PIN 4
#define IN_4_PIN 5
#define IN_5_PIN 6
#define IN_6_PIN 7
#define OUT_1_PIN 8
#define OUT_2_PIN 9
#define OUT_3_PIN 10
#define OUT_4_PIN 11
#define OUT_5_PIN 12
#define OUT_6_PIN 13
#define CHANNEL_IN_LOW_STATE(STATE, CH) ((STATE & CH) != CH)
#define FALLING_EDGE(STATE, CH) ((STATE & CH) == CH)
#define RISING_EDGE(STATE, CH) ((STATE & CH) != CH)
#define SET_OUTPUT_HIGH(CH) PORTB |= (1 << CH)
#define SET_OUTPUT_LOW(CH) PORTB &= ~(1 << CH);
void setup() {
// инициализируем выходы
for (int i = OUT_1_PIN; i < OUT_6_PIN + 1; i++) {
digitalWrite(i, LOW);
pinMode(i, OUTPUT);
}
// инициализируем входы
for (int i = IN_1_PIN; i < IN_6_PIN + 1; i++) {
pinMode(i, INPUT);
}
}
// p_ext -- ширина импульса для каждого канала в мкс
uint16_t p_ext[6] = {2500, 2500, 2500, 2500, 2500, 2500};
static uint32_t pulse[6];
uint8_t prev_in_state = 0xFF;
void loop(){
while (1) {
uint8_t in_state = PIND; // фиксируем состояние всех 6-х входов
uint8_t currChannel = 2; // бит вх. порта, минус один
for (int i = 0; i < 6; i++) { // сканируем все каналы
currChannel <<= 1; // бит следующего канала
if CHANNEL_IN_LOW_STATE(in_state, currChannel) { // если на канале низкий уровень
if FALLING_EDGE(prev_in_state, currChannel) { // если в прошлый раз был высокий
SET_OUTPUT_HIGH(i); // ставим высокий уровень на соотв. выходе
pulse[i] = p_ext[i] + micros(); // сразу вычисляем, когда надо будет гасить выход
}
} else if RISING_EDGE(prev_in_state, currChannel) { // вх. импульс закончился ?
// здесь можно что нибудь сделать по окончанию вх. импульса
}
if (pulse[i] != 0) { // если вых. импульс еще не закончился
if ((signed long int)(pulse[i] - micros()) <= 0) { // не надо ли уже гасить выход?
SET_OUTPUT_LOW(i); // да, гасим
pulse[i] = 0; // зануление, как признак, что имп. окончен
}
}
}
prev_in_state = in_state; // сохраняем текущее состояние входов
}
}
пила в импульсе, это ток удержания, защищает катушки форсунок от перегрева.
А лямбда то что на разных режимах показывает? диапазона регулирования мозгов хватает? при нажатой в пол педали всегда должно богатить, все остальные режимы должна быть четкая пила без долговременных(не более 2-3сек) забросов в бедноту или обогащение.
пока небудут известны параметры смеси по лямбде на разных режимах толку думать в какую сторону увеличивать импульсы
пила в импульсе, это ток удержания, защищает катушки форсунок от перегрева.
А лямбда то что на разных режимах показывает? диапазона регулирования мозгов хватает? при нажатой в пол педали всегда должно богатить, все остальные режимы должна быть четкая пила без долговременных(не более 2-3сек) забросов в бедноту или обогащение.
пока небудут известны параметры смеси по лямбде на разных режимах толку думать в какую сторону увеличивать импульсы
Ну наконец то, что теперь а5021, любитель научного самотыка скажете? В одном посте собрано все что вам было сказано за последние недели 3 - 4. Вы бы сначала почитали инструкцию по применению, а потом писали программу основанную на догадках.
и еще, форсунки так и небыли откалиброваны, пока не сделать это и то что выше писал про экономный расход можно забыть.
для калибровки запомнить время впрыска бензиновых форсунок, затем отключить 1 бензиновую и включить 1 газовую, постепенно увеличивая время впрыска газовой форсунки добиться чтобы время открытия остальных бензиновых форсунок сравнялось с временем до переключения на газовую форсунку (сначала думал что нужно восстановить обороты, но поразмыслив передумал) и так проделать со всеми форсунками, вот в принципе и вся калибровка форсунок для того чтобы узнать коэф. пересчета(или увелич длит импульса). а затем уже надо на разных режимах смотреть беднится смесь или нет, и возможно строить таблицы пересчета.
вот например таблица настройки для моего движка 1,4л
Ну наконец то, что теперь а5021, любитель научного самотыка скажете?
Вам ничего нового не скажу. Мне ваш скулеж абсолютно побоку. Считал и считаю, что польза от вашего участия в обсуждении лежит в области отрицательных величин.
Цитата:
Вы бы сначала почитали инструкцию по применению,
Уважаемый бредогенератор, о какой инструкции речь?
Цитата:
а потом писали программу основанную на догадках.
Если бы вы обладали хоть каплей наблюдательности, то могли бы заметить (пусть и не сразу), что я не вношу никакой отсебятины в управляющий алгоритм и реализую только тот функционал, который был запрошен. Про какие "догадки" вы тут бредите, мне неведомо.
Я вот что хочу у вас спросить: если вы такой офигенно-разбирающийся в предмете специалист, если мой скетч считаете отборным говнокодом, то почему еще до сих пор не показали класс и не утерли мне нос, просто предложив свой изящный вариант, идеально учитывающий всю необходимую специфику? Вместо того, чтобы написать те самые правильные пару десятков строк, вы тут которую неделю уже исходите на понос и корчите из себя невпупенного спеца, что в программировании, что во всех прочих дисциплинах, не проявив себя в деле вообще никак.
Здравствуйте по пробовал скетч на холостом двигатель работает когда обороты медленно поднимаеш работает более менее но когда сразу набираешь обороты сразу глохнет, это значит что если подавать на всех режимах только 5,5мс смесь обедняется.Пила своим импульсом шток форсунки держит в определенном открытым состоянии чтобы смесь не обеднялся и не обогашалься.Нужно посчитать все импульсы пилы из этого можно определить на сколько процентов открыта форсунка
Могу предложить вот еще что: в алгоритме можно вычислять некую моментальную скорость, которая является простой разницей по времени между двумя "соседними" импульсами. Это даст привязку к оборотам и опираясь на полученные таким образом показатели, можно оперативно менять ширину импульсов и осуществлять более точное регулирование.
А если сделать пилу после 5 мс ,пила заканчивается когда входной импулсь пропадает.Период пилы 1мс во всех режимах длительность пилы зависит только от входного импульса.
Пила тут вообще отдельная песня. Синхронизация алгоритма происходит по входным ипульсам и генерерировать программно более высокую частоту пилы, да еще не сразу, а с задержкой на полное открытие форсунки, требует дополнительных вычислительных расходов, что негативно сказывается на общем быстродействии.
Вам ничего нового не скажу. Мне ваш скулеж абсолютно побоку. Считал и считаю, что польза от вашего участия в обсуждении лежит в области отрицательных величин.
Цитата:
Уважаемый бредогенератор, о какой инструкции речь?
Вот после такого поноса, при полном отсутствии знаний тебе никто ничего и не подсказывает. Ты просто предмет, предмет постоянного стёба. )))))))))
Цитата:
Я вот что хочу у вас спросить: если вы такой офигенно-разбирающийся в предмете специалист, если мой скетч считаете отборным говнокодом, то почему еще до сих пор не показали класс и не утерли мне нос, просто предложив свой изящный вариант, идеально учитывающий всю необходимую специфику?
Видишь ли, дебил ты контуженный, нормальные люди, не владея досконально теорией принципов управления ДВС, не пишут абы какие скетчи только ради самоутверждения! Но это явно не к тебе относится. Ты как затычка во все дырки, сначала обсираешься, потом истеришь кивая на других. ))))))))))
У нас с вами разделение труда: я красуюсь, вы выставляете себя дебилом. В итоге, все довольны.
Для меня твоё "вы выставляете себя дебилом" звучит как признание твоих собственных незнаний и несостоятельности, что ты неоднократно уже и демонстрировал. ))))))))
И что там где у вас "звучит", мне тоже не интересно. Вы напрасно тратите свое время. Я же, как занимался тем, что нахожу интересным, так и буду это делать впредь. Вопли всяких бакланов на мои решения никак не влияют.
вот график для валтеков показывающий время открытия и закрытия форсунок при 14в , при более низком напряжении есстественно время меняется, но разрабы такие данные уже не выкладывают.
Блин, изложенное в сообщ. 249 содержит ошибку. Выражение (currMicros - pulse[i]) не должно присутствовать в вычислениях окончания импульса. Вообще, если не нужно учитывать ширину входного импульса, а просто добавлять к нему некоторое время, то скетч можно немного упростить. В конечном виде он может выглядеть так:
PS. Еще в вышеприведенном скетче учитывается переполнение счетчика micros().
a5021 огромное вам спасибо все отлично работает во всех режимах двигателя,теперь осталось понят как задержка работает и весь алгоритм скетча
А ездить-то пробовали или пока просто мотор гоняли на месте?
Насчет алгоритма, спрашивайте, постараюсь пояснить.
на работу и по своим делам катаюсь все отлично работает тяга отличная.
1 вопрос currbit как двигает вход
2 вопрос prev_instate как определяет вход высокий или низкий.если его значения постоянный 0xFF(111111111)
1 вопрос currbit как двигает вход
2 вопрос prev_instate как определяет вход высокий или низкий.если его значения постоянный 0xFF(111111111)
currbit не двигает вход, а говорит состояние какого бита(входа) мы анализируем, prev_instate это стартововое значение состояния импульсов, когда непонятно какая форсунка в каком состоянии. После первого цикла туда сохраняется последнее состояние форсунок и оно меняется каждый цикл.
1) какое-то время размышлял, как назвать эту переменную. С одной стороны это бит, который в каждом проходе алгоритма (внутри цикла) смещается на разряд влево. С другой стороны, с помощью данного бита проверяется в каком состоянии канал. Переменная должна называться то ли currBit -- текущий бит, то ли currCh -- текущий канал. Слово текущий означает здесь канал, над которым алгоритм производитс действия. Выбрал все-таки "бит", хотя и к "каналу" это не меньше относится.
Переменной перед началом цикла присваивается значение 2. Двоичный вид этого числа будет таким: 00000010. в то время, как под входы используются шесть старших разрядов порта B и в отсутствие импульсов их состояние будет таким: 111111xx, где x -- неопределенное или безразличное значение, т.к. алгоритм два младших разряда не использует. И вот перед началом цикла биты встали, как написано выше:
CurrBit: 0 0 0 0 0 0 1 0
PORTB: 1 1 1 1 1 1 x x
Цикл начинается со сдвига влево бита переменной
CurrBit 0 0 0 0 0 1 0 0
в следующей строке выполняется операция логического "И". Результатом логического "И" двух чисел всегда будет некое число, где единицы будут выставлены только в тех разрядах, в которых они присутствуют в обоих числах. Другими словам, результатом операции "И" над PORTB и CurrBit в данном случае будет:
CurrBit 0 0 0 0 0 1 0 0
PORTB 1 1 1 1 1 1 x x
====================
0 0 0 0 0 1 0 0
Результат оказался равен значению самой CurrBit и это означает, что на первом входе высокий уровень. Если бы там был низкий уровень, то результатом операции логического "И" было бы
0 0 0 0 0 0 0 0
и в конструкции
команды внутри блока if буду выполняться тогда, когда на текущем входе ноль. Если на входе единица, то будет выполняться блок else.
Единица в переменной currBit в начале тела цикла смещается на одну позицию влево и все действия каждый раз будут происходить над следующим по порядку каналом. Цикл крутится шесть раз. Одинаковые действия производятся над каждым из шести каналов.
2) prev_in_state -- переменная, в которой хранятся значение битов порта B (входы), которые были актуальными на момент предыдущего прохода цикла for (и значение у нее не всегда 0XFF). Логика тут простая -- если одни и те же разряды (биты) в обеих переменных отличаются, значит в канале, чьи биты разные, случилось некое событие. Под событием здесь имеется ввиду либо переход из высокого состояния в низкое, либо наоборот. Если биты одинаковые, значит с прошлой проверки ничего не изменилось.
Если биты разные, то алгоритм проверяет эту разницу и определяет, что произошло. Если некий бит в prev_in_state сохранен как единица, а в in_state он же уже в нуле, то значит пришел импульс открытия форсунки на соотв. канале. Если наоборот, был нулем, а стал единицей, то импульс только что закончился.
Спасибо что разяснили а как происходит время задержки выхода
Изменение состояния входа с низкого на высокий (окончание управляющего импульса) отслеживается алгоритмом в строке 48. Как только обнаруживается такой переход, алгоритм в строке 49 запрашивает текущее значение счетчика микросекунд c помощью вызова функции micros(), складывает его с константой "уширения" из массива p_ext и запоминает в массиве pulse время (в микросекундах), когда импульс нужно будет прекратить. В последующих циклах проверки состояния входов, заодно сравнивается значение соотв. элемента массива pulse c текущим значением счетчика микросекунд в строке 50. Если pulse меньше, то на соответствующем выходе выставляется низкое значение и тем самым импульс открытия форсунок на выходе завершается.
В строке 50 проверка условия выглядит несколько необычно. По идее, проверка счетчика микросекунд могла бы иметь простой и наглядный вид
Это замечательно бы работало, если счетчик микросекунд не переполнялся бы каждые 72 минуты (примерно). Но так как счетчик имеет ограниченную разрядность и переполнение неизбежно, чтобы исключить ошибку в формировании длительности выходных импульсов, проверка выполняется в форме, учитывающей переполнение (строка 50).
Здравствуйте скетч отлично все работает,но с расходы большие на 100км расходуется 21-22литров газа.У дяди стоит гбо stag-4 от его машины снял показания на холостом ходу и на резких оборотах двигателя.
Как видно на гарфике при холостом ходу у газа разница с топливом где то 6 мс ,а при резком нажатии на педаль тот же 6 мс остается а остальное заполняется с пило образным сигналом.У меня при резком нажатии на педаль точно такой сигнал подает что и топливо отсюда и расход большой.Можно ли сделать подавать такой сигнал на ардуино
Пила там похоже затем, чтобы немного придушить форсунку. Не совсем понятно, что они таким образом пытались изобразить. Не проще ли было сделать, чтобы впуск газа на больших оборотах заканчивался раньше, чем "бензиновый" импульс ? Как раз об этом писал тот чувак, которого я здесь цитировал.
Можно сделать время задержки открытие постоянной скажем 5,5-6мс на холостом а на больших оборотах тоже оставался 6мс.Может не будет пилы зато можно закрыт форсунку так как на холостых оборотах период импулсьов составляет 160мс а на больших оборотах может менятся до 40мс
Я на своей когда резко увеличивал обороты смесь по лямбду зонду увиличвался (сильно обогашалься) и когда обороты уже упали смесь оставался обагашенной 4-6 секунды и потом падал до нормальной состоянии. До этого у меня стояла 2-поколение ГБО с рдеуктора на прямую через смеситель подавался смесь на входной коллектор тогда расход был стабыильный 15-16литров на 100км
Чет я немного поразмыслил над этой пилой и возникло подозрение, что пилу они туда загнали неспроста. Ширина входного импульса зависит ведь не только от оборотов, но и от других параметров. Информационная ценность ее величины не равна нулю и ее тоже нужно учитывать. Вот они и учитывают. Получается, основной объем газа запускают в течение укороченного (относительно входящего) импульса, а потом пилой формируют добавку пропорционально ширине входного импульса.
Stag-4 стоит мап сенсор в основном по нему он определяет аквтокорекцию ,если пилуобразную сигнал трудно будет сделать и по пробовать подавать постоянную 6мс импулсь может что то получится.Так как время полного открытия форсунки составляет 5мс в таких пилообразных сигналах он точно не откроется
Не, открывают они ее точно по приходу импульса, а вот где-то ближе к середине подают пилу. Такой трюк лишь прикрывает форсунку, не давая ей закрыться полностью. Подозреваю, что изменяя параметры пилы, а проще ШИМ-сигнала, можно как-то регулировать величину прикрытия и тем самым управлять объемом газового "довеска".
Вот ваопрос, форсунка это соленоид с якорем? Если так, то эти импульсы работают как в обычном режиме с рэле, там подают напряжние срабатывания как правило полное допустимое, а потом оставляют напряжение удержания. В данном случае наверное решается проблема тока обратной индукции и как следствие надежное закрытие форсунки в четко определенный момент времени. По поводу гигантского расхода топлива не стал говорить раньше, а то професиАнал а5021 еще что ни будь нелепое взвизгнул. Кто то еще кроме меня предлогал создать таблицу коэффициэнотов зависимости с оборотами. Скетч остается таким же плюс длительность умножается на этот коэффициент в зависимости от оборотов.
Можно сделать так чтобы подавал только 5.5-6мс на всех режимах двигателя
Ну конечно все знал заранее. Сказать только не мог. Как тот пес. На деле же все выглядит так, что способностей у вас только и хватило, как весьма неуклюжим образом попытаться выставить себя умником задним числом. Какой расход выйдет не знал никто, ни я, ни владелец машины, ни уж тем более вы. Молчали бы лучше, гражданин провидец. Поверит теперь вам кто-то, что вы чего-то там "не стали говорить раньше". Ага. Сочиняйте-сочиняйте.
Так чего ж не создадите, если уже давно "предлогал" ? Или у вас специализация лишь гундосить под руку, разннобразный бред преимущественно?
Можно. Только расчитывать на приемлемый результат сложно. Если есть интерес экспериментировать, перенесите выражение в строке 49 на позицию сразу за строкой 46. Тогда ширина выходных импульсов будут считаться от начала входного импульса, а массив индивидуальных значений будет содержать ширину импульса в абсолютных цифрах, а не в приращениях.
Тогда у нас 48 строка исчезает по 50 строке гасим выход
Сори за дезу, не будет так работать. Сейчас посмотрел повнимательнее, надо править весь цикл.
Ну конечно все знал заранее. Сказать только не мог. Как тот пес. На деле же все выглядит так, что способностей у вас только и хватило, как весьма неуклюжим образом попытаться выставить себя умником задним числом. Какой расход выйдет не знал никто, ни я, ни владелец машины, ни уж тем более вы. Молчали бы лучше, гражданин провидец. Поверит теперь вам кто-то, что вы чего-то там "не стали говорить раньше". Ага. Сочиняйте-сочиняйте.
Так чего ж не создадите, если уже давно "предлогал" ? Или у вас специализация лишь гундосить под руку, разннобразный бред преимущественно?
Можно. Только расчитывать на приемлемый результат сложно. Если есть интерес экспериментировать, перенесите выражение в строке 49 на позицию сразу за строкой 46. Тогда ширина выходных импульсов будут считаться от начала входного импульса, а массив индивидуальных значений будет содержать ширину импульса в абсолютных цифрах, а не в приращениях.
Скажите спасибо что у человека после вашего испражнения двигатель не стуканул. Вашему апломбу и невежеству можно только посочувствовать. Гавнокодерствуйте дальше.....
Че обидка душит, что несмотря на всю вашу желчь и аппокалиптические предсказания, ничего не сбылось? Хреновый, значит, вы предсказатель и провидец. На себя, стало быть и обижайтесь.
Да мне вобщем-то все равно, какие галлюцинации вас там мучают. Хотите сочувствуйте, хотите злорадствуйте. Это целиком ваши проблемы.
Спасибо, что разрешили. А то я прямо даже не знал, как быть дальше без вашего отеческого напутствия.
Я вот только не пойму, какого рожна вы тут вообще делаете? Вы ж мне пару недель назад с необыкновенным пафосом рассказывали, что вам с мелкими контроллерами иметь дело западло и вы никак не можете позволить себе тратить на подобную фигню ваше драгоценное время, ибо масштаб вашей личности для творчества требует исключительно самого мощного железа. И вот вместо того, чтобы упиваться этим самым мощным железом, вы сидите тут чуть ли не безвылазно и плете отборную хрень про то, что по вашим же словам вас интересовать никак не может. Совсем не запоминаете, что успели наплести в предыдущие дни? Записывайте на бумажку, а то так и будете постоянно попадать в глупое положение.
Совсем не запоминаете, что успели наплести в предыдущие дни?
Вы пришли мне сообщить, что на котах закончился ваш ум? Я жду там вашего ответа, а его все нет. Ведь такой у вас был блистательный выход. Появились во всем белом. Поумничали, но мой вопрос вас поставил в такой тупик, что вы заткнулись на несколько дней и похоже, что так и не придумали, как спасать свою репутацию. Да еще и досикус, ваш лепший кореш, обосрался со своими шестидесятиразрядными сдвигами. Сидят теперь корифеи, обтекают, а что дальше делать и чего плести, никто не знает. Положеньице у вас обоих, не позавидуешь. Эксперты стм32 фиговы.
так и не придумали, как спасать свою репутацию.
Вашу репутацию? Да она меня вообще не колышет! ))))))))))
Мне просто интересно как вы сами теперь выкручиваться будете. ))))))))))))
Отвечать, демагоги дешевые, собираетесь? Так прослабило, что язык отнялся?
Можно это делать, но только по факту, то есть когда импульс закончился. Приходит - отмеряем, решаем, выдаём. По ходу - невозможно, нет способа предсказать будущее.
я так понимаю стандартные программные триггера один по переднему фронту другой по заднему вполне решают (предсказывают будущее) ...люди тексты парсят голым хардвером...http://cherkessk.su/people/user/1/blog/45/...а программно можно всё )))
язык отнялся?
А зачем? Ты лучше задумайся, почему тебе вообще НИКТО не отвечает!? ))))))))))))))
Что значит "вообще" ? Кто захотел, свои версии выдвинул. И обсуждение нормальное было. Ровно до того момента, как два барана, по привычке вышли пальцы погнуть, да так неудачно сразу обосрались, что и сказать теперь ничего не могут, опасаются, как бы еще больше собственного дерьма не нахлебаться.
Спасибо всем кто откликнулся на мои вопросы,если честно кроме а5021 никто реальных программ не написал может у кого то времени нет может желании. Суть не в том если кто то хочет решит задачу написать программу я только рад, а те которые не хотят помочь написанием давайте не будем мешать и оскорблять тех которые пытаются с уважением Yer
Вот вариант с жестко заданной в p_ext длиной выходного импульса по каждому каналу. Лично мне он не кажется перспективным, но проверить, возможно, будет интересно:
пила в импульсе, это ток удержания, защищает катушки форсунок от перегрева.
А лямбда то что на разных режимах показывает? диапазона регулирования мозгов хватает? при нажатой в пол педали всегда должно богатить, все остальные режимы должна быть четкая пила без долговременных(не более 2-3сек) забросов в бедноту или обогащение.
пока небудут известны параметры смеси по лямбде на разных режимах толку думать в какую сторону увеличивать импульсы
пила в импульсе, это ток удержания, защищает катушки форсунок от перегрева.
А лямбда то что на разных режимах показывает? диапазона регулирования мозгов хватает? при нажатой в пол педали всегда должно богатить, все остальные режимы должна быть четкая пила без долговременных(не более 2-3сек) забросов в бедноту или обогащение.
пока небудут известны параметры смеси по лямбде на разных режимах толку думать в какую сторону увеличивать импульсы
Ну наконец то, что теперь а5021, любитель научного самотыка скажете? В одном посте собрано все что вам было сказано за последние недели 3 - 4. Вы бы сначала почитали инструкцию по применению, а потом писали программу основанную на догадках.
и еще, форсунки так и небыли откалиброваны, пока не сделать это и то что выше писал про экономный расход можно забыть.
для калибровки запомнить время впрыска бензиновых форсунок, затем отключить 1 бензиновую и включить 1 газовую, постепенно увеличивая время впрыска газовой форсунки добиться чтобы время открытия остальных бензиновых форсунок сравнялось с временем до переключения на газовую форсунку (сначала думал что нужно восстановить обороты, но поразмыслив передумал) и так проделать со всеми форсунками, вот в принципе и вся калибровка форсунок для того чтобы узнать коэф. пересчета(или увелич длит импульса). а затем уже надо на разных режимах смотреть беднится смесь или нет, и возможно строить таблицы пересчета.
вот например таблица настройки для моего движка 1,4л
Вам ничего нового не скажу. Мне ваш скулеж абсолютно побоку. Считал и считаю, что польза от вашего участия в обсуждении лежит в области отрицательных величин.
Уважаемый бредогенератор, о какой инструкции речь?
Если бы вы обладали хоть каплей наблюдательности, то могли бы заметить (пусть и не сразу), что я не вношу никакой отсебятины в управляющий алгоритм и реализую только тот функционал, который был запрошен. Про какие "догадки" вы тут бредите, мне неведомо.
Я вот что хочу у вас спросить: если вы такой офигенно-разбирающийся в предмете специалист, если мой скетч считаете отборным говнокодом, то почему еще до сих пор не показали класс и не утерли мне нос, просто предложив свой изящный вариант, идеально учитывающий всю необходимую специфику? Вместо того, чтобы написать те самые правильные пару десятков строк, вы тут которую неделю уже исходите на понос и корчите из себя невпупенного спеца, что в программировании, что во всех прочих дисциплинах, не проявив себя в деле вообще никак.
Здравствуйте по пробовал скетч на холостом двигатель работает когда обороты медленно поднимаеш работает более менее но когда сразу набираешь обороты сразу глохнет, это значит что если подавать на всех режимах только 5,5мс смесь обедняется.Пила своим импульсом шток форсунки держит в определенном открытым состоянии чтобы смесь не обеднялся и не обогашалься.Нужно посчитать все импульсы пилы из этого можно определить на сколько процентов открыта форсунка
Полностью открытое состояние форсунки (valtek) составляет 5-5,5мс
Могу предложить вот еще что: в алгоритме можно вычислять некую моментальную скорость, которая является простой разницей по времени между двумя "соседними" импульсами. Это даст привязку к оборотам и опираясь на полученные таким образом показатели, можно оперативно менять ширину импульсов и осуществлять более точное регулирование.
А если сделать пилу после 5 мс ,пила заканчивается когда входной импулсь пропадает.Период пилы 1мс во всех режимах длительность пилы зависит только от входного импульса.
Извините ошибся с периодом пилы,Один период пилы составляет 500нс это означает в одном милисекунде 2 периода пилы сигнала
Пила тут вообще отдельная песня. Синхронизация алгоритма происходит по входным ипульсам и генерерировать программно более высокую частоту пилы, да еще не сразу, а с задержкой на полное открытие форсунки, требует дополнительных вычислительных расходов, что негативно сказывается на общем быстродействии.
Могу предложить вот еще что
Ну и нафига ты что-то предлагаешь, если ты абсолютно не в теме? Покрасоваться решил? Красавец! ))))))))))
У нас с вами разделение труда: я красуюсь, вы выставляете себя дебилом. В итоге, все довольны.
Вам ничего нового не скажу. Мне ваш скулеж абсолютно побоку. Считал и считаю, что польза от вашего участия в обсуждении лежит в области отрицательных величин.
Уважаемый бредогенератор, о какой инструкции речь?
Вот после такого поноса, при полном отсутствии знаний тебе никто ничего и не подсказывает. Ты просто предмет, предмет постоянного стёба. )))))))))
Я вот что хочу у вас спросить: если вы такой офигенно-разбирающийся в предмете специалист, если мой скетч считаете отборным говнокодом, то почему еще до сих пор не показали класс и не утерли мне нос, просто предложив свой изящный вариант, идеально учитывающий всю необходимую специфику?
Видишь ли, дебил ты контуженный, нормальные люди, не владея досконально теорией принципов управления ДВС, не пишут абы какие скетчи только ради самоутверждения! Но это явно не к тебе относится. Ты как затычка во все дырки, сначала обсираешься, потом истеришь кивая на других. ))))))))))
Собственно, пила:
Одна клетка = 2,5мс
Кого интересует мнение полного дегенерата? Заткнулись на котах? Вот и шипите себе под нос тихонько.
У нас с вами разделение труда: я красуюсь, вы выставляете себя дебилом. В итоге, все довольны.
Для меня твоё "вы выставляете себя дебилом" звучит как признание твоих собственных незнаний и несостоятельности, что ты неоднократно уже и демонстрировал. ))))))))
И что там где у вас "звучит", мне тоже не интересно. Вы напрасно тратите свое время. Я же, как занимался тем, что нахожу интересным, так и буду это делать впредь. Вопли всяких бакланов на мои решения никак не влияют.
вот график для валтеков показывающий время открытия и закрытия форсунок при 14в , при более низком напряжении есстественно время меняется, но разрабы такие данные уже не выкладывают.