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

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

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

Блок который постороен на ардуино отлично справляется своей работы, теперь хочу собрать блок на 102  мотор мерседес 90 года. У них система КЕ-Джетроник который управляется с механическими форсунками полностью отсутсвует импульсы управления. Нужно  считать обороты коленвала и датчик температуры  конечно ж датчик давления.

  

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

А что ГБО второго поколения выпускать уже перестали?

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

Гбо 2 поколение создает такие хлопки что дозатор инжектора потом не сможешь найти

Ciraretr
Offline
Зарегистрирован: 23.10.2016

Очень оплезная тема, сапсибо)

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

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

Может кончно по i2c быстрее будет, незнаю.

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

При нынешних ценах на али в 80 руб за про-мини 16мб, можно по отдельному ардуине ставить на каждую кнопку или датчик.

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

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

#define IN_1_PIN    2
#define OUT_1_PIN   8
#define OUT_1_PORT  PORTB0;

void setup() {
PORTB |=(1<<PB0);
}
uint32_t p_start;
uint16_t pulse=0;
 uint16_t p_ext =5000;
uint8_t prev_in_state = 0xFF;
 static uint32_t  p_last, mSpeed;
uint32_t formPulse;

void loop() {
   while (1) {
uint8_t in_state = PIND;              
  uint8_t currBit = 4;                  
  if ((in_state & currBit) != currBit) { // если на канале низкий уровень
  if ((prev_in_state & currBit) == currBit) { // если в прошлый раз был высокий    
  PORTB |= (1 << PB0);              // ставим высокий уровень на соотв. выходе
   }
  }
  else if ((prev_in_state & currBit) != currBit) { // вх. импульс закончился ?
        // вычисляем, при каком знач.счетчика micros надо гасить соотв. выход
  pulse = p_ext + micros();
 }
 else if ((signed long int)(pulse - micros()) <= 0) { // не надо ли гасить выход?
  PORTB &= ~(1 << PB0);   // гасим выход
      }
  prev_in_state = in_state; // сохраняем текущее состояние входов
   }
}

 

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

Извините нашел свою ошибку  на место uint16_t pulse=0 переписал на static uint32_t pulse;  все заработала как надо 

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

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

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

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

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

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

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

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

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

Расход процентов на 15 больше, у меня во всяком случае,

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

 

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

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

Форсунки откалибровал с начала микрометром, потом время открытие бенз форсунки зависить от состава смеси. Время открытие газ форсунок  такое же что на бенз форсунок на хх. Если бенз форсунка на хх 3мс то газ форсунка 5,2мс добавляется 2,2мс то есть 3 мс не меняется если он работает на газу или на бензине   

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

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

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

 

И по расходу газа, есть еще такие заправки которые умудряются 44 литра запихать в 42 литровый баллон в который влезает только 38 литров)))

 

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

Здравствуйте написал скетч который выдает пилу если входящий импльс больше 5,5мс, проблема такая вышла весь импульс сигнала если появляется пила на выходе передвигается в лево на 10мс и обратно возврашается это повоторяется через каждый 2-3 секунды. Ипмульс пилы должен быть в одном милисекунде два, а у меня получается 4 импульса. #define TOOTH_WIDTH влияет только на задержку включение пилы а не ширину зобам.


#define IN_1_PIN    2
#define OUT_1_PIN   8
#define OUT_1_PORT  PORTB0
#define TOOTH_WIDTH 10
volatile static uint8_t p_bitmap;
volatile static uint8_t tCnt;
void setup() {
DDRB |=(1<<PB0);
PORTB |=(1<<PB0);
  ASSR=(0<<EXCLK) | (0<<AS2);
   TCCR2A=(0<<COM2A1) | (0<<COM2A0) | (0<<COM2B1) | (0<<COM2B0) | (0<<WGM21) | (0<<WGM20);
   TCCR2B=(0<<WGM22) | (0<<CS22) | (1<<CS21) | (0<<CS20);
   TCNT2=0x00;
   OCR2A=0x00;
   OCR2B=0x00;
   TIMSK2=(0<<OCIE2B) | (0<<OCIE2A) | (1<<TOIE2); // прерывание по переполнению
}
  // p_ext -- знач. в мкс. доб. времени для каждого канала
uint16_t p_ext = 1000;
static uint32_t pulse;
static uint32_t pila;
static uint32_t pila3=5500;
uint8_t prev_in_state = 0xFF;

void loop() {
  
  while (1) {
   
  uint8_t in_state = PIND;              // фиксируем состояние всех 6-х входов
  uint8_t currBit = 4;                  // бит вх. порта, минус один
    if ((in_state & currBit) != currBit) { // если на канале низкий уровень
  if ((prev_in_state & currBit) == currBit) { // если в прошлый раз был высокий    
 
  PORTB |= (1 << PB0);              // ставим высокий уровень на соотв. выходе
  pila=pila3+micros();          // фиксируем начало импульса по каналу
   }
    }
  
  else if ((prev_in_state & currBit) != currBit) { // вх. импульс закончился ?
        // вычисляем, при каком знач.счетчика micros надо гасить соотв. выход
  pulse = p_ext + micros();
 }
else if ((signed long int)(pulse - micros()) <= 0) { // не надо ли гасить выход?
  PORTB &= ~(1 << PB0);   // гасим выход
  cli();
  p_bitmap &= ~(1 << PB0);            // отлючаем пилу на канале
  sei();    
  pila=0;    
      }
if(pila !=0) // если вых. импульс еще не закончился
{  
  if((signed long int)(pila - micros()) <= 0)//если больше 5,5мс появится пила на выходе 
  {
  cli();                            // запрещаем прерывания
  tCnt = TOOTH_WIDTH;             // передаем обработчику ширину "зуба"  
  sei();
  pila=0;
  }
}
  prev_in_state = in_state; // сохраняем текущее состояние входов
  } 
}

ISR(TIMER2_OVF_vect) {
  // просмотр всех элементов массива, которые могут содержать инф. о формировании
  // "зуба" импульса
    if (tCnt > 0) {                      // если найдено ненулевое значение
      if (--tCnt == 0) {                 // уменьшаем счетчик и если он встал в ноль
        p_bitmap |= (1 << PB0);               // поднимаем бит канала на котором нужна пила
      }
    }
  // переворачиваем все выходы, для которых установлен бит формирования пилы
  PORTB ^= p_bitmap;                       
}

   

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

вот график с осцилограммы 

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

Здравствуйте по пробовал про тестировать вот этот скетч который вы написали на нем тоже выходной импульс с пилой сдвигается в лево на 9мс в месте с входяшим импульсом периодический меняет свое расположение

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

"Вместе с входящим импульсом" -- это как? Если входной меняет свое положение, то и выход будет следовать за ним.

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

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

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

На входящий импульс ардуина влиять не может. Время, когда он возникает, определяется мозгами ЭБУ.

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

входяший импульс подавал с осцилографа и с триггера NE555 у обоих похожая ситуация 

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

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

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

может ли таймер пилы как то повлиять 

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

Скорее всего происходит срыв синхронизации осцилла, вот тот и двигает картинку по экрану. Реально же никакого сдвига нет.

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

в одном милисекунде получается 4 импульса пилы а должен быть 2 пилы импульса 

#define TOOTH_WIDTH 10

влияет только на задержку включения пилы 10 - получается 1 милисекунда

 

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

Смотрите внимательнее. "Зуб" -- 2.5мс, период импульсов "пилы" -- 0.5мс.

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

на 368 сообщении в графике видно период импульса зуба где то 0,25мс 

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

Добрый вечер прочитал документации про таймеров и нашел интересное. В скетче вы указали предделитель таймера TtB(1/16000000/8)=0.5мкс ,период зуба составляет 500мкс и того получается 500/0,5=1000 тактов 

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

Спасибо всем, сделал пилу импульса два периода на 1мс .Запустил таймер по совпадению и пила работает как надо 

ASSR=(0<<EXCLK) | (0<<AS2);
   TCCR2A=(0<<COM2A1) | (0<<COM2A0) | (0<<COM2B1) | (0<<COM2B0)| (1<<WGM21) | (0<<WGM20);
   TCCR2B=(0<<CS22) | (1<<CS21) | (1<<CS20)|(0<<WGM22);
   TCNT2=0x00;
   OCR2A=125;
   OCR2B=0x00;
   TIMSK2=(0<<OCIE2B) | (1<<OCIE2A) | (0<<TOIE2); // прерывание по свопадению

 

Xumuk
Xumuk аватар
Offline
Зарегистрирован: 03.03.2016

Yer пишет:

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

#define IN_1_PIN    2
#define OUT_1_PIN   8
#define OUT_1_PORT  PORTB0;

void setup() {
PORTB |=(1<<PB0);
}
uint32_t p_start;
uint16_t pulse=0;
 uint16_t p_ext =5000;
uint8_t prev_in_state = 0xFF;
 static uint32_t  p_last, mSpeed;
uint32_t formPulse;

void loop() {
   while (1) {
uint8_t in_state = PIND;              
  uint8_t currBit = 4;                  
  if ((in_state & currBit) != currBit) { // если на канале низкий уровень
  if ((prev_in_state & currBit) == currBit) { // если в прошлый раз был высокий    
  PORTB |= (1 << PB0);              // ставим высокий уровень на соотв. выходе
   }
  }
  else if ((prev_in_state & currBit) != currBit) { // вх. импульс закончился ?
        // вычисляем, при каком знач.счетчика micros надо гасить соотв. выход
  pulse = p_ext + micros();
 }
 else if ((signed long int)(pulse - micros()) <= 0) { // не надо ли гасить выход?
  PORTB &= ~(1 << PB0);   // гасим выход
      }
  prev_in_state = in_state; // сохраняем текущее состояние входов
   }
}

 

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

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

Здравствуйте а как вообще работает корректор спидометра 

Xumuk
Xumuk аватар
Offline
Зарегистрирован: 03.03.2016

Yer пишет:

Здравствуйте а как вообще работает корректор спидометра 

добрый день.Считывает частоту и корректирует ее на определенный коэфициент, например на входе 100гц, а на выходе допустим с коэфициэнтом 1,2 должно быть 120герц

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

Здравствуйте проверил импульсы бензиновых форсунок при езде с равнивая датчиком разрежения(МАП датчик),

на 1500 оборотах при скоросте 50км/час 4-4,5 мс подается на форсы и разряжения 0,18 Вольт показывает(на хх разрежения показывает 1,55Вольт). При езде на газу на тех же 1500 оборотах скорость 50км/ч 6,5-7мс на форсы подаются и разрежение 2,22 Вольт показывает. Резултат на газу при нагрузке на двигателя смесь обденяется и время открытие бензфорсунок увеличивается. Если подключит МАП датчик и ехать только на бензине и сохранять на каком разрежение на сколько времени открываются форсы, после этого при переключение на газ уже сохраненную карту(разрежение и время впырска) сравнивать  с текущем состоянием впрыска и разрежение добавлять на столько чтобы приблизится к бензиновому карту.   

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

МАП датчик на холостом показывает 1,55Вольт на максимальных оборотах 4,5 Вольт (1,55Вольт -0,6бар , 4,5Вольт -1 бар )