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

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

ну пробуйте дело ваше может получится

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

infyniti пишет:

Ваш скечь можно переделать на один импульс для каждого из 4 импульсов задать класс 

А!!! Класс! Квоны распростроняются!!! Галлактика в опасности!

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

Yer пишет:

ну пробуйте дело ваше может получится

uint8_t in_state = PIND;              // фиксируем состояние  входов
  uint8_t currBit = 4;                  // бит вх. порта 2 ардуино, 

Эти две строчки я так понял переменные?currBit это пин холла? а in_state пин форсунки?

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

Как я когда то начинал ничего не понимал вот вам подробная описание скетча:

currBit -- текущий бит, то ли currCh -- текущий канал.
  Слово текущий означает здесь канал, над которым алгоритм производитс действия.
 Выбрал все-таки "бит", хотя и к "каналу" это не меньше относится.
 
Переменной перед началом цикла присваивается значение 2. Двоичный вид этого числа 
будет таким: 00000010. в то время, как под входы используются шесть старших разрядов 
порта B и в отсутствие импульсов их состояние будет таким: 111111xx, 
где x -- неопределенное или безразличное значение, т.к. алгоритм два младших разряда
 не использует. И вот перед началом цикла биты встали, как написано выше:
 
CurrBit:         0 0 0 0 0 0 1 0
 
PORTB:         1 1 1 1 1 1 x x
 
Цикл начинается со сдвига влево бита переменной
 
CurrBit          0 0 0 0 0 1 0 0  
 
в следующей строке выполняется операция логического "И". Результатом логического "И" 
двух чисел всегда будет некое число, где единицы будут выставлены только в тех разрядах, 
в которых они присутствуют в обоих числах. Другими словам, результатом операции "И" 
над PORTB и CurrBit в данном случае будет:
 
CurrBit          0 0 0 0 0 1 0 0
 
PORTB          1 1 1 1 1 1 x x
 
====================
 
                    0 0 0 0 0 1 0 0
 
Результат оказался равен значению самой CurrBit и это означает, что на первом 
входе высокий уровень. Если бы там был низкий уровень, то результатом операции 
логического "И" было бы
 
                    0 0 0 0 0 0 0 0
 
и в конструкции
 
1
if ((in_state & currBit) != currBit) {
2
  ...
3
} else {
4
  ...
5
}
команды внутри блока if буду выполняться тогда, когда на текущем входе ноль. Если на входе
 единица, то будет выполняться блок else.
 
 
 
2) prev_in_state -- переменная, в которой хранятся значение битов порта B (входы), 
которые были актуальными на момент предыдущего прохода цикла for (и значение у нее не 
всегда 0XFF). Логика тут простая -- если одни и те же разряды (биты) в обеих переменных
 отличаются, значит в канале, чьи биты разные, случилось некое событие. Под событием здесь
 имеется ввиду либо переход из высокого состояния в низкое, либо наоборот. 
Если биты одинаковые, значит с прошлой проверки ничего не изменилось.
 
Если биты разные, то алгоритм проверяет эту разницу и определяет, что произошло.
 Если  некий бит в  prev_in_state сохранен как единица, а в in_state он же уже в нуле, 
то значит пришел импульс открытия форсунки на соотв. канале. Если наоборот, был нулем, 
а стал единицей, то импульс только что закончился.
Yer
Offline
Зарегистрирован: 12.02.2016

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

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

infyniti пишет:

uint8_t in_state = PIND; // фиксируем состояние входов

  uint8_t currBit = 4;                  // бит вх. порта 2 ардуино, 

а in_state пин форсунки?

Вы тут уже столько времени трётесь, тему вон на 500 постов запостили, так почитайте же хоть что-нибудь, не всё ж писать. Это переменная для сохранения ВСЕХ восьми пинов регистра D.

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

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

infyniti пишет:

uint8_t in_state = PIND; // фиксируем состояние входов

  uint8_t currBit = 4;                  // бит вх. порта 2 ардуино, 

а in_state пин форсунки?

Вы тут уже столько времени трётесь, тему вон на 500 постов запостили, так почитайте же хоть что-нибудь, не всё ж писать. Это переменная для сохранения ВСЕХ восьми пинов регистра D.

Уже прочел. Я откуда знаю что такое PIND и с чем его едят ,поэтому и спросил.

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

infyniti пишет:

Уже прочел. Я откуда знаю что такое PIND и с чем его едят ,поэтому и спросил.

Так надо знать! А если встретилось, то сначала прочесть, а только если не поможет - спроашивать.

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

Yer пишет:

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

Я с ними не спорю.Это они спорят.

A я чё? Я ниче. Другие вон чё, и ничё, а я чуть чё, и сразу вон чё!

 .

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

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

infyniti пишет:

Уже прочел. Я откуда знаю что такое PIND и с чем его едят ,поэтому и спросил.

Так надо знать! А если встретилось, то сначала прочесть, а только если не поможет - спроашивать.

Я такое первый раз встретил.Может это переменная такая которую обьявить забыли.

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

qwone нужна помощь Проблемма в том что если я увеличиваю время допустим до 50 милисекунд получается следующее.

1 датчик дал сигнал зажигается светодиод ,если светодиод не погас и 2 датчик дал сигнал ,то 1 светодиод продолжает гореть ,то же происходит и с 3 и с 4 и опять 1-2-3-4-1-2-3-4 так до бесконечности до того момента пока не перестанут довать сигнал датчики.После этого проходит некоторое(скорее всего программа складывает время) время и все светодиоды тухнут.

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

Выложете или укажите пожалуста эту программу.

infyniti
Offline
Зарегистрирован: 15.07.2017
/*
  порядок 1-3-2-4
  под мега 2560
  ардуино пин A12 <--> на вывод термистора2 // cчитаем еще один потенциометр
  ардуино пин A13 <--> на вывод термистора1 // cчитаем еще один потенциометр  
  ардуино пин A14 <--> средний вывод потенциометра нагрузки
  ардуино пин A15 <--> средний вывод потенциометра холостой ход
  расчет потенциометров-холостой ход без нагрузки без прогревa
                        холостой ход + нагрузка + прогрев 
                        холостой ход + прогрев без нагрузки
                        холостой ход + нагрузка без прогревa
  ардуино пин 8 <--> датчик холла 1
  ардуино пин 9 <--> датчик холла 3
  ардуино пин 10 <--> датчик холла 2
  ардуино пин 11 <--> датчик холла 4
  ардуино пин 22 <--> инжектор 2
  ардуино пин 23 <--> инжектор 4
  ардуино пин 24 <--> инжектор 1
  ардуино пин 25 <--> инжектор 3
  ардуино пин 46 <--> катушка 1
  ардуино пин 38 <--> катушка 2
*/
uint32_t micro, mill; // переменные для micros() и millis()


//--------------------Cl_Operejenie---------------------------------------------
// класс холостого хода
class Cl_Operejenie {
    const byte _pin;   
    uint32_t *const _pntOperejenie;// указатель переменную которая меняет значение холостого хода по положению ручки потенциометра
    uint32_t past = 0;
  public:    Cl_Operejenie(byte pin, uint32_t *pntOperejenie)
    : _pin(pin), _pntOperejenie(pntOperejenie) {}
    void setup() {
      *_pntOperejenie = map(analogRead(_pin), 0, 1023, 0, 10000);//<--- здесь функция поворота ручки в значение холостого хода
    }
    void loop() {
      if (micro - past > 1) {
        *_pntOperejenie = map(analogRead(_pin), 0, 1023, 0, 10000);//<--- здесь функция поворота ручки в значение холостого хода
      }
    }
};
//--------------------Cl_HallCamutator-------------------------------
// класс Датчик Холла задает начало открытия инжектора
class Cl_HallCamutator {
    uint32_t timeC = 0; // длительность задержки впрыска
    uint32_t time = 0; // длительность впрыска
    uint32_t *const pTimeC;// указатель на длительность задержки впрыска
    uint32_t *const pTime;// указатель на длительность задержки впрыска
    const byte hallPin  ; // пин холла
    const byte CamutatorPin;// пин инжектора
    bool hall, oldHall;
    bool statC = 0; //состояние задержки
    bool Camutator;
    bool invH, invC; // инверсия выходов датчика Холла и инжектора
    uint32_t past = 0;
  public:
    Cl_HallCamutator(byte _hallPin, bool _invH, byte _CamutatorPin, bool _invC, uint32_t *_pTimeC, uint32_t *_pTime)
      :      hallPin(_hallPin), invH(_invH), CamutatorPin(_CamutatorPin), invC(_invC) , pTimeC(_pTimeC), pTime(_pTime) {}
    void setup() {
      pinMode(hallPin, INPUT);
      oldHall = digitalRead(hallPin)^invH;
      pinMode(CamutatorPin, OUTPUT);
      Camutator = 0;
      digitalWrite(CamutatorPin, Camutator ^ invC);
    }
    void loop() {
      hall = digitalRead(hallPin)^invH;
      if (hall && !oldHall) { // если сработал датчик Холла
        oldHall = 1;
        statC = 1;
        timeC = *pTimeC; // выставить новое время задержки впрыска
        past = micro;
      }
      else if (!hall && oldHall) {
        oldHall = 0;
      }
      if (statC && micro - past >= timeC) {
        statC = 0;
        Camutator = 1;            // то вкл Инжектор
        digitalWrite(CamutatorPin, invC ^ Camutator);
        time = *pTime; // выставить новое время впрыска
        past = micro;
      }
      if (Camutator && micro - past >= time) { // если истекло время
        Camutator = 0;                         // то выкл Инжектор
        digitalWrite(CamutatorPin, invC ^ Camutator);
      }
    }
};
//----Компоновка------------------------


uint32_t timeC = 0; //время задержки комутации в микросекундах
Cl_Operejenie Operejenie(/*пин потенциометра*/A13,/*переменая*/&timeC);
    
uint32_t time = 2; //время комутации в микросекундах  
Cl_HallCamutator HallCamutator1(/*датчик Холла1*/8,/*инверт сиг с датХолла1*/1,/*катушка1*/46,/*инверт сиг на камутатор1*/0,/*время задерж.камутации*/&timeC,/*время камутации*/&time);
Cl_HallCamutator HallCamutator2(/*датчик Холла3*/9,/*инверт сиг с датХолла3*/1,/*катушка1*/46,/*инверт сиг на камутатор1*/0,/*время задерж.камутации*/&timeC,/*время камутации*/&time);
Cl_HallCamutator HallCamutator3(/*датчик Холла2*/10,/*инверт сиг с датХолла2*/1,/*катушка2*/38,/*инверт сиг на камутатор2*/0,/*время задерж.камутации*/&timeC,/*время камутации*/&time);
Cl_HallCamutator HallCamutator4(/*датчик Холла4*/11,/*инверт сиг с датХолла4*/1,/*катушка2*/38,/*инверт сиг на камутатор2*/0,/*время задерж.камутации*/&timeC,/*время камутации*/&time);

//-----main-----------------------
int main() {
  init();
  // setup
  Serial.begin(9600);
  
  Operejenie.setup();  
  HallCamutator1.setup();
  HallCamutator2.setup();
  HallCamutator3.setup();
  HallCamutator4.setup(); 

  for (;;) {
    // loop
    Serial.print(" Operejenie ");
   Serial.print(timeC);
    mill = millis();
    micro = micros();
    Observ.loop();
    Meter.loop();    
    RegulatorInject.loop();
    Operejenie.loop();    
    HallCamutator1.loop();
    HallCamutator2.loop();
    HallCamutator3.loop();
    HallCamutator4.loop();    
   
  }
  return 0;
}

 

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

А вы в курсе, что отработать меньше 2 микросекунд (2/100 000 сек) не реально. Программа работает с точностью (1/10000 сек) 

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

qwone пишет:

А вы в курсе, что отработать меньше 2 микросекунд (2/100 000 сек) не реально. Программа работает с точностью (1/10000 сек) 

Да.Там миллис пробовал пропустил неисправил.

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

Ну только так 

/*
  порядок 1-3-2-4
  под мега 2560
  ардуино пин A12 <--> на вывод термистора2 // cчитаем еще один потенциометр
  ардуино пин A13 <--> на вывод термистора1 // cчитаем еще один потенциометр
  ардуино пин A14 <--> средний вывод потенциометра нагрузки
  ардуино пин A15 <--> средний вывод потенциометра холостой ход
  расчет потенциометров-холостой ход без нагрузки без прогревa
                        холостой ход + нагрузка + прогрев
                        холостой ход + прогрев без нагрузки
                        холостой ход + нагрузка без прогревa
  ардуино пин 8 <--> датчик холла 1
  ардуино пин 9 <--> датчик холла 3
  ардуино пин 10 <--> датчик холла 2
  ардуино пин 11 <--> датчик холла 4
  ардуино пин 22 <--> инжектор 2
  ардуино пин 23 <--> инжектор 4
  ардуино пин 24 <--> инжектор 1
  ардуино пин 25 <--> инжектор 3
  ардуино пин 46 <--> катушка 1
  ардуино пин 38 <--> катушка 2
*/
uint32_t mill; // переменные для millis()
//--------------------Cl_Operejenie---------------------------------------------
// класс холостого хода
class Cl_Operejenie {
    const byte pin;
    uint32_t *const data;
    uint32_t past = 0;
  public:    Cl_Operejenie(byte pin_, uint32_t *data_): pin(pin_), data(data_) {}
    void setup() {
      *data = map(analogRead(pin), 0, 1023, 0, 100);
    }
    void loop() {
      if (mill - past > 200) {
        *data = map(analogRead(pin), 0, 1023, 0, 100);
      }
    }
};
//--------------------Cl_HallCamutator-------------------------------
// класс Датчик Холла задает начало открытия инжектора
class Cl_HallCamutator {
    uint32_t timeC = 0; // длительность задержки впрыска
    uint32_t time = 0; // длительность впрыска
    uint32_t *const pTimeC;// указатель на длительность задержки впрыска
    uint32_t *const pTime;// указатель на длительность задержки впрыска
    const byte hallPin  ; // пин холла
    const byte CamutatorPin;// пин инжектора
    bool hall, oldHall;
    bool statC = 0; //состояние задержки
    bool Camutator;
    bool invH, invC; // инверсия выходов датчика Холла и инжектора
    uint32_t past = 0;
  public:
    Cl_HallCamutator(byte hallPin_, bool invH_, byte CamutatorPin_, bool invC_, uint32_t *pTimeC_, uint32_t *pTime_)
      :      hallPin(hallPin_), invH(invH_), CamutatorPin(CamutatorPin_), invC(invC_) , pTimeC(pTimeC_), pTime(pTime_) {}
    void setup() {
      pinMode(hallPin, INPUT);
      oldHall = digitalRead(hallPin)^invH;
      pinMode(CamutatorPin, OUTPUT);
      Camutator = 0;
      digitalWrite(CamutatorPin, Camutator ^ invC);
    }
    void loop() {
      hall = digitalRead(hallPin)^invH;
      if (hall && !oldHall) { // если сработал датчик Холла
        oldHall = 1;
        statC = 1;
        timeC = *pTimeC; // выставить новое время задержки впрыска
        past = mill;
      }
      else if (!hall && oldHall) {
        oldHall = 0;
      }
      if (statC && mill - past >= timeC) {
        statC = 0;
        Camutator = 1;            // то вкл Инжектор
        digitalWrite(CamutatorPin, invC ^ Camutator);
        time = *pTime; // выставить новое время впрыска
        past = mill;
      }
      if (Camutator && mill - past >= time) { // если истекло время
        Camutator = 0;                         // то выкл Инжектор
        digitalWrite(CamutatorPin, invC ^ Camutator);
      }
    }
};
//----Компоновка------------------------
uint32_t timeC = 0; //время задержки комутации в микросекундах
Cl_Operejenie Operejenie(/*пин потенциометра*/A13,/*переменая*/&timeC);
uint32_t time = 2; //время комутации в милисекундах
Cl_HallCamutator HallCamutator1(/*датчик Холла1*/8,/*инверт сиг с датХолла1*/1,/*катушка1*/46,/*инверт сиг на камутатор1*/0,/*время задерж.камутации*/&timeC,/*время камутации*/&time);
Cl_HallCamutator HallCamutator2(/*датчик Холла3*/9,/*инверт сиг с датХолла3*/1,/*катушка1*/46,/*инверт сиг на камутатор1*/0,/*время задерж.камутации*/&timeC,/*время камутации*/&time);
Cl_HallCamutator HallCamutator3(/*датчик Холла2*/10,/*инверт сиг с датХолла2*/1,/*катушка2*/38,/*инверт сиг на камутатор2*/0,/*время задерж.камутации*/&timeC,/*время камутации*/&time);
Cl_HallCamutator HallCamutator4(/*датчик Холла4*/11,/*инверт сиг с датХолла4*/1,/*катушка2*/38,/*инверт сиг на камутатор2*/0,/*время задерж.камутации*/&timeC,/*время камутации*/&time);
//-----main-----------------------
int main() {
  init();
  // setup
  Operejenie.setup();
  HallCamutator1.setup();
  HallCamutator2.setup();
  HallCamutator3.setup();
  HallCamutator4.setup();

  for (;;) {
    // loop
    mill = millis();
    Operejenie.loop();
    HallCamutator1.loop();
    HallCamutator2.loop();
    HallCamutator3.loop();
    HallCamutator4.loop();
  }
  return 0;
}
/*Скетч использует 2520 байт (0%) памяти устройства. Всего доступно 253952 байт.
  Глобальные переменные используют 124 байт (1%) динамической памяти, оставляя 8068 байт для локальных переменных. Максимум: 8192 байт.
*/

 

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

Еще вопрос такой правильно ли я делаю график опенежения или нужно по другому.

/*в переменной set0 значение 
1  6000
2  800
3  5000 
4  5134 
5  4883
6  4829
7  4938
8  4889
9  4843
10 4808
11 4778
12 4747
13 4725
14 4717
15 4770
16 4833
17 4912
18 4938
19 4985
20 5098
21 5132
22 5167
23 5198
24 5206
25 5253
26 5278
/**//**/

  
 
    
if (time0 == set0 && period <= 625000){
   time0 = set1;
   if (period > 625000)
      time0 = set0;
  }
    
  /* 
если значение в переменной таймO равно 6000 и период равен или меньше 625000 
то присваеваем значение set0 значению таймO
иначе эсли период больше 625000
то присваеваем значение set0 значению таймO
 */

Таких строк 26 26 параметров относительно оборотов двигателя.

DetSimen
DetSimen аватар
Offline
Зарегистрирован: 25.01.2017

infyniti, а на вашем инновационном нанодвигателе цилиндры в каком порядке работають?

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

DetSimen пишет:

infyniti, а на вашем инновационном нанодвигателе цилиндры в каком порядке работають?

Думаю, что в любом, причём на лету адаптируются в зависимости от состава смеси, IQ водителя и фазы Луны.

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

1-3-2-4

DetSimen
DetSimen аватар
Offline
Зарегистрирован: 25.01.2017

а у добрых людей 1-3-4-2

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

DetSimen пишет:

а у добрых людей 1-3-4-2

А у некоторых добрых людей 1-2-4-3 наврятли я ошибся у меня опозитка не рядный.Если только с углом.Я специально поставил потенциометр для корекции.

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

При такой схеме

У меня 2 варианта 1-3-4-2 и 1-2-4-3 Точно... куда смотрел провода когда снимал?

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

А может и такая 

 

 

 

Завтра посмотрю

MaksVV
Offline
Зарегистрирован: 06.08.2015

может так? Порядок работы двигателя: 1 – 4 – 3 – 2 или 1 – 2 – 3 – 4.

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

MaksVV пишет:

может так? Порядок работы двигателя: 1 – 4 – 3 – 2 или 1 – 2 – 3 – 4.

Нет я сейчас на второй каленвал смотрел.Я когда правода снимал с крышки на катушки по порядку ставил.1-3-2-4 или 1-4-2-3.

Но у меня 2 катушки правая и левая без разницы 2 раза правая 2 раза левая бьют.

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

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

qwone а что если

 AnalogRead() — скорость выполнения 110 мкс.

AnalogWrite() — 2000 мкс

SerialPrintLn() — при скорости 9600 около 250мкс, а при максимальной скорости около 3мкс.



DigitalWrite() — 1800мкс



DigitalRead() — 1900мкс

все это дело ригистрами прописать? 

https://geektimes.ru/post/255744/

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

infyniti пишет:

 AnalogRead() — скорость выполнения 110 мкс.

AnalogWrite() — 2000 мкс

SerialPrintLn() — при скорости 9600 около 250мкс, а при максимальной скорости около 3мкс.



DigitalWrite() — 1800мкс



DigitalRead() — 1900мкс

все это дело ригистрами прописать? 

https://geektimes.ru/post/255744/

"У моего соседа была замечательная кобылка Соня, сивая такая, грациозная красотка. Так вот как-то захворала она и начала бредить ..."

Это я к чему ... поймайте автора этого опуса и плюньте ему в рожу.

А если не поймёт за что, покажите ему вот такой тест:

template <typename T> inline Print & operator << (Print &s, T n) { s.print(n); return s; }

#define TEST(x) \
	{	 \
	const unsigned long startPoint = millis(); \
	for (int i = 0; i < 1000; i++) { \
		x; x; x; x; x; x; x; x; x; x; \
	} \
	const unsigned long endPoint = millis(); \
	const unsigned long diff = endPoint - startPoint; \
	Serial << "10000 of " << #x << ": " << diff << "ms"; \
	Serial << " ::: Single " << #x << ": " << ((double)diff / 10000.0) << "ms\n"; \
	}


void setup() {
	pinMode(10, OUTPUT);
	pinMode(11, INPUT);
	Serial.begin(115200);
	
	TEST(digitalWrite(10, HIGH));
	TEST(digitalRead(11));
	TEST(analogRead(0));
	TEST(analogWrite(3, 127));
}

void loop() {
}

Пусть он его запустит и убедится что

10000 of digitalWrite(10, HIGH): 58ms ::: Single digitalWrite(10, HIGH): 0.01ms
10000 of digitalRead(11): 48ms ::: Single digitalRead(11): 0.00ms
10000 of analogRead(0): 1120ms ::: Single analogRead(0): 0.11ms
10000 of analogWrite(3, 127): 63ms ::: Single analogWrite(3, 127): 0.01ms

Все, кроме analogRead выполняется за 10мкс и меньше, а analogRead - за 110мкс, здесь он не ошибся.

Если бы у него (или у Вас) были мозги, он (или Вы) сразу бы заметил, что в его данных ошибка, т.к. не может такая сложная операция, как analogRead выполняться в 15 раз медленнее, чем digitalWrite.

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

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

Как можно проверить скорость моего кода?

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

1. Выберите свободный пин (FPIN)
2. Сконфигурируйте его на OUTPUT
3. Объявите глобальную переменную bool kaka = false;
4. В ключевых точках программы вставьте вызов: digitalWrite(FPIN, kaka = !kaka);
5. Подключите к FPIN осциллограф и следите.

При каждом взове команды из п.4, состояние пина будет меняться с LOW на HIGH или наоборот (при нечётном вызове - LOW->HIGN, при чётном - HIGH->LOW).

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

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

А без осциллографа ни как?

Yarik.Yar
Offline
Зарегистрирован: 07.09.2014

На глаз, либо ещё одной ардуиной с таймером в режиме захвата.

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

infyniti пишет:

А без осциллографа ни как?

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

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

Вроде нашел причину.

Если датчик дает сигнал и время не вышло то при следующем сигнале выстовляется новое время.

 

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

infyniti пишет:

Вроде нашел причину.

Если датчик дает сигнал и время не вышло то при следующем сигнале выстовляется новое время.

 

Помоготе исправить проблемму.

class Cl_HallToInj {
    uint32_t timeI = 0; // длительность задержки впрыска
    uint32_t time1 = 0; // длительность впрыска
    uint32_t *const pTimeI;// указатель на длительность задержки впрыска
    uint32_t *const pTime1;// указатель на длительность задержки впрыска
    const byte hallPin  ; // пин холла
    const byte injPin;// пин инжектора
    bool hall, oldHall;
    bool statI = 0; //состояние задержки
    bool inj;
    bool invH, invI; // инверсия выходов датчика Холла и инжектора
    uint32_t past = 0;
  public:
    Cl_HallToInj(byte _hallPin, bool _invH, byte _injPin, bool _invI, uint32_t *_pTimeI, uint32_t *_pTime1)
      :      hallPin(_hallPin), invH(_invH), injPin(_injPin), invI(_invI) , pTimeI(_pTimeI), pTime1(_pTime1) {}
    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;
        statI = 1;
        timeI = *pTimeI; // выставить новое время задержки впрыска
        past = micro;
      }
      else if (!hall && oldHall) {
        oldHall = 0;
      }
      if (statI && micro - past >= timeI) {
        statI = 0;
        inj = 1;            // то вкл Инжектор
        digitalWrite(injPin, invI ^ inj);
        time1 = *pTime1; // выставить новое время впрыска
        past = micro;
      }
      if (inj && micro - past >= time1) { // если истекло время
        inj = 0;                         // то выкл Инжектор
        digitalWrite(injPin, invI ^ inj);
      }
    }
};

 

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

infyniti пишет:

Помоготе исправить проблемму.

Я Вам уже много раз говорил, что либо идите в "Ищу исполнителя", либо учитесь программировать. Вы же предпочитаете не делать ни того, ни другого, а клянчить о помощи по каждой мелкой ерунде. Квон, конечно, известный альтруист, но что Вы будете делать, когда и ему надоест? Может таки поучиться чему-нибудь и хоть таку мелочь уметь делать самому?

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

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

infyniti пишет:

Помоготе исправить проблемму.

Я Вам уже много раз говорил, что либо идите в "Ищу исполнителя", либо учитесь программировать. Вы же предпочитаете не делать ни того, ни другого, а клянчить о помощи по каждой мелкой ерунде. Квон, конечно, известный альтруист, но что Вы будете делать, когда и ему надоест? Может таки поучиться чему-нибудь и хоть таку мелочь уметь делать самому?

Подскажите как исправить проблемму.Может и сам исправлю код.Я учусь но времени мало сижу читаю но пока не доходит. 

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

infyniti пишет:
Подскажите как исправить проблемму.Может и сам исправлю код.

В том-то и беда, если подскажу, то сами уже никогда не исправите.

Так что давайте, думайте, изучайте, ... ну, или ждите Квона.

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

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

infyniti пишет:
Подскажите как исправить проблемму.Может и сам исправлю код.

В том-то и беда, если подскажу, то сами уже никогда не исправите.

Так что давайте, думайте, изучайте, ... ну, или ждите Квона.

 А вы подскажите а там видно будет может я не то читаю.Зачем читать то что не нужно всему свое время.

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

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

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

4дня рылся с ускорением а решилось одним ответом.Оно нафик не нужно.

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

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

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

Не совсем я и тупой больше половины я понимаю.


    bool hall, oldHall;

Вот это я не понимаю

    uint32_t past = 0;

Это что переменная времени?

И пока все.Остальное закаментировано и читается.

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

Может и не верно но это как я читаю

//--------------------Cl_HallToInj-------------------------------
// класс Датчик Холла задает начало открытия инжектора
class Cl_HallToInj {
    uint32_t timeI = 0; // длительность задержки впрыска
    uint32_t time1 = 0; // длительность впрыска
    uint32_t *const pTimeI;// указатель на длительность задержки впрыска
    uint32_t *const pTime1;// указатель на длительность задержки впрыска
    const byte hallPin  ; // пин холла
    const byte injPin;// пин инжектора
    bool hall, oldHall;//переменные для холла но почему 2 а не1
    bool statI = 0; //состояние задержки
    bool inj;//для инжектора
    bool invH, invI; // инверсия выходов датчика Холла и инжектора
    uint32_t past = 0;//походу для таймера
  public:
    Cl_HallToInj(byte _hallPin, bool _invH, byte _injPin, bool _invI, uint32_t *_pTimeI, uint32_t *_pTime1)
      :      hallPin(_hallPin), invH(_invH), injPin(_injPin), invI(_invI) , pTimeI(_pTimeI), pTime1(_pTime1) {}
    void setup() {
      pinMode(hallPin, INPUT);                     //вход
      oldHall = digitalRead(hallPin)^invH;         //присваеваем состояние
      pinMode(injPin, OUTPUT);                     //выход
      inj = 0;                                     //присваеваем 0
      digitalWrite(injPin, inj ^ invI);            //устанавливаем инверсию
    }
    void loop() {
      hall = digitalRead(hallPin)^invH;            //смотрим состояние
      if (hall && !oldHall) {                      //если сработал датчик Холла
        oldHall = 1;                               //присваеваем 1
        statI = 1;                                 //присваеваем 1
        timeI = *pTimeI;                           //выставить новое время задержки впрыска
        past = micro;                              //присваеваем время ?
      }
      else if (!hall && oldHall) {                 //иначе если 0и1 то
        oldHall = 0;                               //присваеваем 0
      }
      if (statI && micro - past >= timeI) {        //если истекло время
        statI = 0;                                 //присвоить 0
        inj = 1;                                   //то вкл Инжектор
        digitalWrite(injPin, invI ^ inj);          //устанавливаем инверсию
        time1 = *pTime1;                           //выставить новое время впрыска
        past = micro;                              //присваеваем время ?
      }
      if (inj && micro - past >= time1) {          //если истекло время
        inj = 0;                                   //то выкл Инжектор
        digitalWrite(injPin, invI ^ inj);          //устанавливаем инверсию
      }
    }
}

 

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

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

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

У меня 2 версии почему так происходит.

1В скетче нет конкретной привязки к ринам,и переписать строки в этом случае мало.

2То что нужно перепесать строки 

П.С. А читаю я программирование код я уже когда меня разбудят говорить наизусть.

qwone
qwone аватар
Offline
Зарегистрирован: 03.07.2016
//--------------------Cl_HallToInj-------------------------------
// класс Датчик Холла задает начало открытия инжектора
class Cl_HallToInj {
    uint32_t timeI = 0; // длительность задержки впрыска
    uint32_t time1 = 0; // длительность впрыска
    uint32_t *const pTimeI;// указатель на длительность задержки впрыска
    uint32_t *const pTime1;// указатель на длительность задержки впрыска
    const byte hallPin  ; // пин холла
    const byte injPin;// пин инжектора
    bool hall, oldHall;//переменные для холла но почему 2 а не1
    bool statI = 0; //состояние задержки
    bool inj;//для инжектора
    bool invH, invI; // инверсия выходов датчика Холла и инжектора
    uint32_t past = 0;//походу для таймера
  public:
    Cl_HallToInj(byte _hallPin, bool _invH, byte _injPin, bool _invI, uint32_t *_pTimeI, uint32_t *_pTime1)
      :      hallPin(_hallPin), invH(_invH), injPin(_injPin), invI(_invI) , pTimeI(_pTimeI), pTime1(_pTime1) {}
    void setup() {
      pinMode(hallPin, INPUT);                     //вход
      oldHall = digitalRead(hallPin)^invH;         //присваеваем состояние
      pinMode(injPin, OUTPUT);                     //выход
      inj = 0;                                     //присваеваем 0
      digitalWrite(injPin, inj ^ invI);            //устанавливаем инверсию
    }
    void loop() {
      hall = digitalRead(hallPin)^invH;            //смотрим состояние
      if (hall && !oldHall) {                      //если сработал датчик Холла
        oldHall = 1;                               //присваеваем 1
        statI = 1;                                 //присваеваем 1
        timeI = *pTimeI;                           //выставить новое время задержки впрыска
        past = micro;                              //присваеваем время ?
        //** вот сюда надо поставить это
        inj = 0;                                   //то выкл Инжектор
        digitalWrite(injPin, invI ^ inj);          //устанавливаем инверсию
      }
      else if (!hall && oldHall) {                 //иначе если 0и1 то
        oldHall = 0;                               //присваеваем 0
      }
      if (statI && micro - past >= timeI) {        //если истекло время
        statI = 0;                                 //присвоить 0
        inj = 1;                                   //то вкл Инжектор
        digitalWrite(injPin, invI ^ inj);          //устанавливаем инверсию
        time1 = *pTime1;                           //выставить новое время впрыска
        past = micro;                              //присваеваем время ?
      }
      if (inj && micro - past >= time1) {          //если истекло время
        inj = 0;                                   //то выкл Инжектор
        digitalWrite(injPin, invI ^ inj);          //устанавливаем инверсию
      }
    }
}

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

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

qwone пишет:


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

Я это уже понял с примерами скорости выполнения вот и вернулся к коду.

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

Завелась, ласточка.

Пришлось вернутся к одной катушке.

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

Завелась на простом скече (пустом) и на 2 ардуинах.На меге инжектор на нано зажигание.

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

Жалко не успел периодметр попробовать.

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

С потенциометром происходят странные вещи.

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

 

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

infyniti пишет:

Один раз даже в минус показывать начал.

Это то, о чём говорил DetSimen - расход стал отрицательным, движок замироточил бензином. Поздравляю!

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

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

infyniti пишет:

Один раз даже в минус показывать начал.

Это то, о чём говорил DetSimen - расход стал отрицательным, движок замироточил бензином. Поздравляю!

А я думаю чет не глохнет странно