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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

    По умолчанию 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(12, 11, 5, 4, 3, 2);

    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(8, 2);
      
    t = micros() + PERIOD;
      
    pinMode(INJECTOR_PIN, INPUT);
      
    pinMode(SPEED_PIN, INPUT);
      
    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=0; i < AVG_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 (
    dur) dur += 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 (
    dur) dur += 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=0; i < AVG_LENGTH; i++) {
            
    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 s1, s2, s3;
        
    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_duration, DEC);

        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;
        
    t = 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(intPart, DEC) + "," + String(fracPart, DEC);

      
    int iters = 4 - result.length();  
      for(
    int i = 0; i < iters; ++i)
        
    result = " " + result;

      return 
    result;
    } 

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

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

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

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

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

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

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

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

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

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

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

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

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

    По умолчанию 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)

Ваши права

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