как выдавать импульсы

evgta
Offline
Зарегистрирован: 02.09.2016

Зачем мучаться когда мозги на гбо стоят 60 евро, у меня установлено гбо, там чтобы корректировать импульс на газовые форсунки берутся значения : длинна импульса бензиновой форсунки, температуры газа перед форсункой, давление в впускном коллекторе, давление газа перед форсункой. При объеме 350 кубиков на цилиндр длительность импульса составляет от 4 до 12 миллисекунд. На газовой форсунке примерно так же.

diger67
Offline
Зарегистрирован: 25.07.2015

bodriy2014 пишет:

diger67 пишет:

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

Думаю да, если в двигателе есть форсунки, значит он управляется электроникой.  

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

Не думаю что их нет, скорее их за денежку предоставят. Но как я понимаю человек хочет решить проблему опытным путем, при этом обладает не достаточными знаниями в данном вопросе. Иначе не спрашивал бы и сходу правильно сформулировал задачу.

diger67
Offline
Зарегистрирован: 25.07.2015

evgta пишет:
Зачем мучаться когда мозги на гбо стоят 60 евро, у меня установлено гбо, там чтобы корректировать импульс на газовые форсунки берутся значения : длинна импульса бензиновой форсунки, температуры газа перед форсункой, давление в впускном коллекторе, давление газа перед форсункой. При объеме 350 кубиков на цилиндр длительность импульса составляет от 4 до 12 миллисекунд. На газовой форсунке примерно так же.

Вот и ответ для задаваки a5021. Читайт самоучка. И так у тебя во всем.

bodriy2014
bodriy2014 аватар
Offline
Зарегистрирован: 12.05.2015

diger67

Согласен с вами.

У задачи которую хочет решить автор и которую мы клещами вытянули!) две сложности.

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

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

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

a5021
Offline
Зарегистрирован: 07.07.2013

bodriy2014 пишет:
Советую вместо loop использовать while, как показали мои замеры она в 2,6раза быстрее.

Ясен-красен быстрее. loop() -- это функци с потерями на call/ret по четыре такта. Плюс сохранение чего попало в стеке. А while это просто цикл из нескольких команд, который на одном месте крутится.

a5021
Offline
Зарегистрирован: 07.07.2013

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

Кто бы вам-то посочувоствовал? Последнее время вы так мучаетесь, смотреть невозможно. И такую херню вывороте и сякой бред сочините. Нет вам покоя.

На кой хрен вы сюда эту "обратную связь" тащите, можете сказать? Какой в ней тут прок, если импульсы существуют, даже если о их природе мы ничего не знаем. Задача ведь простая -- появился импульс, нужно его расширить. А какие там связи и зонды где-то где-то есть, да пофиг.

diger67 пишет:
Вот и ответ для задаваки a5021. Читайт самоучка. И так у тебя во всем.

В чем "во всем", неадекватушка? О чем эти вопли?

Человек спросил, как ему сделать то-то и то-то. Я подсказал. Не, заваливаются специалисты по всем вопросам и начинают объяснять ТС-у, как ему его задачу заменить на другую. О чем был вопрос? Ведь не о том, как ему авто на газ перевести. Пока он не объяснит, мы вообще не знаем, что и зачем он делает.

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

bodriy2014 пишет:

Штатные мозги авто в алюминием кейсе и схематически защищены от всех помех.

Мало того! Не знаю, у всех ли авто, но у меня там и пайки-то то не - везде сварка.

bodriy2014
bodriy2014 аватар
Offline
Зарегистрирован: 12.05.2015

ЕвгенийП пишет:

Мало того! Не знаю, у всех ли авто, но у меня там и пайки-то то не - везде сварка.

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

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

Ну, это-то все моделисты знают.

diger67
Offline
Зарегистрирован: 25.07.2015

a5021 пишет:

На кой хрен вы сюда эту "обратную связь" тащите, можете сказать? Какой в ней тут прок, если импульсы существуют, даже если о их природе мы ничего не знаем. Задача ведь простая -- появился импульс, нужно его расширить. А какие там связи и зонды где-то где-то есть, да пофиг.

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

a5021 пишет:

В чем "во всем", неадекватушка? О чем эти вопли?

Стонаешь ты, я высказываюсь так как понимаю вопрос, если я в чем то не прав, приведи аргумент кроме "это идея неправильная, я лучше знаю"

 

di_mot
Offline
Зарегистрирован: 12.08.2016

diger67 пишет:

Потому что от сигналов обратной связи напрямую зависит ширина управляющего импульса....

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

А про нью-китайцев двухколесных - даже упоминать не буду.

a5021
Offline
Зарегистрирован: 07.07.2013

diger67 пишет:
Потому что от сигналов обратной связи напрямую зависит ширина управляющего импульса и они расчитаны для работы двигателя на топливе с определенными физикохимическими свойствами.

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

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

Цитата:
если я в чем то не прав, приведи аргумент кроме "это идея неправильная, я лучше знаю"

Топикстартер спросил, как ему импульс шире сделать. Я сказал, как. Но тут понабежала куча народу с "идеями" и ну их толкать во все щели сообразно своему пониманию или непонимаю темы. Если бы я был топикстартером, то наверное бы послал всех носителей уникальных идей к едреням, вместе со своими идеями, о которых их никто не спрашивал.

ВН
Offline
Зарегистрирован: 25.02.2016

di_mot пишет:
И как только без нее, обратной связи, работают карбюраторные двиги?

ремень ГРМ отцепи и езжай себе дальше .... без обратной связи

обратнее уж точно не придумашь .... 

di_mot
Offline
Зарегистрирован: 12.08.2016

ВН пишет:

ремень ГРМ отцепи и езжай себе дальше .... без обратной связи

обратнее уж точно не придумашь .... 

Это прямой привод механизма, а не обратная связь. :-)))

Считай это ключевой транзистер в цепи управления светиком.

Бо есть двиги не с ремнем, а шестеренками или цепью в приводе валов ГРМ.

С ними как и где там ОС? Фиксированный КУ и только. :-)

К примеру у 4-х тактной Хонды, в верхневальном ГРМ, валы всегда(!) крутятся в 2 раза медленнее, чем коленвал. Вне зависимости от кол-ва оборотов последнего, ни от качечества топливной смеси на входе в цилиндр, ни от качества бизина, ни от степени загрязнянности воздушного фильтра, ни от напряжения бортовой сети, ни от температуры горения смеси в цилиндре. И тд и тп.

- Ы?

 

evgta
Offline
Зарегистрирован: 02.09.2016

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

a5021
Offline
Зарегистрирован: 07.07.2013

ВН пишет:
ремень ГРМ отцепи и езжай себе дальше .... без обратной связи

Механическое движение в ДВС, возникнув в цилиндрах, передается в направлении поршни->шатуны->коленвал и далее через систему распределения в различные точки двигателя и к навесному оборудованию. Ремень ГРМ передает вращение от коленвала к распредвалу и ничего в обратном направлении. С этой точки зрения, никаких функций обратной связи ремень ГРМ не выполняет.

Цитата:
обратнее уж точно не придумашь ....

Может, вы плохо придумывали? Может, нужно попридумывать еще?

a5021
Offline
Зарегистрирован: 07.07.2013

evgta пишет:
Для газовых мозгов обратная связь побоку,

[...]

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

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

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

evgta
Offline
Зарегистрирован: 02.09.2016

Но это не отменяет того что гораздо проще купить газомозги вместе с необходимыми датчиками и проводкой всего за 60 евро.

a5021
Offline
Зарегистрирован: 07.07.2013

Мы не знаем, чем занимается ТС. Меня смущают три форсунки. Трехцилиндровые автомобильные движки конечно существуют, но встречаются не очень часто. Есть в продаже газмозги на три цилиндра? Я не копенгаген в вопросах ГБО, т.ч. тут темой не владею.

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

Yer
Offline
Зарегистрирован: 12.02.2016

Здравствуйте всем извеняюсь что долго не отвечал я сам не ожидал что моя тема всех так затронит всем большой респект.Машина мерседес W210 104 двигатель шестицилиндровый обьем 2,8.Кто может подсказать как можно рассчитать входящий импульс с каждого цилиндра,можно ли вообще использовать pulseIn или нет(pulseIn пробовал с одним цилиндром хорошо справляется).И как можно выдавать уже выходные импульсы которых можно корректировать чтобы добится нормальной смеси.(мне легче понимается на языке с++ так как еще опыта в ардуино маловато) 

ВН
Offline
Зарегистрирован: 25.02.2016

a5021 пишет:
Механическое движение в ДВС, возникнув в цилиндрах, передается в направлении поршни->шатуны->коленвал и далее через систему распределения в различные точки двигателя и к навесному оборудованию.Ремень ГРМ передает вращение от коленвала к распредвалу и ничего в обратном направлении. 

С этой точки зрения, никаких функций обратной связи ремень ГРМ не выполняет.

просто апофеоз глупости

 

diger67
Offline
Зарегистрирован: 25.07.2015

ВН пишет:

a5021 пишет:
Механическое движение в ДВС, возникнув в цилиндрах, передается в направлении поршни->шатуны->коленвал и далее через систему распределения в различные точки двигателя и к навесному оборудованию.Ремень ГРМ передает вращение от коленвала к распредвалу и ничего в обратном направлении. 

С этой точки зрения, никаких функций обратной связи ремень ГРМ не выполняет.

просто апофеоз глупости

 

Наверное ВЫ как и я неадекватны, потому что "все модули и оборудование в машине работают независимо друг от друга" и вообще сигналы обратной связи это зло как в аналогоыой так и в цифровой технике. о_О

evgta
Offline
Зарегистрирован: 02.09.2016

diger67 пишет:

как и я неадекватны, потому что "все модули и оборудование в машине работают независимо друг от друга" и вообще сигналы обратной связи это зло как в аналогоыой так и в цифровой технике. о_О

В авто обратную связь дает лямбда зонд, датчик положения КВ и датчик абсолютного давления во впускном коллекторе, без них неполучится обеспечить правильный состав смеси. ДАД обеспечивает быструю реакцию на изменение режимов работы, ДПКВ: замер оборотов, моменты впрыска и зажигатия, лямбда на точную начтройку стереохимического состава смеси.

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

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

diger67
Offline
Зарегистрирован: 25.07.2015

evgta пишет:

diger67 пишет:

как и я неадекватны, потому что "все модули и оборудование в машине работают независимо друг от друга" и вообще сигналы обратной связи это зло как в аналогоыой так и в цифровой технике. о_О

В авто обратную связь дает лямбда зонд, датчик положения КВ и датчик абсолютного давления во впускном коллекторе, без них неполучится обеспечить правильный состав смеси. ДАД обеспечивает быструю реакцию на изменение режимов работы, ДПКВ: замер оборотов, моменты впрыска и зажигатия, лямбда на точную начтройку стереохимического состава смеси.

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

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

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

evgta
Offline
Зарегистрирован: 02.09.2016

diger67 пишет:

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

И на кой всю простынь цитировать?

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

Yer
Offline
Зарегистрирован: 12.02.2016

Я с вами полностью согласен если смотреть по оссцилографу 1-2 цилиндром и 2-3 цилиндром там разница только на периудах импульса.Время периода между 1-3 цилиндром 55мс,1-2 цилиндром 110мс.Длительность импульса на всех цилиндрах одинаково 2,5мс.Проблема не в технологий как работает двигатель а как принимать имплуьсы с каждого цилиндра и выдавать уже с выхода ардуино немножко продлив время импульса.Давайте не будем спорит про лямбда зонд и тд.Есть конкретная задача возможно ли его решение и как это делается.Заранее всем спасибо      

evgta
Offline
Зарегистрирован: 02.09.2016

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

Yer
Offline
Зарегистрирован: 12.02.2016

По идее нам понадобится 3 канала прерывания так как зажигания с 1-6,2-5,3-4 цилиндром одиноковые преиоды идут.На ардуино уно все лишь 3 входа прерывания если не ошибаюсь 

a5021
Offline
Зарегистрирован: 07.07.2013

Как-как.. Вот как:

/* Main.ino file generated by New Project wizard
 *
 * Processor: ATmega328P
 * Compiler:  Arduino AVR
 */

#define WIDTH_MUL	0.3 
 
#define IN_1_PIN	5
#define IN_2_PIN	6
#define IN_3_PIN	7

#define IN_MASK 	((1 << IN_1_PIN) | (1 << IN_2_PIN) | (1 << IN_3_PIN))

#define IS_PIN_LOW(PIN) ((PIND & PIN) != PIN)

#define OUT_1_PIN	9
#define OUT_2_PIN	10
#define OUT_3_PIN	11

#define OUT_1_PORT	PORTB1
#define OUT_2_PORT	PORTB2
#define OUT_3_PORT	PORTB3

#define OUT_MASK	((1 << OUT_1_PORT) | (1 << OUT_2_PORT) | (1 << OUT_3_PORT))

#define FORCE_PIN_LOW(PIN) PORTB &= ~(1 << PIN)

 
void setup() {
      // инициализируем входы
  for (int i = IN_1_PIN; i < IN_3_PIN + 1; i++) {
    pinMode(i, INPUT);
  }
      // инициализируем выходы
  for (int i = OUT_1_PIN; i < OUT_3_PIN + 1; i++) {
    pinMode(i, OUTPUT);
    digitalWrite(i, HIGH);
  }
}

uint32_t p_start, p_stop, p_width;
uint8_t in_state;

void loop(){
  in_state = PIND & IN_MASK;                // берем состояние всех 3-х входов
  if ((in_state & IN_MASK) != IN_MASK) {    // есть ли хоть один вход в LOW
    p_start = micros();                     // запомнили время прихода имп.
      // состояние входов точно зеркалим на выходы
    in_state ^= IN_MASK;        
    PORTB &= ~(in_state >> 4);
    
    while((PIND & IN_MASK) != IN_MASK);     // ждем, пока имульс закончится
    p_stop = micros();                      // фиксируем время окончания
    p_width = p_stop - p_start;             // вычисляем сколько длился вх. имп.
    delayMicroseconds(p_width * WIDTH_MUL); // добавляем к длит. вых. имп.
    PORTB |= OUT_MASK;                      // закончили, все выходы в HIGH
  }
}


Весь алгоритм -- десять строк. Без всяких прерываний, таймеров и прочей зауми.

Пины 5-7 ардуины -- это входы, 9-11 выходы. Коэффициент уширения задается в дифайне WIDTH_MUL. Остальное работает автоматически.

Пруф-картинко:

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

Одна клетка -- это пять вольт и одна миллисекунда.

Коэффициент "уширения" задан 0.3, т.е. импульсы на выходах длятся на треть дольше, чем на входах.

evgta
Offline
Зарегистрирован: 02.09.2016

на уно 2 канала прерывания

a5021
Offline
Зарегистрирован: 07.07.2013

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

evgta
Offline
Зарегистрирован: 02.09.2016

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

Yer
Offline
Зарегистрирован: 12.02.2016

а5021 спасибо что откликнулся я твой скетч проверил на ардуино уно,на вход 5 подал импулсь с периодом 40мс время импульса 2,5мс на выходе никаких изменений нету может где то я не правильно сделал

a5021
Offline
Зарегистрирован: 07.07.2013

А что является источником импульсов? Какие параметры известны помимо длительности?

Yer
Offline
Зарегистрирован: 12.02.2016

двух канальный осцилограф можно выдавать прямоугольные импульсы но только с одного канала.Время периода и длительность импульса может изменять по желанию 

a5021
Offline
Зарегистрирован: 07.07.2013

Уровни какие? Напряжение? Полярность?

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

Yer
Offline
Зарегистрирован: 12.02.2016

напряжение 5В полярность + 

andriano
andriano аватар
Offline
Зарегистрирован: 20.06.2015

evgta пишет:

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

1. 6 каналов прерывания не нужны, можно обойтись двумя: один на один какой-нибудь цилиндр, другой - на все остальные через диоды. Достаточно того, что цилиндры работают в строго определенной последовательности, т.е. нам нужно знать момент начала последовательности и моменты поступления каждого из импульсов.

2. Многозадачность здесь и не нужна - импульсы идут строго по очереди и не могут перекрываться.

a5021
Offline
Зарегистрирован: 07.07.2013

Yer пишет:
напряжение 5В полярность +

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

ssss
Offline
Зарегистрирован: 01.07.2016

andriano пишет:

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

Ну да! Ещё нужны карты таро или рентген, чтобы быть уверенным что первым будет именно этот "один какой-нибудь цилиндр". )))))))))))))))

a5021
Offline
Зарегистрирован: 07.07.2013

Какие таймеры, какие диоды.. Десять строк весь код, зачем еще прерывания?

Yer
Offline
Зарегистрирован: 12.02.2016

Если вам не трудно можете обяснит скажем 5 вход когда сработал он должен включит 9,6 вход 10 выход,7 вход 11 выход как все это работает.Заранее спасибо  

Yer
Offline
Зарегистрирован: 12.02.2016
#define IN_1_PIN    5
#define IN_2_PIN    6
#define IN_3_PIN    7
#define IN_MASK     ((1 << IN_1_PIN) | (1 << IN_2_PIN) | (1 << IN_3_PIN))
#define IS_PIN_LOW(PIN) ((PIND & PIN) != PIN)
#define OUT_1_PIN   9
#define OUT_2_PIN   10
#define OUT_3_PIN   11
#define OUT_1_PORT  PORTB1
#define OUT_2_PORT  PORTB2
#define OUT_3_PORT  PORTB3
#define OUT_MASK    ((1 << OUT_1_PORT) | (1 << OUT_2_PORT) | (1 << OUT_3_PORT))
#define FORCE_PIN_LOW(PIN) PORTB &= ~(1 << PIN)
 
вот этот код как можно понять кроме входов и выходов ардуино остальные мне лично не понятно 
Jeka_M
Jeka_M аватар
Offline
Зарегистрирован: 06.07.2014

Цитата:

вот этот код как можно понять

Гуглить битовые операции, прямое управление портами и регистры микроконтроллера

a5021
Offline
Зарегистрирован: 07.07.2013

IN_x_PIN -- вход канала х;

OUT_x_PIN -- выход канала х;

IN_MASK -- биты/сост.пинов всех трех входов. Используется для контроля всех трех входов одновременно.

IS_PIN_LOW(PIN) -- возвращает "истинно", если PIN находистя в сост. LOW. В скетче не используется, представлен для нужд отладки.

OUT_MASK -- биты/сост.пинов всех трех выходов. Используется, чтобы все выходы перевести в состояние HIGH.

FORCE_PIN_LOW(PIN) -- устанавливает на вых. пине состояние LOW. В скетче не используется, представлен для нужд отладки.

Используются они так: чтобы узнать, не поступил ли на какой вход нужный импульс (не перешел ли пин в состояние LOW) производится операция логического "И" над битам входных пинов. Если ни на один пин не пришел отрицательный импульс, то операция побитового "И"  (PORTD & IN_MASK) результатом будет иметь всегда значение равное IN_MASK. Если хотя бы один бит ушел в LOW, то условия равенства не будет выполнятся. Применение маски удобно тем, что не нужно проверять каждый пин. Все входные пины можно проверять одним действием:

if ((PORTD & IN_MASK) != IN_MASK) {      // блок внути if будет выполнен, если хотя бы один пин в LOW

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

Пины, что входные, что выходные, идут по порядку. Правда, номера битов портов входных и выходных пинов не совпададают. Они смещены на 4 разряда

Канал 1  -- вход PORTD бит 5 -- выход PORTB бит 1;

Канал 2  -- вход PORTD бит 6 -- выход PORTB бит 2;

Канал 3  -- вход PORTD бит 7 -- выход PORTB бит 3;

поэтому, чтобы пробросить состояние входов на выходы, надо сдвинуть входные биты вправо на 4 разряда. Например, конструкция вида

PORTB = PORTD >> 4;

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

Недостаток такого способа в том, что пробрасываются между входом и выходом не только нужные биты, но и все остальные. Это не очень хорошо, т.к. другие биты порта могут быть использованы для иных надобностей и трогать их бы не надо. Для того, чтобы пробрасывать только нужные биты и не трограть остальные, в скетче из сообщения №79 используется немного более усложненная техника:

in_state ^= IN_MASK;
PORTB &= ~(in_state >> 4);

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

Дальше просто остается подождать время, требующееся для формирования нужной длительности и поднять все пины в HIGH.

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

PS. Вы разобрались с формой импульсов с генератора для подачи на вход ардуины?

Yer
Offline
Зарегистрирован: 12.02.2016

Спасибо вам большое разобрался с импульсами генератора все отлично работает.Теперь мне нужно немножко изменить код выхода сигнала чтобы наоборот зеркально отобразит входяший входной сигнал.Так как логические транзисторы(транзисторы газовых форсунок) у меня работает с положительными импульсами с ардуино.И еще один вопрос если можно определять входящий импулсь на 3 входах ардуино и подавать также 3 выхода тогда можно ли точно так же определять и 6 входов...Заранее спасибо  

a5021
Offline
Зарегистрирован: 07.07.2013
/* Main.ino file generated by New Project wizard
 *
 * Processor: ATmega328P
 * Compiler:  Arduino AVR
 */

#define WIDTH_MUL	0.3 
 
#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 IN_MASK 	((1 << IN_1_PIN) | (1 << IN_2_PIN) | (1 << IN_3_PIN) | (1 << IN_4_PIN) | (1 << IN_5_PIN) | (1 << IN_6_PIN))

#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 OUT_1_PORT	PORTB0
#define OUT_2_PORT	PORTB1
#define OUT_3_PORT	PORTB2
#define OUT_4_PORT	PORTB3
#define OUT_5_PORT	PORTB4
#define OUT_6_PORT	PORTB5

#define OUT_MASK	((1 << OUT_1_PORT) | (1 << OUT_2_PORT) | (1 << OUT_3_PORT) | (1 << OUT_4_PORT) | (1 << OUT_5_PORT) | (1 << OUT_6_PORT))

void setup() {
      // инициализируем входы
  for (int i = IN_1_PIN; i < IN_6_PIN + 1; i++) {
    pinMode(i, INPUT);
  }
      // инициализируем выходы
  for (int i = OUT_1_PIN; i < OUT_6_PIN + 1; i++) {
    pinMode(i, OUTPUT);
    digitalWrite(i, LOW);
  }
}

uint32_t pulse;
uint8_t in_state;

void loop(){
  in_state = PIND & IN_MASK;              // берем состояние всех 6-х входов
  if ((in_state & IN_MASK) != IN_MASK) {  // есть ли хоть один вход в LOW
    pulse = micros();                     // запомнили время прихода имп.
      // состояние входов переворачиваем и точно отображаем на выходы
    in_state ^= IN_MASK;        
    PORTB |= (in_state >> 2);
    
    while((PIND & IN_MASK) != IN_MASK);   // ждем, пока имульс закончится
    pulse = micros()- pulse;              // вычисляем сколько длился вх. имп.
    delayMicroseconds(pulse * WIDTH_MUL); // добавляем к длит. вых. имп.
    PORTB &= ~OUT_MASK;                   // закончили, все выходы в LOW
  }
}

 

Yer
Offline
Зарегистрирован: 12.02.2016

Спасибо большое по пробую на двигателе

a5021
Offline
Зарегистрирован: 07.07.2013

Расскажите, что получится. Интересно.

Yer
Offline
Зарегистрирован: 12.02.2016

Завтра по пробую подключится к форсункам двигателя если нормально будет считать и выдавать имплуьсы на выходе тогда можно уже газовые форсунки подключит и подавать газ