Электронный Блок Управления на авто

b707
Offline
Зарегистрирован: 26.05.2017

qwone пишет:

Вот возьми-те стандартную ситуацию. Есть заказчик, у заказчика есть проект и есть вы . Разумеется  вы хотите кушать. Замечательно если проект вылизан и его нужно просто перевести в код. Но если у заказчика только есть хочу. И это хочу он видел на выставке, но платить за это он не хочет. Он хочет платить вам, а вам надо "кушать". Что делать. Поэтому рисуется код макет из той херни, вам дали под названием ТЗ. Код лучше рисовать все же через классы. Потому так все же быстрее. Да и подключать можно уже проверенные наработки. Потом показ. Заказчик понимает что это и то и не то одновременно. Но работа есть , часть денег можно получить.

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

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

nik182
Offline
Зарегистрирован: 04.05.2015

infyniti пишет:
А где у меня железо?Это форсунки чтоли?Или потенциометр или датчик температуры?Может камутатор интерестно куда здесь дрова нужны?


Именно всё это и есть железо. А пара строчек управления ими и есть дрова. И к ним нужно несколько строчек общего управления. Раскатывать это на классы можно только от отсутствия базовых знаний о програмировании и узконаправленного изучения одной области.

infyniti
Offline
Зарегистрирован: 15.07.2017

b707 пишет:

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

Написать программу для того кто не шарит легко.А вот для того кто шарит и сам написать не может это посложнее будет.А что такое ТЗ?

qwone
qwone аватар
Offline
Зарегистрирован: 03.07.2016

infyniti пишет:

qwone  до меня еще не доходит как вставить переменную задержки впрыска перед впрыском 

Может так

/**/
uint32_t micro, mill; // переменные для micros() и millis()
//-----Cl_Regulator-----------------------
// класс регулятор - меняет значение переменной
//в заданых пределах ручкой потенциометра каждые 0.2 сек
class Cl_Regulator {
  protected:
    const byte pin;
    uint32_t  *const pVal;
    const uint32_t  minVal;
    const uint32_t  maxVal;
    const char *const name;
    unsigned long past = 0;
  public:
    Cl_Regulator(byte _pin, uint32_t  *_pVal, uint32_t  _minVal, uint32_t  _maxVal, char *_name)
      :         pin(_pin), pVal(_pVal), minVal(_minVal), maxVal(_maxVal), name(_name) {}
    void setup() {}
    void loop() {
      if (mill - past >= 200) {
        past = mill;
        *pVal = map(analogRead(pin), 0, 1023, minVal, maxVal);
        Serial.print(name);
        Serial.print(*pVal);
        Serial.println();
      }
    }
};
//--------------------Cl_HallToInj-------------------------------
// класс Датчик Холла задает начало открытия инжектора
class Cl_HallToInj {
    uint32_t timeZ = 0; // длительность задержки впрыска
    uint32_t time = 0; // длительность впрыска
    uint32_t *const pTimeZ;// указатель на длительность задержки впрыска
    uint32_t *const pTime;// указатель на длительность задержки впрыска
    const byte hallPin  ; // пин холла
    const byte injPin;// пин инжектора
    bool hall, oldHall;
    bool statZ = 0; //состояние задержки
    bool inj;
    bool invH, invI; // инверсия выходов датчика Холла и инжектора
    uint32_t past = 0;
  public:
    Cl_HallToInj(byte _hallPin, bool _invH, byte _injPin, bool _invI, uint32_t *_pTimeZ, uint32_t *_pTime)
      :      hallPin(_hallPin), invH(_invH), injPin(_injPin), invI(_invI) , pTimeZ(_pTimeZ), pTime(_pTime) {}
    void setup() {
      pinMode(hallPin, INPUT);
      oldHall = digitalRead(hallPin)^invH;
      pinMode(injPin, OUTPUT);
      inj = 0;
      digitalWrite(injPin, inj ^ invI);
    }
    void loop() {
      hall = digitalRead(hallPin)^invH;
      if (hall && !oldHall) { // если сработал датчик Холла
        oldHall = 1;
        statZ = 1;
        timeZ = *pTimeZ; // выставить новое время задержки впрыска
        past = micro;
      }
      else if (!hall && oldHall) {
        oldHall = 0;
      }
      if (statZ && micro - past >= timeZ) {
        statZ = 0;
        inj = 1;            // то вкл Инжектор
        digitalWrite(injPin, invI ^ inj);
        time = *pTime; // выставить новое время впрыска
        past = micro;
      }
      if (inj && micro - past >= time) { // если истекло время
        inj = 0;                         // то выкл Инжектор
        digitalWrite(injPin, invI ^ inj);
      }
    }
};
//----Компоновка------------------------
uint32_t time = 1000; //время инжекции в микросекундах
uint32_t time1 = 1000; //время задержки инжекции в микросекундах
Cl_Regulator Regulator1(/*пин*/A0,/*переменая*/&time,/*min*/1000,/*max*/5000,/*имя*/"time=");
Cl_Regulator Regulator2(/*пин*/A1,/*переменая*/&time1,/*min*/0,/*max*/1000,/*имя*/"time_z=");
Cl_HallToInj HallToInject1(/*датчик Холла*/2,/*инверт сиг с датХолла*/1,/*инжектор*/6,/*инверт сиг на инжектор*/0,/*время задерж.впрыска*/&time1,/*время впрыска*/&time);
Cl_HallToInj HallToInject2(/*датчик Холла*/3,/*инверт сиг с датХолла*/1,/*инжектор*/7,/*инверт сиг на инжектор*/0,/*время задерж.впрыска*/&time1,/*время впрыска*/&time);
Cl_HallToInj HallToInject3(/*датчик Холла*/4,/*инверт сиг с датХолла*/1,/*инжектор*/8,/*инверт сиг на инжектор*/0,/*время задерж.впрыска*/&time1,/*время впрыска*/&time);
Cl_HallToInj HallToInject4(/*датчик Холла*/5,/*инверт сиг с датХолла*/1,/*инжектор*/9,/*инверт сиг на инжектор*/0,/*время задерж.впрыска*/&time1,/*время впрыска*/&time);
//-----main-----------------------
int main() {
  init();
  // setup
  Serial.begin(9600);
  HallToInject1.setup();
  HallToInject2.setup();
  HallToInject3.setup();
  HallToInject4.setup();
  for (;;) {
    // loop
    mill = millis();
    micro = micros();
    Regulator1.loop();
    Regulator2.loop();
    HallToInject1.loop();
    HallToInject2.loop();
    HallToInject3.loop();
    HallToInject4.loop();
  }
  return 0;
}
/*Скетч использует 3282 байт (10%) памяти устройства. Всего доступно 32256 байт.
  Глобальные переменные используют 346 байт (16%) динамической памяти, оставляя 1702 байт для локальных переменных. Максимум: 2048 байт.
*/

infyniti пишет:

Написать программу для того кто не шарит легко.А вот для того кто шарит и сам написать не может это посложнее будет.А что такое ТЗ?

 ТЗ- техническое задание.документ в котором все четко прописано, что программа должна делать. Вот только когда подходят сроки и программа делает то что написано в ТЗ, а у заказчика появился другой взгляд на результат. Но чаще в ТЗ написана херня.

nik182
Offline
Зарегистрирован: 04.05.2015

ТЗ это то что я прошу с начала темы. Тех. задание.

infyniti
Offline
Зарегистрирован: 15.07.2017

nik182 пишет:
infyniti пишет:
А где у меня железо?Это форсунки чтоли?Или потенциометр или датчик температуры?Может камутатор интерестно куда здесь дрова нужны?

 

Именно всё это и есть железо. А пара строчек управления ими и есть дрова. И к ним нужно несколько строчек общего управления. Раскатывать это на классы можно только от отсутствия базовых знаний о програмировании и узконаправленного изучения одной области.

А на каком языке написаны программы в ЭБУ авто?Может вовсе не на Си.

 

 

b707
Offline
Зарегистрирован: 26.05.2017

infyniti пишет:

А на каком языке написаны программы в ЭБУ авто?Может вовсе не на Си.

а что это меняет?

infyniti
Offline
Зарегистрирован: 15.07.2017

b707 пишет:

infyniti пишет:

А на каком языке написаны программы в ЭБУ авто?Может вовсе не на Си.

а что это меняет?

Скорость исполнения программой насколько я знаю Си не блещет скоростью.

qwone
qwone аватар
Offline
Зарегистрирован: 03.07.2016

nik182 пишет:
Именно всё это и есть железо. А пара строчек управления ими и есть дрова. И к ним нужно несколько строчек общего управления. Раскатывать это на классы можно только от отсутствия базовых знаний о програмировании и узконаправленного изучения одной области.

Во-общето еще веселее. Скетч который выкладывают я на форуме это исходник. Вот по нему компилятор собирает код, который заливают в железо. Чаще всего фирмы прячут исходник у себя, а народу дают код для заливки в компьютер машины. Дрова у меня и есть описание классов. Вот только дрова находятся в подключаемых файлах. А я выкладываю их в основной скетч, что было проще народу с форума с ним работать. Раздел Компановка это поключение железа в вашу программу и их настройка. То что кидается в разделы loop и setup это скорее издержки этого стиля. Иначе там была бы режущая глаз новичку херня.

ПС:nik182 - просто чистый Си-ник. И наличие дров в виде классов коробит его регилиозные чувства.

b707
Offline
Зарегистрирован: 26.05.2017

infyniti пишет:

Скорость исполнения программой насколько я знаю Си не блещет скоростью.

Си - компилируемый язык. Это значит, что исходный код программы на С и тот машинный код, который загружается в ЭБУ - прямо скажем, разные вещи :)

Из языков высокого уровня - Си один из самых быстрых.

b707
Offline
Зарегистрирован: 26.05.2017

qwone пишет:

Во-общето еще веселее. Скетч который выкладывают я на форуме это исходник. Вот по нему компилятор собирает код, который заливают в железо. Чаще всего фирмы прячут исходник у себя, а народу дают код для заливки в компьютер машины. Дрова у меня и есть описание классов. Вот только дрова находятся в подключаемых файлах. А я выкладываю их в основной скетч, что было проще народу с форума с ним работать. Раздел Компановка это поключение железа в вашу программу и их настройка. То что кидается в разделы loop и setup это скорее издержки этого стиля. Иначе там была бы режущая глаз новичку херня.

qwone - скажите честно, вы до ардуины, похоже, никогда программированием не занимались? Вы живете в какой-то искаженной "ардуино-матрице"

infyniti
Offline
Зарегистрирован: 15.07.2017

b707 пишет:

infyniti пишет:

Скорость исполнения программой насколько я знаю Си не блещет скоростью.

Си - компилируемый язык. Это значит, что исходный код программы на С и тот машинный код, который загружается в ЭБУ - прямо скажем, разные вещи :)

Из языков высокого уровня - Си один из самых быстрых.

А вот и ответ один ИЗ....

b707
Offline
Зарегистрирован: 26.05.2017

infyniti пишет:

А вот и ответ один ИЗ....

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

infyniti
Offline
Зарегистрирован: 15.07.2017

b707 пишет:

infyniti пишет:

А вот и ответ один ИЗ....

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

Для меня естественно но для концерна фольксваген может на асемблере проще или даже для ваза.

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

infyniti
Offline
Зарегистрирован: 15.07.2017

qwone пишет:

infyniti пишет:

qwone  до меня еще не доходит как вставить переменную задержки впрыска перед впрыском 

Может так

/**/
uint32_t micro, mill; // переменные для micros() и millis()
//-----Cl_Regulator-----------------------
// класс регулятор - меняет значение переменной
//в заданых пределах ручкой потенциометра каждые 0.2 сек
class Cl_Regulator {
  protected:
    const byte pin;
    uint32_t  *const pVal;
    const uint32_t  minVal;
    const uint32_t  maxVal;
    const char *const name;
    unsigned long past = 0;
  public:
    Cl_Regulator(byte _pin, uint32_t  *_pVal, uint32_t  _minVal, uint32_t  _maxVal, char *_name)
      :         pin(_pin), pVal(_pVal), minVal(_minVal), maxVal(_maxVal), name(_name) {}
    void setup() {}
    void loop() {
      if (mill - past >= 200) {
        past = mill;
        *pVal = map(analogRead(pin), 0, 1023, minVal, maxVal);
        Serial.print(name);
        Serial.print(*pVal);
        Serial.println();
      }
    }
};
//--------------------Cl_HallToInj-------------------------------
// класс Датчик Холла задает начало открытия инжектора
class Cl_HallToInj {
    uint32_t timeZ = 0; // длительность задержки впрыска
    uint32_t time = 0; // длительность впрыска
    uint32_t *const pTimeZ;// указатель на длительность задержки впрыска
    uint32_t *const pTime;// указатель на длительность задержки впрыска
    const byte hallPin  ; // пин холла
    const byte injPin;// пин инжектора
    bool hall, oldHall;
    bool statZ = 0; //состояние задержки
    bool inj;
    bool invH, invI; // инверсия выходов датчика Холла и инжектора
    uint32_t past = 0;
  public:
    Cl_HallToInj(byte _hallPin, bool _invH, byte _injPin, bool _invI, uint32_t *_pTimeZ, uint32_t *_pTime)
      :      hallPin(_hallPin), invH(_invH), injPin(_injPin), invI(_invI) , pTimeZ(_pTimeZ), pTime(_pTime) {}
    void setup() {
      pinMode(hallPin, INPUT);
      oldHall = digitalRead(hallPin)^invH;
      pinMode(injPin, OUTPUT);
      inj = 0;
      digitalWrite(injPin, inj ^ invI);
    }
    void loop() {
      hall = digitalRead(hallPin)^invH;
      if (hall && !oldHall) { // если сработал датчик Холла
        oldHall = 1;
        statZ = 1;
        timeZ = *pTimeZ; // выставить новое время задержки впрыска
        past = micro;
      }
      else if (!hall && oldHall) {
        oldHall = 0;
      }
      if (statZ && micro - past >= timeZ) {
        statZ = 0;
        inj = 1;            // то вкл Инжектор
        digitalWrite(injPin, invI ^ inj);
        time = *pTime; // выставить новое время впрыска
        past = micro;
      }
      if (inj && micro - past >= time) { // если истекло время
        inj = 0;                         // то выкл Инжектор
        digitalWrite(injPin, invI ^ inj);
      }
    }
};
//----Компоновка------------------------
uint32_t time = 1000; //время инжекции в микросекундах
uint32_t time1 = 1000; //время задержки инжекции в микросекундах
Cl_Regulator Regulator1(/*пин*/A0,/*переменая*/&time,/*min*/1000,/*max*/5000,/*имя*/"time=");
Cl_Regulator Regulator2(/*пин*/A1,/*переменая*/&time1,/*min*/0,/*max*/1000,/*имя*/"time_z=");
Cl_HallToInj HallToInject1(/*датчик Холла*/2,/*инверт сиг с датХолла*/1,/*инжектор*/6,/*инверт сиг на инжектор*/0,/*время задерж.впрыска*/&time1,/*время впрыска*/&time);
Cl_HallToInj HallToInject2(/*датчик Холла*/3,/*инверт сиг с датХолла*/1,/*инжектор*/7,/*инверт сиг на инжектор*/0,/*время задерж.впрыска*/&time1,/*время впрыска*/&time);
Cl_HallToInj HallToInject3(/*датчик Холла*/4,/*инверт сиг с датХолла*/1,/*инжектор*/8,/*инверт сиг на инжектор*/0,/*время задерж.впрыска*/&time1,/*время впрыска*/&time);
Cl_HallToInj HallToInject4(/*датчик Холла*/5,/*инверт сиг с датХолла*/1,/*инжектор*/9,/*инверт сиг на инжектор*/0,/*время задерж.впрыска*/&time1,/*время впрыска*/&time);
//-----main-----------------------
int main() {
  init();
  // setup
  Serial.begin(9600);
  HallToInject1.setup();
  HallToInject2.setup();
  HallToInject3.setup();
  HallToInject4.setup();
  for (;;) {
    // loop
    mill = millis();
    micro = micros();
    Regulator1.loop();
    Regulator2.loop();
    HallToInject1.loop();
    HallToInject2.loop();
    HallToInject3.loop();
    HallToInject4.loop();
  }
  return 0;
}
/*Скетч использует 3282 байт (10%) памяти устройства. Всего доступно 32256 байт.
  Глобальные переменные используют 346 байт (16%) динамической памяти, оставляя 1702 байт для локальных переменных. Максимум: 2048 байт.
*/

 

Да вроде работает, только к патенциометру рановато привязывать. Думаю этой задержкой управлять будет тахометр.

infyniti
Offline
Зарегистрирован: 15.07.2017

А  вот с тахометра начнется вот такое кино

qwone
qwone аватар
Offline
Зарегистрирован: 03.07.2016

А теперь осталось построить график. Время задержки впрыска(TimeZ) от времени между впрысками в микросекундах.

infyniti
Offline
Зарегистрирован: 15.07.2017

qwone пишет:

А теперь осталось построить график. Время задержки впрыска(TimeZ) от времени между впрысками в микросекундах.

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

infyniti
Offline
Зарегистрирован: 15.07.2017

qwone пишет:

А теперь осталось построить график. Время задержки впрыска(TimeZ) от времени между впрысками в микросекундах.

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

infyniti
Offline
Зарегистрирован: 15.07.2017

qwone пишет:

А теперь осталось построить график. Время задержки впрыска(TimeZ) от времени между впрысками в микросекундах.

А потом нет необходимости в микросикундах так как двигатель набирает обороты постепенно градус можно давать скажем через 100 милисикунд или даже 500 это не спорт кар.

qwone
qwone аватар
Offline
Зарегистрирован: 03.07.2016

Вот вам это вместо тахогенератора. повесите на датчик Холла 

/**/
uint32_t micro, mill; // переменные для micros() и millis()
//-----Cl_observer-----------------------
// класс обозреватель - показывает значение переменной каждые 0.2 сек
//в заданых пределах ручкой потенциометра каждые 0.2 сек
class Cl_observer {
  protected:
    uint32_t *const  pVal;// указатель на нужную переменную
    const char *name;
    uint32_t past = 0;
  public:
    Cl_observer(uint32_t  *_pVal, char *_name) :  pVal(_pVal), name(_name) {}
    void setup() {}
    void loop() {
      if (mill - past >= 200) {
        past = mill;
        Serial.print(name);
        Serial.print(*pVal);
        Serial.println();
      }
    }
};
//--------------------Cl_periodMeter-------------------------------
// класс Датчик Холла задает начало открытия инжектора
class Cl_periodMeter {
    const byte pin;
    uint32_t *const pVal;// указатель на нужную переменную
    bool hall , oldHall;
    uint32_t past = 0;
  public:
    Cl_periodMeter(byte _pin, uint32_t  *_pVal): pin(_pin), pVal(_pVal) {}
    void setup() {
      pinMode(pin, INPUT);
      oldHall = digitalRead(pin);
    }
    void loop() {
      hall = digitalRead(pin);
      if (hall & !oldHall) {
        oldHall = 1;
        *pVal = micro - past;
        past = micro;
      }
      if (!hall & oldHall) {
        oldHall = 0;
      }
    }
};
//----Компоновка------------------------
uint32_t period = 0; //период
Cl_observer Observ(/*переменая*/&period,/*имя*/"period= ");
Cl_periodMeter Meter(/*датчик Холла*/2,/*время*/&period);
//-----main-----------------------
int main() {
  init();
  // setup
  Serial.begin(9600);
  Meter.setup();
  for (;;) {
    // loop
    mill = millis();
    micro = micros();
    Observ.loop();
    Meter.loop();
  }
  return 0;
}
/*Скетч использует 2272 байт (7%) памяти устройства. Всего доступно 32256 байт.
  Глобальные переменные используют 223 байт (10%) динамической памяти, оставляя 1825 байт для локальных переменных. Максимум: 2048 байт.
*/

 

nik182
Offline
Зарегистрирован: 04.05.2015

qwone пишет:

ПС:nik182 - просто чистый Си-ник. И наличие дров в виде классов коробит его регилиозные чувства.


Отнюдь. На STM32 у меня графические примитивы, кнопки и светодтоды классами прописаны и нечего, работают. Вот только я активно использую прерывания. Даже для внутренних вычислений, чтобы выполнять в свободное время или в определённый момент цикла прерываний. С классами это не очень вяжется.
У меня есть собственные представления, основанные на опыте, где классы это хорошо, а где плохо. Ваше желание всё воткнуть в классы меня удивляет отсутствием сравнения с альтернативными вариантами. С классами быстрее програмировать, а вот программа медленее и занимает больше места. Да и реакция на внешние события зависит от количества объектов в loop. Пока нужно помигать диодом - всё отлично. Четыре инжектора - уже проблемы.

infyniti
Offline
Зарегистрирован: 15.07.2017

nik182 пишет:
qwone пишет:

ПС:nik182 - просто чистый Си-ник. И наличие дров в виде классов коробит его регилиозные чувства.

Отнюдь. На STM32 у меня графические примитивы, кнопки и светодтоды классами прописаны и нечего, работают. Вот только я активно использую прерывания. Даже для внутренних вычислений, чтобы выполнять в свободное время или в определённый момент цикла прерываний. С классами это не очень вяжется. У меня есть собственные представления, основанные на опыте, где классы это хорошо, а где плохо. Ваше желание всё воткнуть в классы меня удивляет отсутствием сравнения с альтернативными вариантами. С классами быстрее програмировать, а вот программа медленее и занимает больше места. Да и реакция на внешние события зависит от количества объектов в loop. Пока нужно помигать диодом - всё отлично. Четыре инжектора - уже проблемы.

Нет проблем с инжекторами они сами за программой не успевают.Напишите пример и сравним по скорости и весу.

4 холла на каждом по 1 инжектору задержка до впрыска и после.Чтото я сомниваюсь что он будет весить меньше.

nik182
Offline
Зарегистрирован: 04.05.2015

Написать не проблема. Проблема в отсутствии схемы и диаграммы сигналов. Давайте, разрисуйте, напишу.

infyniti
Offline
Зарегистрирован: 15.07.2017

nik182 пишет:
Написать не проблема. Проблема в отсутствии схемы и диаграммы сигналов. Давайте, разрисуйте, напишу.

Зачем схемы диаграммы у нас готовая рабочая программа.Все компоненты жестко привязаны к своим фазам 90 градусов.Вам нужно добавить только временной интервал задержки впрыска и сам впрыск.Если боитесь что датчики убегут или форсунки то я сомниваюсь.Да и есле это произойдет то наврятли программа вернет датчик или форсунку Это уже искуственный разум нужно програмировать чтобы он при отсутствии сигнала с датчика давал сигнал с противоположного.И то это ясно как день.

infyniti
Offline
Зарегистрирован: 15.07.2017

А хорошая идея

 

infyniti
Offline
Зарегистрирован: 15.07.2017
[code]
/*
  ардуино пин 2 <--> датчик холла 1
  ардуино пин 3 <--> датчик холла 2
  ардуино пин 4 <--> датчик холла 3
  ардуино пин 5 <--> датчик холла 4
  ардуино пин 6 <--> инжектор 1
  ардуино пин 7 <--> инжектор 2
  ардуино пин 8 <--> инжектор 3
  ардуино пин 9 <--> инжектор 4
*/
//---------------------------------------------------
class Cl_HallToInject {
    const uint32_t time = 1000; // длительность 1 секунда
    const byte _Hall_pin  ; // пин холла
    const byte _Inject_pin;// пин инжектора
    bool Hall, Hall_old;
    bool Inject;
    uint32_t past = 0;
  public:
    Cl_HallToInject(byte Hall_pin, byte Inject_pin): _Hall_pin(Hall_pin), _Inject_pin(Inject_pin) {}
    void setup() {
      pinMode(_Hall_pin, INPUT);
      Hall_old = digitalRead( _Hall_pin);
      pinMode(_Inject_pin, OUTPUT);
      digitalWrite(_Inject_pin, Inject = 0);
    }
    void loop() {
      Hall = digitalRead( _Hall_pin);
      if (Hall && !Hall_old) { // если сработал датчик Холла
        Hall_old = 1;
        digitalWrite(_Inject_pin, Inject = 1); // то вкл Инжектор
        past = millis();
      }
      else if (!Hall && Hall_old) {
        Hall_old = 0;
      }
      if (Inject && millis() - past >= time) { // если истекло время
        digitalWrite(_Inject_pin, Inject = 0);  // то выкл Инжектор
      }
    }
};
//------------------Компоновка---------------------------------
Cl_HallToInject HallToInject1(/*датчик холла*/2,/*инжектор*/6);
Cl_HallToInject HallToInject2(/*датчик холла*/3,/*инжектор*/7);
Cl_HallToInject HallToInject3(/*датчик холла*/4,/*инжектор*/8);
Cl_HallToInject HallToInject4(/*датчик холла*/5,/*инжектор*/9);
//------------------main()---------------------------------
void setup() {
  HallToInject1.setup();
  HallToInject2.setup();
  HallToInject3.setup();
  HallToInject4.setup();
}

void loop() {
  HallToInject1.loop();
  HallToInject2.loop();
  HallToInject3.loop();
  HallToInject4.loop();
}
[/code]

Вот код использует 1868 байт (0) памяти.Глобальные переменные используют 61 байт (0) динамической памяти

infyniti
Offline
Зарегистрирован: 15.07.2017

uint32_t micro, mill; // переменные для micros() и millis()

//--------------------Cl_HallToInj-------------------------------
// класс Датчик Холла задает начало открытия инжектора
class Cl_HallToInj {
    uint32_t timeZ = 0; // длительность задержки впрыска
    uint32_t time = 0; // длительность впрыска
    uint32_t *const pTimeZ;// указатель на длительность задержки впрыска
    uint32_t *const pTime;// указатель на длительность задержки впрыска
    const byte hallPin  ; // пин холла
    const byte injPin;// пин инжектора
    bool hall, oldHall;
    bool statZ = 0; //состояние задержки
    bool inj;
    bool invH, invI; // инверсия выходов датчика Холла и инжектора
    uint32_t past = 0;
  public:
    Cl_HallToInj(byte _hallPin, bool _invH, byte _injPin, bool _invI, uint32_t *_pTimeZ, uint32_t *_pTime)
      :      hallPin(_hallPin), invH(_invH), injPin(_injPin), invI(_invI) , pTimeZ(_pTimeZ), pTime(_pTime) {}
    void setup() {
      pinMode(hallPin, INPUT);
      oldHall = digitalRead(hallPin)^invH;
      pinMode(injPin, OUTPUT);
      inj = 0;
      digitalWrite(injPin, inj ^ invI);
    }
    void loop() {
      hall = digitalRead(hallPin)^invH;
      if (hall && !oldHall) { // если сработал датчик Холла
        oldHall = 1;
        statZ = 1;
        timeZ = *pTimeZ; // выставить новое время задержки впрыска
        past = micro;
      }
      else if (!hall && oldHall) {
        oldHall = 0;
      }
      if (statZ && micro - past >= timeZ) {
        statZ = 0;
        inj = 1;            // то вкл Инжектор
        digitalWrite(injPin, invI ^ inj);
        time = *pTime; // выставить новое время впрыска
        past = micro;
      }
      if (inj && micro - past >= time) { // если истекло время
        inj = 0;                         // то выкл Инжектор
        digitalWrite(injPin, invI ^ inj);
      }
    }
};
//----Компоновка------------------------
uint32_t time = 1000; //время инжекции в микросекундах
uint32_t time1 = 1000; //время задержки инжекции в микросекундах

Cl_HallToInj HallToInject1(/*датчик Холла*/2,/*инверт сиг с датХолла*/1,/*инжектор*/6,/*инверт сиг на инжектор*/0,/*время задерж.впрыска*/&time1,/*время впрыска*/&time);
Cl_HallToInj HallToInject2(/*датчик Холла*/3,/*инверт сиг с датХолла*/1,/*инжектор*/7,/*инверт сиг на инжектор*/0,/*время задерж.впрыска*/&time1,/*время впрыска*/&time);
Cl_HallToInj HallToInject3(/*датчик Холла*/4,/*инверт сиг с датХолла*/1,/*инжектор*/8,/*инверт сиг на инжектор*/0,/*время задерж.впрыска*/&time1,/*время впрыска*/&time);
Cl_HallToInj HallToInject4(/*датчик Холла*/5,/*инверт сиг с датХолла*/1,/*инжектор*/9,/*инверт сиг на инжектор*/0,/*время задерж.впрыска*/&time1,/*время впрыска*/&time);
//-----main-----------------------
int main() {
  init();
  // setup

  HallToInject1.setup();
  HallToInject2.setup();
  HallToInject3.setup();
  HallToInject4.setup();
  for (;;) {
    // loop
    mill = millis();
    micro = micros();

    HallToInject1.loop();
    HallToInject2.loop();
    HallToInject3.loop();
    HallToInject4.loop();
  }
  return 0;
}
/*Скетч использует 2242 байт (0%) памяти устройства. Всего доступно 295253 байт.
  Глобальные переменные используют 121 байт (1%) динамической памяти, оставляя 8071 байт для локальных переменных. Максимум: 2048 байт.
*/

Извеняюсь тот скетч без задержек

infyniti
Offline
Зарегистрирован: 15.07.2017

Вообше автономный ремонт без участия человека хорошая идея.

В место того чтобы авто встало оно будет переключатся на какой нибудь другой датчик НЕ тупо загоратся чек а конкретная поломка без диагностики появляется на маниторе с обьяснением водителю что нужно предпринять к кому обратится а не бегать от мастера к мастеру которые перепераются.

nik182
Offline
Зарегистрирован: 04.05.2015

В программе нет задержки включения инжектора. Какая величина этой задержки?
От оборотов зависит? А длительность открытия? У меня на хонде на ХХ форсунки открыты 4 мс. Дальше в зависимости от педальки открытие увеличивается с шагом 2 мс. Если бросить педаль и обороты больше 1000 закрыты совсем.
Какой даст результат выражение Inject && millis() - past >= time вы себе представляете ? Может быть должно быть так Inject && (millis() - past >= time) ?
Задержки на включение, зажигание нужны?
Не интересно делать одну функцию. Сравнивать надо полную программу.

infyniti
Offline
Зарегистрирован: 15.07.2017

nik182 пишет:
В программе нет задержки включения инжектора. Какая величина этой задержки? От оборотов зависит? А длительность открытия? У меня на хонде на ХХ форсунки открыты 4 мс. Дальше в зависимости от педальки открытие увеличивается с шагом 2 мс. Если бросить педаль и обороты больше 1000 закрыты совсем. Какой даст результат выражение Inject && millis() - past >= time вы себе представляете ? Может быть должно быть так Inject && (millis() - past >= time) ? Задержки на включение, зажигание нужны? Не интересно делать одну функцию. Сравнивать надо полную программу.

/*
  порядок 1-3-2-4
  под мега 2560
  ардуино пин A13 <--> средний вывод потенциометра нагрузки  
  ардуино пин A14 <--> на вывод термистора // cчитаем еще один потенциометр
  ардуино пин A15 <--> средний вывод потенциометра холостой ход
  расчет потенциометров-холостой ход + нагрузка + прогрев 
                        холостой ход + прогрев без нагрузки
                        холостой ход + нагрузка без прогревa
  ардуино пин 8 <--> датчик холла 1
  ардуино пин 9 <--> датчик холла 3
  ардуино пин 10 <--> датчик холла 2
  ардуино пин 11 <--> датчик холла 4
  ардуино пин 22 <--> инжектор 1
  ардуино пин 23 <--> инжектор 3
  ардуино пин 24 <--> инжектор 2
  ардуино пин 25 <--> инжектор 4
  ардуино пин 26 <--> катушка 1
  ардуино пин 27 <--> катушка 2
*/
uint32_t micro, mill; // переменные для micros() и millis()
/*
;*/
//--------------------Cl_XolostoiXod---------------------------------------------
// класс холостого хода
class Cl_XolostoiXod {
    const byte _pin;   
    uint32_t *const _pntXolostoiXod;// указатель переменную которая меняет значение холостого хода по положению ручки потенциометра
    uint32_t past = 0;
  public:    Cl_XolostoiXod(byte pin, uint32_t *pntXolostoiXod)
    : _pin(pin), _pntXolostoiXod(pntXolostoiXod) {}
    void setup() {
      *_pntXolostoiXod = map(analogRead(_pin), 0, 1023, 1000, 5000);//<--- здесь функция поворота ручки в значение холостого хода
    }
    void loop() {
      if (micro - past > 1) {
        *_pntXolostoiXod = map(analogRead(_pin), 0, 1023, 1000, 5000);//<--- здесь функция поворота ручки в значение холостого хода
      }
    }
};
//--------------------Cl_HallToInject-------------------------------
// класс Датчик Холла задает начало открытия инжектора
class Cl_HallToInject {
    uint32_t time = 0; // длительность
    uint32_t *const _pnt;// указатель переменную которая задает новое значение time
    const byte _Hall_pin  ; // пин холла
    const byte _Inject_pin;// пин инжектора
    bool Hall, Hall_old;
    bool Inject;
    bool _invH, _invI; // инверсия выходов датчика Холла и инжектора
    uint32_t past = 0;
  public:
    Cl_HallToInject(byte Hall_pin, bool invH, byte Inject_pin, bool invI, uint32_t *pnt)
      : _Hall_pin(Hall_pin), _invH(invH), _Inject_pin(Inject_pin), _invI(invI) , _pnt(pnt) {}
    void setup() {
      pinMode(_Hall_pin, INPUT);
      Hall_old = _invH ^ digitalRead( _Hall_pin);
      pinMode(_Inject_pin, OUTPUT);
      Inject = 0;
      digitalWrite(_Inject_pin, _invI ^ Inject);
    }
    void loop() {
      Hall = _invH ^ digitalRead( _Hall_pin);
      if (Hall && !Hall_old) { // если сработал датчик Холла
        Hall_old = 1;
        Inject = 1;            // то вкл Инжектор
        digitalWrite(_Inject_pin, _invI ^ Inject);
        time = *_pnt; // выставить новое время впрыска
        past = micro;
      }
      else if (!Hall && Hall_old) {
        Hall_old = 0;
      }
      if (Inject && micro - past >= time) { // если истекло время
        Inject = 0;                            // то выкл Инжектор
        digitalWrite(_Inject_pin, _invI ^ Inject);
      }
    }
};
//------------------Компоновка---------------------------------
uint32_t time = 0; // длительность впрыска
Cl_XolostoiXod XolostoiXod(/*пин потенциометра*/A13,/*переменая*/&time);// подключить потенциометр холостого хода
// Замечание: Если вам нужно проинвертировать сигнал, то замените 0 на 1
Cl_HallToInject HallToInject1(/*датчик Холла*/8,/*инверт сиг с датХолла*/1,/*инжектор*/22,/*инверт сиг на инжектор*/0,/*время впрыска*/&time);
Cl_HallToInject HallToInject2(/*датчик Холла*/9,/*инверт сиг с датХолла*/1,/*инжектор*/23,/*инверт сиг на инжектор*/0,/*время впрыска*/&time);
Cl_HallToInject HallToInject3(/*датчик Холла*/10,/*инверт сиг с датХолла*/1,/*инжектор*/25,/*инверт сиг на инжектор*/0,/*время впрыска*/&time);
Cl_HallToInject HallToInject4(/*датчик Холла*/11,/*инверт сиг с датХолла*/1,/*инжектор*/24,/*инверт сиг на инжектор*/0,/*время впрыска*/&time);

//------------------main()---------------------------------
void setup() {
  XolostoiXod.setup();
  HallToInject1.setup();
  HallToInject2.setup();
  HallToInject3.setup();
  HallToInject4.setup();
}

void loop() {
  micro = micros();
  mill = millis();
  XolostoiXod.loop();
  HallToInject1.loop();
  HallToInject2.loop();
  HallToInject3.loop();
  HallToInject4.loop();

}

/*Скетч использует 2500 байт (0%) памяти устройства. Всего доступно 293952 байт.
  Глобальные переменные используют 96 байт (1%) динамической памяти, оставляя 8096 байт для локальных переменных. Максимум: 8192 байт.
*/

Вот код с авто.

Время не важно оно может и 159 на ХХ быть.У меня на ХХ с 1 микросикунды работает ниже форсы не открываются думаю работать будут. но заводится с 3-5.Время упровляется с помощью потенциометров.

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

Тахометр для опережения зажигания нужен и не более

Задержка на форсунки до впрыска не нужна она для опережения зажигания.

Предворительный пуск тоже не нужен каждая форсунка работает на свой цилиндр.

infyniti
Offline
Зарегистрирован: 15.07.2017

nik182 пишет:
Если бросить педаль и обороты больше 1000 закрыты совсем.

Для экономии может и пойдет а вот провал,детонация,и обедненая смесь обеспечены.

infyniti
Offline
Зарегистрирован: 15.07.2017

nik182 пишет:
У меня на хонде на ХХ форсунки открыты 4 мс. Дальше в зависимости от педальки открытие увеличивается с шагом 2 мс.

Сколько шагов?

infyniti
Offline
Зарегистрирован: 15.07.2017

nik182 пишет:
Задержки на включение, зажигание нужны?.

Да забыл этой задержкой будет упровлять датчик температуры он еще не подключен.

nik182
Offline
Зарегистрирован: 04.05.2015

Никогда не дожимал до упора. У меня логер на параметра движка на ноуте есть я его иногда подключаю лямбду проверить. Максимум что видел 40 мс. Он открывает не по педальке а по куче параметров. Лямбда туда тоже входит. Видно, когда не сильно нажал, вместе с лямбдой плавает открытие. На обороты кстати влияет на холостых. Чуть чуть плавают вместе с лямбдой.

nik182
Offline
Зарегистрирован: 04.05.2015

nik182
Offline
Зарегистрирован: 04.05.2015

Здесь injtime от 3 до 10ms.

infyniti
Offline
Зарегистрирован: 15.07.2017

nik182 пишет:
Никогда не дожимал до упора. У меня логер на параметра движка на ноуте есть я его иногда подключаю лямбду проверить. Максимум что видел 40 мс. Он открывает не по педальке а по куче параметров. Лямбда туда тоже входит. Видно, когда не сильно нажал, вместе с лямбдой плавает открытие. На обороты кстати влияет на холостых. Чуть чуть плавают вместе с лямбдой.

Они с лямдой плавают потому что она перекрывает подачу если 4 мили это много для ХХ.

А 40 на ХХ это время такта.Чем быстрее движек крутится тем это время меньше.

nik182
Offline
Зарегистрирован: 04.05.2015

40 было когда педаль в пол, 6500, 80км/ч на второй передаче. На ХХ 4 мс на холодном. На прогретом меньше. 2 мс шаг был на индикаторе программы. Судя по графику шаг меньше.

infyniti
Offline
Зарегистрирован: 15.07.2017

А какой обьем двигателя?

nik182
Offline
Зарегистрирован: 04.05.2015

1500 114 сил атмосферник

infyniti
Offline
Зарегистрирован: 15.07.2017

8 свечей?

nik182
Offline
Зарегистрирован: 04.05.2015

4

 

infyniti
Offline
Зарегистрирован: 15.07.2017

а откуда столько кобыл впрягли интересно.у меня тоже атмосферник по заводу 1351 79 лошедей 1400 с копейками расточил и хочу турбину или компрессор воткнуть после обкатки.

nik182
Offline
Зарегистрирован: 04.05.2015

Сам удивляюсь. Вот этот http://race-wars.ru/harakteristiki-dvs/dvigateli-honda/136-d15z8.html

infyniti
Offline
Зарегистрирован: 15.07.2017

nik182 пишет:

Сам удивляюсь. Вот этот http://race-wars.ru/harakteristiki-dvs/dvigateli-honda/136-d15z8.html

Втековский теперь понятно. А у меня опозитка как на субарике.

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

infyniti пишет:

Скорость исполнения программой насколько я знаю Си не блещет скоростью.

Можно с этого места поподробнее? У меня два вопроса:

1. Кто блещет?

2. Чем еще не блещет С?

Клапауций 112
Клапауций 112 аватар
Offline
Зарегистрирован: 01.03.2017

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

Можно с этого места поподробнее? У меня два вопроса:

1. Кто блещет?

2. Чем еще не блещет С?

пердлагаю повысить градус профанации и начать применять к С++ следующие эпитеты:

- пресловутый.
- запрещённый на территории РФ.
- признанный террористическим.
 
О_О
infyniti
Offline
Зарегистрирован: 15.07.2017

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

infyniti пишет:

Скорость исполнения программой насколько я знаю Си не блещет скоростью.

Можно с этого места поподробнее? У меня два вопроса:

1. Кто блещет?

2. Чем еще не блещет С?

1.Асемблер.

2.Дальше он просто звезда осмиконечная.

infyniti
Offline
Зарегистрирован: 15.07.2017

Клапауций 112 пишет:

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

Можно с этого места поподробнее? У меня два вопроса:

1. Кто блещет?

2. Чем еще не блещет С?

пердлагаю повысить градус профанации и начать применять к С++ следующие эпитеты:

- пресловутый.
- запрещённый на территории РФ.
- признанный террористическим.
 
О_О

Нет на него имбарго