Страница 1 из 3 123 ПоследняяПоследняя
Показано с 1 по 10 из 26
  1. #1
    Продвинутый
    Регистрация
    28.11.2010
    Возраст
    59
    Сообщений
    241
    Вес репутации
    214

    По умолчанию Генератор работы форсунок инжекторного двигателя

    Создал - работает, но появилось несколько вопросов в программировании.

    1. Есть ли вариант работать по ком-порту в фоновом режиме?
    2. Аналогичный вопрос по работе с WH1602C?
    3. Или как более лучший вариант - генерировать подобные импульсы в фоне?

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

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

    Вот рабочий вариант и видео с осциллографа. Типа параллельный впрыск.
    PHP код:
     #include <LiquidCrystal.h> 
     
    LiquidCrystal lcd(1211105432);
     
     
    unsigned int pauza0,   // Длительность паузы перед первым впрыском ( мкс )
                  
    vprysk1,  // Длительность импульса первого впрыска ( мкс )
                  
    pauza1,   // Длительность паузы перед вторым впрыском ( мкс )
                  
    vprysk2 // Длительность импульса второго впрыска ( мкс )
    unsigned long pauza2,   // Длительность паузы после второго впрыска ( мкс )
                  
    period ;  // Период работы форсунки ( мкс )
      
    void setup()
    {
        
    pinMode(49OUTPUT); // Строб 
        
    pinMode(50OUTPUT); // Форсунка № 1
        
    pinMode(51OUTPUT); // Форсунка № 2
        
    pinMode(52OUTPUT); // Форсунка № 3
        
    pinMode(53OUTPUT); // Форсунка № 4
      //Serial.begin(115200);
      //lcd.begin(16, 2);
    }

    void loop()
    {
         
    AnalogIn() ;
              
    pauza2 period - ( pauza0 vprysk1 pauza1 vprysk2 1040 ) ;// Вычисление последней паузы
              
    if ( pauza2 pauza2 ;                                    // Не допускаем перекрытия
              
    unsigned int pauzaMs pauza2 1000 ;                            // Длительности последней паузы ( милисекунды )
              
    unsigned int pauzaMk pauza2 - ( pauzaMs 1000 ) ;              // Длительности последней паузы ( микросекунды )
         
    Metka() ;
              
    delayMicroseconds(pauza0);       
         
    ForsOpen() ;         
              
    delayMicroseconds(vprysk1);
         
    ForsClose() ;
              
    delayMicroseconds(pauza1);
         
    ForsOpen() ;
              
    delayMicroseconds(vprysk2);
         
    ForsClose() ;
              
    delay(pauzaMs);
              
    delayMicroseconds(pauzaMk);
       
    //LcdOut() ;
       //SerialOut() ;
    }

    void ForsClose() // Закрытие форсунок
    {
              for (
    int i=5054i++){
              
    digitalWrite(iLOW);
              } 
    }
    void ForsOpen() // Открытие форсунок
    {
              for (
    int i=5054i++){
              
    digitalWrite(iHIGH);
              }
    }
    void SerialOut() // Вывод данных по ком-порту
    {
      
    Serial.print("pauza0="); 
      
    Serial.print(pauza0); 
      
    Serial.print(" vprysk1="); 
      
    Serial.print(vprysk1);
      
    Serial.print(" pauza1="); 
      
    Serial.print(pauza1);
      
    Serial.print(" vprysk2="); 
      
    Serial.print(vprysk2);
      
    Serial.print(" pauza2="); 
      
    Serial.print(pauza2);
      
    Serial.print(" period="); 
      
    Serial.println(period); 
    }
    void LcdOut() // Вывод данных на ЖКИ
    {
        
    lcd.clear();
        
    lcd.setCursor(00);
        
    lcd.print(pauza0);
        
    lcd.setCursor(60); 
        
    lcd.print(vprysk1);
        
    lcd.setCursor(110);
        
    lcd.print(pauza1);
        
    lcd.setCursor(01); 
        
    lcd.print(vprysk2);
        
    lcd.setCursor(81); 
        
    lcd.print(pauza2);
    }
    void AnalogIn() // Чтение задающих параметров с потенциометров
    {
        
    period map (analogRead(0), 0102325000010000) ;      
        
    pauza0 map (analogRead(1), 01023116200) ;
        
    vprysk1 map (analogRead(2), 01023116200) ;          
        
    pauza1 map (analogRead(3), 0102315000) ;
        
    vprysk2 map (analogRead(4), 01023116200) ;
    }
    void Metka() //Стробирующий импульс ( 1 ms )
    {
        
    digitalWrite(49HIGH);
        
    delay(1);            
        
    digitalWrite(49LOW);   

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

  2. #2
    Модератор
    Регистрация
    06.07.2008
    Возраст
    46
    Сообщений
    414
    Вес репутации
    436

    По умолчанию Re: Генератор работы форсунок инжекторного двигателя

    Можно и форсунки сделать фоном и так, чтобы отправка данных в uart не влияла на форсунки. И даже данные выгружать в ЖКИ фоном.
    Если нужна точность в единицы микросекунд, то придется забыть про написание в среде arduino. Нужно будет по таймеру работать с форсунками (я так понимаю, это единственное, что требует большой временной точности), потребуется библиотека uart, которая не выключает прерывание на заметное время. Затем на другой таймер повесить вывод в LCD, организовав буфер.
    Во всех прерываниях, кроме таймера форсунок надо будет разрешать прерывания и аккуратно смотреть за временем выполнения обработчика прерывания.

    Точно надо забыть про функцию digitalWrite, которая съедает единицы микросекунд.

  3. #3
    Продвинутый
    Регистрация
    28.11.2010
    Возраст
    59
    Сообщений
    241
    Вес репутации
    214

    По умолчанию Re: Генератор работы форсунок инжекторного двигателя

    Цитата Сообщение от SBorovkov Посмотреть сообщение
    Можно и форсунки сделать фоном и так, чтобы отправка данных в uart не влияла на форсунки. И даже данные выгружать в ЖКИ фоном.
    Если нужна точность в единицы микросекунд, то придется забыть про написание в среде arduino. Нужно будет по таймеру работать с форсунками (я так понимаю, это единственное, что требует большой временной точности), потребуется библиотека uart, которая не выключает прерывание на заметное время. Затем на другой таймер повесить вывод в LCD, организовав буфер.
    Во всех прерываниях, кроме таймера форсунок надо будет разрешать прерывания и аккуратно смотреть за временем выполнения обработчика прерывания.

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

    Не подскажите ресурс по работе с таймерами под ХХХдуино, даже если и не для моего процика, наоборот закрепится лучше. Или может есть готовые библиотеки и подобные примеры?
    Заранее спасибо.
    Последний раз редактировалось Mastar; 10.12.2010 в 22:05.

  4. #4
    Администратор Аватар для Chip
    Регистрация
    08.06.2007
    Возраст
    54
    Сообщений
    13,379
    Вес репутации
    10

    По умолчанию Re: Генератор работы форсунок инжекторного двигателя

    вот здесь пример быстрой работы с портами и с таймером http://www.compcar.ru/forum/showthread.php?t=5869

  5. #5
    Продвинутый
    Регистрация
    28.11.2010
    Возраст
    59
    Сообщений
    241
    Вес репутации
    214

    По умолчанию Re: Генератор работы форсунок инжекторного двигателя

    Крыша пухнет, а разобраться так и не получилось...

    Подскажите как в фоне общаться через ком-порт, а именно, чтение из порта данных?

  6. #6
    Продвинутый
    Регистрация
    28.11.2010
    Возраст
    59
    Сообщений
    241
    Вес репутации
    214

    По умолчанию Re: Генератор работы форсунок инжекторного двигателя

    Цитата Сообщение от Chip Посмотреть сообщение
    вот здесь пример быстрой работы с портами и с таймером http://www.compcar.ru/forum/showthread.php?t=5869
    И тут не все до конца разобрался...
    У меня получается, что не возможно (наверно я просто не разобрался еще ) задать шим относительно высокой частоты и не дикретный, а плавный.
    Я думал задавать 2 параметра длительности единицы и ноля, например: 60 мкс - единица и 40 мкс нолик, получается 10 кГц и скважность 60%, а как сделать так и не догнал.
    Выручайте.
    Последний раз редактировалось Mastar; 14.12.2010 в 07:33.

  7. #7
    Модератор
    Регистрация
    06.07.2008
    Возраст
    46
    Сообщений
    414
    Вес репутации
    436

    По умолчанию Re: Генератор работы форсунок инжекторного двигателя

    Mastar, ты лезешь туда, где с кодом Arduino и его средой становится тесновато.

    ШИМ на AVR микроконтроллерах можно создавать двумя способами:
    1. аппаратный ШИМ. Создается только на определенных выводах и с некоторыми ограничениями. Читай мануал на atmega168/328 чтобы узнать какие ограничения существуют и как ШИМ программируется.

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

    С какой точностью в микросекундах тебе нужны импульсы? Точность в 1 мкс для нескольких каналов недостижима для софтверного ШИМ.
    Думаю, максимум, во что можно уложиться будет примерно 1мкс+
    1мкс*количество каналов. Это если забыть про среду arduino и считать такты в отладчике.

  8. #8
    Модератор
    Регистрация
    06.07.2008
    Возраст
    46
    Сообщений
    414
    Вес репутации
    436

    По умолчанию Re: Генератор работы форсунок инжекторного двигателя

    По поводу чтения данных - родная библиотека uart наверняка использует прерывание прихода символа и по этому прерыванию записывает принятый символ в буфер. Тебе нужно в фоне не только принимать символы но и обрабатывать приходящую информацию?
    По-момему обычно всю реально real-time работу выполняют по прерываниям. Приходящую информацию по относительно медленному com порту обычно можно обработать с небольшим запозданием. Поэтому такую работу как раз может быть лучше выполнять в основном цикле программы (разбирая скопившиеся в буфере данные).

  9. #9
    Продвинутый
    Регистрация
    28.11.2010
    Возраст
    59
    Сообщений
    241
    Вес репутации
    214

    По умолчанию Re: Генератор работы форсунок инжекторного двигателя

    Как я писал ранее, эта моя затея предназначена для работы на столе и абсолютно не критичны единицы микросекунд. Думаю точность импульсов в 10-50 µs достаточна.
    __________________________________________________ _______________________

    На примере 4-х цилиндрового 4-х тактного двигателя и когда полный цикл работы всех цилиндров проходит за два оборота двигателя, есть несколько видов впрыска бензина:

    Моно-впрыск - он ушел из жизни, как лампы из компьютеров. Не рассматриваем .

    Параллельный - (тоже не стоит рассматривать, но они еще бороздят наши просторы, поэтому учтем)

    - это когда, все четыре форсунки открываются одновременно через такт. При диапазоне оборотов 600...6000 об\мин, что равно 10...100 об\сек и соответственно период импульсов впрыска получается 100...10 ms, а время впрыска находится на этих "авто" в диапазоне 1...10 ms.
    Тут исходные данные ( период = 100...10 ms, импульс = 1...10 ms ).

    Попарный подобное паралельному, но через такт .
    Тут исходные данные такие же ( период = 100...10 ms, импульс впрыска = 1...10 ms ), но есть варианты управления форсунками и до 20 ms.

    Последовательный - это когда, каждый цилиндр получает именно свою порцию топлива, Получается, что при длительности периода импульсов, примерно Х.Х.(Холостого Хода = 600 rpm) бывает 2...4 ms и под нагрузой 20...30 ms, а на чипованных машинах встречается и 40 ms времени впрыска .

    Тут нормальные исходные данные ( период = 200...20 ms, импульс впрыска= 2...20 ms ). На холостом можно и 50 ms задать, главное не попасть в постоянное открытие форсунок

    _______________________________________

    Получается, что мне нужно формировать стабильные импульсы впрыска в диапазоне 1-40 ms с точностью, ну хоть в 10% и периодом до 200 ms с такой же точностью, но зто не мгновенные изменения оборотов(периода) или длительности впрыска , а типа выбора из меню диагностики и могут измениться, к примеру, раз в 300...500 ms.
    _______________________________________


    Задача №1. Генерация простых импульсов форсунок.

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




    Задача №2. Генерация сложных импульсов форсунок.

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



    Задача №3. Генерация импульсов для тестирования низкоомных форсунок.

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

    Суть такова, что если для ускорения открытия форсунки приложить максимум напряжения (получим максимум скорости открытия), а потом для удержания форсунки использовать ШИМ и ток самоиндукции, то можно экономить на выделении тепла и затратам энергии, а по завершении импульса удержания, можно ускорить возврат форсунки в закрытое состояние, переведя ключевой каскад в 3-е состояние .
    Примерный аналог ключа VN380, на него нужно на канал А подавать полный импульс открытия и на канал В подавать сигнал накачки с ШИМ-ом (5...20 кГц при скважности 20...80%, в зависимости от типа форсунок!). В этом ключе есть еще и диагностика на К.З., обрыв и и прочее. Это интересно, но наверно будет задачей № 22 .




    Задача №4 Полноценный распределенный впрыск

    Аналог одноканального распределенного впрыска, но со смещением 1\4 периода на каждый цилиндр, с возможностью управления и до-впрысками и экстра-впрысками.

    Тут проблема в том, что например, в цилиндре №1 еще не отработаны свои варианты, а в это время уже формируются импульсы в цилиндре №3 и т.д.

    ...................

    Надо было мне сразу все озвучить в пером посту.

    P.S. Я специалист в установке ГБО на автомобили VIP-класса и просто человек, который не хочет ставить фуфло, вот и постоянно изобретаю всякую фигню для тестов продаваемого оборудования и любезно делюсь наработанными и проверенными данными на форумах, типа CarHelp и GasHelp, зовут меня так же = Mastar (Mastylo Artur = Мастыло Артур)


    Думаю теперь шпиёнов тут нет?

  10. #10
    Продвинутый
    Регистрация
    28.11.2010
    Возраст
    59
    Сообщений
    241
    Вес репутации
    214

    По умолчанию Re: Генератор работы форсунок инжекторного двигателя

    Цитата Сообщение от SBorovkov Посмотреть сообщение
    Mastar, ты лезешь туда, где с кодом Arduino и его средой становится тесновато.........
    Понимаю, но вариант "Учиться никогда не поздно!" это мне наверно не под силу, именно Ардуина заинтересовла своей видимой простотой. Я еще в начале этого века присел на LabView, не скажу, что в совершенстве освоил, но все свои "виндовые" и не шустрые приложения я делал там, а тут решил поближе подойти к МК, думал тут спасение .
    Честно скажу, к низкоуровневым языкам - путь закрыт, мне проще взять 561 логику с добавлением 555 таймеров и сделать за час-другой подобное, но хочется именно с Ардуиной позаниматься.

    Цитата Сообщение от SBorovkov Посмотреть сообщение
    Тебе нужно в фоне не только принимать символы но и обрабатывать приходящую информацию?
    Нет, рассчитывать буду на ноуте и посылать готовые данные для генерации.
    Но вот когда "закрываю крышку" должен работать в автономе с аналоговых портов, как в первом примере или при помощи LCD посредством кнопок.

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


    p.s. У меня планшетник, управляю генератором - пальцем. Удобно и показательно.
    Последний раз редактировалось Mastar; 15.12.2010 в 06:20.

Страница 1 из 3 123 ПоследняяПоследняя

Информация о теме

Пользователи, просматривающие эту тему

Эту тему просматривают: 1 (пользователей: 0 , гостей: 1)

Ваши права

  • Вы не можете создавать новые темы
  • Вы не можете отвечать в темах
  • Вы не можете прикреплять вложения
  • Вы не можете редактировать свои сообщения
  •