Страница 1 из 5 12345 ПоследняяПоследняя
Показано с 1 по 10 из 47
  1. #1
    Пользователь
    Регистрация
    02.02.2013
    Сообщений
    22
    Вес репутации
    143

    По умолчанию маршрутный компьютер

    Добрый день. Нужна помощь форума. Мне нужно снять сигнал с форсунки.На форсунке постоянно есть 12В и ЭБУ включает их минусом. Я так понимаю что мне нужен фильтр чтобы подать сигнал на аналоговый вход NANO. Подскажите схемку как для новичка.
    Последний раз редактировалось IShved; 13.02.2013 в 02:54.

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

    По умолчанию Re: маршрутный компютер

    Схема
    Нажмите на изображение для увеличения. 

Название:	opto_in.png 
Просмотров:	1652 
Размер:	7.3 Кб 
ID:	15896

  3. #3
    Пользователь
    Регистрация
    02.02.2013
    Сообщений
    22
    Вес репутации
    143

    По умолчанию Re: маршрутный компютер

    Спасибо. А попроще можно как нибудь. Оптопары у меня нет и у них время включения выключения 3-4 мс это не много ?Мне нужно посчитать время открытия форсунки за секунду. Похожая схема мне уже попадалась.
    И еще вопрос нужно ли дополнительно как то защищать GND на Nano? Например как на этой схеме
    Последний раз редактировалось IShved; 02.02.2013 в 22:59.

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

    По умолчанию Re: маршрутный компютер

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

Название:	user.png 
Просмотров:	1454 
Размер:	2.7 Кб 
ID:	15898

  5. #5
    Пользователь
    Регистрация
    02.02.2013
    Сообщений
    22
    Вес репутации
    143

    По умолчанию Re: маршрутный компютер

    Вот это мне больше подходит. Выложу скетч (не мой) может кому то пригодится.
    Расходомер на инжектор.
    PHP код:
    #include <LiquidCrystal.h>

    #define SPEED_PIN A6 // Номер ноги для датчика скорости
    #define INJECTOR_PIN A7 // Номер ноги для форсунки
    #define PERIOD 1000000 // Период усреднения текущего расхода и обновления дисплея (микросекунды) - пять секунд

    #define IDLE_STROKE_DURATION 21000 // Суммарное время открытия форсунок (милисекунды) за период на холостом ходу
    #define IDLE_STROKE_HOUR_CONSUMPTION 0.7 // Часовой расход топлива на холостом ходу (литры в час)
    #define TEST_SPEED 60.0 // Контрольная скорость (километры в час) для расчёта коэффициента пробега
    #define TEST_TICKS 84 // Число импульсов с датчика скорости за период на контрольной скорости

    #define HOUR_PERIODS ( 3600000000.0 / PERIOD ) // Число периодов в часу
    #define FUEL_FACTOR ( IDLE_STROKE_HOUR_CONSUMPTION / HOUR_PERIODS / IDLE_STROKE_DURATION ) // Коэффициент расхода топлива (литры) за период
    #define RANGE_FACTOR ( TEST_SPEED / TEST_TICKS / HOUR_PERIODS ) // Коэффициент пробега (километры) за период
    #define CONSUMPTION_FACTOR ( 100.0 * FUEL_FACTOR / RANGE_FACTOR ) // Коэффициент километрового расхода топлива (литры на 100 км)

    #define TICKS_TRESHOLD 1 // Порог (импульсы датчика скорости) за период, выше которого можно считать километровый расход
    #define DURATION_CORR 0 // Поправка при измерении длительности времени открытия одной форсунки (микросекунды)
    #define AVG_LENGTH 10 // Число периодов для усреднения

    #define AVG_REFRESH_TIME 1 // Время в часах, после которого сбрасывается усреднённый километровый расход, если не было сброса по расстоянию (1 час)
    #define AVG_REFRESH_LENGTH 0.1 // Расстояние в километрах, после которого сбрасывается усреднённый километровый расход (100 м)
    #define AVG_REFRESH_PERIODS ( AVG_REFRESH_TIME * HOUR_PERIODS ) // Число периодов между обновлениями среднего расхода
    #define AVG_REFRESH_TICKS ( AVG_REFRESH_LENGTH / RANGE_FACTOR ) // Число импульсов датчика скорости между обновлениями среднего расхода

    // Строковые константы
    #define STR_AVG String(" Cp:")
    #define STR_CUR String("M\xB4\xBD:")
    #define STR_NA String(" \xBD/\xE3")
    #define STR_KMH String("\xBA\xBC/\xC0")

    LiquidCrystal lcd(12115432);

    unsigned long dur;
    unsigned long dur_t;
    unsigned long t;

    boolean last_injector_state;
    boolean last_speed_state;

    unsigned long total_duration;
    unsigned long total_ticks;
    unsigned long total_avg_duration;
    unsigned long total_avg_ticks;
    unsigned long d_avg_duration;
    unsigned long d_avg_ticks;
    int period_counter;
    // int period_counter2;

    // Структура, описывающая данные для усреднения
    struct consumption_data {
      
    unsigned int duration;
      
    word ticks
    };

    struct consumption_data data[AVG_LENGTH];
    int avg_counter;

    void setup() {
      
    // Serial.begin(9600);
      
    lcd.begin(82);
      
    micros() + PERIOD;
      
    pinMode(INJECTOR_PININPUT);
      
    pinMode(SPEED_PININPUT);
      
    last_injector_state analogRead(INJECTOR_PIN) > 500;
      
    last_speed_state analogRead(SPEED_PIN) > 500;
      
      
    dur 0;
      
    dur_t micros();
      
    total_duration 0;
      
    total_ticks 0;
      
    total_avg_duration total_duration;
      
    total_avg_ticks total_ticks;
      
    d_avg_duration total_duration;
      
    d_avg_ticks total_ticks;
      
      
    // Инициализация данных для усреднения
      
    for (int i=0AVG_LENGTH; ++i) {
        
    data[i].duration 0;
        
    data[i].ticks 0;
      }
      
      
    period_counter 0;
    //  period_counter2 = 0;
      
    avg_counter 0;
    }

    void loop() {
      
    boolean injector_state analogRead(INJECTOR_PIN) > 500;
      
    boolean speed_state analogRead(SPEED_PIN) > 500;
      
    unsigned long new_t micros();
      
      
    // Вычисление мгновенных значений
      
      
    if (injector_state != last_injector_state) {
        if (
    injector_state) {
          
    dur new_t dur_t;
          if (
    durdur += DURATION_CORR// Поправочка
          
    total_duration += dur;
        } else {
          
    dur_t new_t;
          
    dur 0;
        }
        
        
    last_injector_state injector_state;
      }
      
      if (
    speed_state != last_speed_state) {
        
    total_ticks++;
        
        
    last_speed_state speed_state;
      }
      
      
    // Действия, которые выполняются раз в секунду
      
      
    if (new_t >= t) {
        if (!
    dur) {
          
    dur new_t dur_t;
          if (
    durdur += DURATION_CORR// Поправочка
          
    total_duration += dur;
        }
        
        
    // Отладочная установка значений
        
    //    if (period_counter2 < AVG_LENGTH * AVG_REFRESH_PERIODS) {
    //      total_duration = 100000;
    //      total_ticks = 56;
    //    } else if (period_counter2 < 2 * AVG_LENGTH * AVG_REFRESH_PERIODS) {
    //      total_duration = 20000;
    //      total_ticks = 1;
    //    } else {
    //      total_duration = 100000;
    //      total_ticks = 56;
    //    }
        
        
    d_avg_duration += total_duration;
        
    d_avg_ticks += total_ticks;
        
        ++
    period_counter;
    //    ++period_counter2;
        
        
    if (d_avg_ticks >= AVG_REFRESH_TICKS || period_counter >= AVG_REFRESH_PERIODS) {
          
    // Вычисление средних значений
          
          // total_avg_duration += d_avg_duration - data[avg_counter].duration;
          /// total_avg_ticks += d_avg_ticks - data[avg_counter].ticks;
          
          
    data[avg_counter].duration d_avg_duration;
          
    data[avg_counter].ticks d_avg_ticks;

          
    total_avg_duration 0;
          
    total_avg_ticks 0;
          
          for (
    int i=0AVG_LENGTHi++) {
            
    total_avg_duration += data[i].duration;
            
    total_avg_ticks += data[i].ticks;
          }
          
          
    period_counter 0;
          
    d_avg_duration 0;
          
    d_avg_ticks 0;

          ++
    avg_counter;
          if (
    avg_counter >= AVG_LENGTH)
            
    avg_counter 0;
        }
        
        
    // Конвертация значений в физические единицы и вывод на экран

        
    String s1s2s3;
        
    unsigned int consumption 0;
        
    unsigned int avg_consumption 0;
        
        if (
    total_ticks TICKS_TRESHOLD) {
          
    consumption 10.0 CONSUMPTION_FACTOR total_duration total_ticks;
        }

        if (
    total_avg_ticks TICKS_TRESHOLD) {
          
    avg_consumption 10.0 CONSUMPTION_FACTOR total_avg_duration total_avg_ticks;
        }
        
        
    unsigned int hour_consumption 10.0 FUEL_FACTOR total_duration HOUR_PERIODS;
        
    unsigned int spd RANGE_FACTOR total_ticks HOUR_PERIODS;
        
        
    s1 String(total_durationDEC);

        if (
    total_ticks TICKS_TRESHOLD) {
          
    s1 STR_CUR format(consumption);
          
    // s1 = format(consumption);
        
    } else {
          
    s1 STR_CUR STR_NA;
          
    // s1 = "n/a ";
        
    }

        if (
    total_avg_ticks TICKS_TRESHOLD) {
          
    s2 STR_AVG format(avg_consumption);
          
    // s2 = format(avg_consumption);
        
    } else {
          
    s2 STR_AVG STR_NA;
          
    // s2 = "n/a ";
        
    }

        
    // s2 = "hr: " + format(hour_consumption);
        // s2 = format(hour_consumption);
        
        // s3 = "sp: " + String(spd, DEC);
        // s3 = String(spd, DEC);
        // s3 = String(total_ticks, DEC);
        
        // int iters = 3 - s3.length();
        // int iters = 8 - s3.length();
        
        // for(int i = 0; i < iters; ++i)
        //  s3 = " " + s3;
          
        // int iters2 = 8 - s1.length();
        
        // for(int i = 0; i < iters2; ++i)
        //  s1 = " " + s1;
        
        // s3 += STR_KMH;
        
        
    lcd.setCursor(0,0);
        
    lcd.print(s2);
        
        
    lcd.setCursor(0,1);
        
    lcd.print(s1);
        
        
    total_duration 0;
        
    total_ticks 0;
        
    new_t PERIOD;
      }
    }

    String format(unsigned int dec) {
      if (
    dec 1000) return String("##.#");
      
      
    unsigned int intPart dec 10;
      
    unsigned int fracPart dec 10;
      
    String result String(intPartDEC) + "," String(fracPartDEC);

      
    int iters result.length();  
      for(
    int i 0iters; ++i)
        
    result " " result;

      return 
    result;


  6. #6
    Пользователь
    Регистрация
    02.02.2013
    Сообщений
    22
    Вес репутации
    143

    По умолчанию Re: маршрутный компютер

    А какое напряжение я получу по этой схеме ? У меня получается очень мало 0.01. Диод КД243Д, кон-р 33nJ. Где ошибка ?
    Последний раз редактировалось IShved; 03.02.2013 в 03:58.

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

    По умолчанию Re: маршрутный компютер

    Я же писал про внутреннюю подтяжку входа
    Для этой схемы лучше использовать диод Шоттки

  8. #8
    Пользователь Аватар для murano
    Регистрация
    18.01.2008
    Сообщений
    92
    Вес репутации
    219

    По умолчанию Re: маршрутный компютер

    Цитата Сообщение от IShved Посмотреть сообщение
    Мне нужно снять сигнал с форсунки.
    Если знаешь протокол обмена, то измерение длительности импульса, на мой взгляд, проще реализовать через МС33290 (http://compcar.ru/forum/showthread.php?t=4992). Нужно будет только отправить запрос и получить готовый результат.

  9. #9
    Пользователь
    Регистрация
    02.02.2013
    Сообщений
    22
    Вес репутации
    143

    По умолчанию Re: маршрутный компютер

    Цитата Сообщение от murano Посмотреть сообщение
    Если знаешь протокол обмена, то измерение длительности импульса, на мой взгляд, проще реализовать через МС33290 (http://compcar.ru/forum/showthread.php?t=4992). Нужно будет только отправить запрос и получить готовый результат.
    У меня к сожалению нет OBDII, OBDI, K-line и.т.д.

  10. #10
    Пользователь
    Регистрация
    02.02.2013
    Сообщений
    22
    Вес репутации
    143

    По умолчанию Re: маршрутный компютер

    Нашел автора скетча и он предложил такую схему
    Вложение 15959


    И еще вопрос. У меня дисплей не понимает кириллицу, как можно вернуть эти строчки к читаемому виду
    #define STR_AVG String(" Cp:")
    #define STR_CUR String("M\xB4\xBD:")
    #define STR_NA String(" \xBD/\xE3")
    #define STR_KMH String("\xBA\xBC/\xC0")
    Последний раз редактировалось IShved; 13.02.2013 в 03:02.

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

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

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

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

Ваши права

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