ЭБУ для авто

Тема в разделе "Микроконтроллеры AVR", создана пользователем Yerabdi, 25 сен 2017.

  1. Yerabdi

    Yerabdi Нерд

    Спасибо прочитал понял то что в ASCII коде цифра 1 посылается кодом 49, коды от 0 до 9 легко можно пересчитать а вот от 10 до 100 там уже сложновато так как цифра 10 посылается в коде 4948.Может есть готовые библиотеки для авр студио
     
  2. sslobodyan

    sslobodyan Гик

    Плохо прочитал либо не понял :) Внимательно читаем о функции Serial.parseInt()
     
  3. Yerabdi

    Yerabdi Нерд

    Serial.parseInt() можно использовать в среде ардуино ide но не в атмел студио правильно понял
     
  4. sslobodyan

    sslobodyan Гик

    А если внимательно почитать, то там написано, что цифры передаются как '0'+число, т.е принимаем один байтик, отнимаем код цифры '0' (48) и получаем первый символ нашего числа в числовом виде :) Затем принимаем следующий символ пока не закончатся или придет символ не из диапазона '0'-'9'. При получении каждого следующего символа умножаем наше принятое число на 10 и прибавляем к нему полученное.
    Пример ардуинскими функциями, но смотрите именно на реализацию, подставите потом свои available и read.
    Код (C++):
    int SerialParseInt() {
      int chislo=0;
      while (Serial.available()) {
        byte c= Serial.read();
        if ((c>='0') && (c<='9')) {
          chislo = chislo * 10 +  (c - '0');
        } else return chislo;
      }
      return chislo;
    }
     
     
  5. Yerabdi

    Yerabdi Нерд

    По вашему примеру получается if ((c>='0') && (c<='9')) будет работать с 0 - 9 а если больше значение придет скажем сразу придет '1' и '1' (49)(49) обработка как будет ли работать
     
  6. sslobodyan

    sslobodyan Гик

    Обработается сначала первая единичка, затем вайл находит что есть еще что-то, считываем вторую единичку, умножаем первую на 10, получаем 10 и прибавляем вторую единичку, получаем 11. И так пока следующий принятый символ не описывает цифру ( вне диапазона '0'-'9' ) или приемный буфер пустой.
     
  7. b707

    b707 Гик

    Yerabdi
    Придти '1' и '1' (49)(49) "сразу" никак не может, так как мы принимаем символы ПО ОДНОМУ.

    ИМХО, с вашим уровнем зря вы сразу полезли в авр-студию - "вам бы сначала мама выговаривать" - поучится мигать диодиком в ардуине. серьезно.
     
  8. Yerabdi

    Yerabdi Нерд

    понятно спасибо
     
  9. sslobodyan

    sslobodyan Гик

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

    Yerabdi Нерд

    Не подскажете топливная карта бывает во всех случаях один или при ускорении по другой карте расчитовается
     
  11. sslobodyan

    sslobodyan Гик

    А это ноу-хау каждого производителя ;) Никто не рассказывает где и что у него сделано. А что вам мешает сделать еще одну карту добавок по ускорению?
     
    Yerabdi нравится это.
  12. Yerabdi

    Yerabdi Нерд

    думаю пока до этого я еще не дошел, у меня пока не получается рассчитать массив например если значение датчика разрежение 20 должен быть '0' столбец если 25 '1' столбец если 30 '2' столбец до 100. Тогда думаю при уменьшении и увелечении нагрузки более плавная время впрыска будет.
     
  13. Yerabdi

    Yerabdi Нерд

    понял как можно сделать мучится мучится что нибудь получится
     
  14. sslobodyan

    sslobodyan Гик

    Как-то я не понял проблемы.
    Дано - датчик выдает сигнал в диапазоне 100 - 900 отсчетов АЦП (пример, естественно - реальные показатели надо самому промерить). Задача - построить карту по этому датчику.
    1. Выбираем квантование, то есть на сколько диапазонов разбиваем полную шкалу. Если линейность датчика высокая, то разбиваем на небольшое количество участков, скажем 8. Если линейность плохая, то количество участков увеличиваем (пока хватает ресурсов для запоминания карты и ее обработки). Скажем, 32 (желательно брать степень двойки - проще делить).
    2. Если квантуем по 8, то заводим массив в 8 значений, если по 32 - то соответственно в 32 значения.
    3. Находим минимальное значение с датчика. В условиях оно 100.
    4. Шаг квантизации = (Максимум-Минимум)/квантование.
    5. Значит для нахождения элемента карты от полученного значения АЦП отнимаем минимальное и остаток делим на шаг квантизации. Например, получили 220. Минималка 100. Шаг квантизации (900-100)/8=100. Получаем номер элемента карты как (220-100)/100 = 1.2 = 1 (дробь отбрасывается при целочисленном делении). Выходит, что нам нужен элемент с индексом 1, т.е. второй по списку.
     
  15. Yerabdi

    Yerabdi Нерд

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

    sslobodyan Гик

    Акселерометром.
     
  17. Yerabdi

    Yerabdi Нерд

    Спасибо вам большое за ваши советы в массиве указал карту топлива(квантирую по 5). Работает без всяких провалов и дерганий, теперь хочу по usart изменять данные в массиве от показания лямбда зонда
     
  18. sslobodyan

    sslobodyan Гик

    Есть еще один вариант отладки ЭБУ. Делаете несколько наборов своих карт и по внешним переключателям выбираете рабочий набор. Типа как раньше было модно спорт прошивка и эконом, или газовая и бензиновая. А вы понаделайте себе хоть 8 наборов и выбирайте рабочий тремя переключателями. Потом по ощущениям определитесь какой набор лучше едет и уже только его оставите в прошивке. Метод научного тыка. Проще, чем на лету менять карту.
     
  19. Yerabdi

    Yerabdi Нерд

    Массив данных карт лучше всего хранить в еепроме или во флэш , у меня сейчас хранится в месте кодом в флэш памяти
     
  20. sslobodyan

    sslobodyan Гик

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