Добрый день. Нужна помощь форума. Мне нужно снять сигнал с форсунки.На форсунке постоянно есть 12В и ЭБУ включает их минусом. Я так понимаю что мне нужен фильтр чтобы подать сигнал на аналоговый вход NANO. Подскажите схемку как для новичка.
Вид для печати
Добрый день. Нужна помощь форума. Мне нужно снять сигнал с форсунки.На форсунке постоянно есть 12В и ЭБУ включает их минусом. Я так понимаю что мне нужен фильтр чтобы подать сигнал на аналоговый вход NANO. Подскажите схемку как для новичка.
Схема
Вложение 15896
Спасибо. А попроще можно как нибудь. Оптопары у меня нет и у них время включения выключения 3-4 мс это не много ?Мне нужно посчитать время открытия форсунки за секунду. Похожая схема мне уже попадалась.https://labitat.dk/w/images/0/0c/Opto3.png
И еще вопрос нужно ли дополнительно как то защищать GND на Nano? Например как на этой схеме http://ecomodder.com/forum/member-su...52-filter1.jpg
Вот схема которая проще
На входе Arduino нужно включить подтягивающий резистор
Вложение 15898
Вот это мне больше подходит. Выложу скетч (не мой) может кому то пригодится.
Расходомер на инжектор.
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;
}
А какое напряжение я получу по этой схеме ? У меня получается очень мало 0.01. Диод КД243Д, кон-р 33nJ. Где ошибка ?
Я же писал про внутреннюю подтяжку входа
Для этой схемы лучше использовать диод Шоттки
Если знаешь протокол обмена, то измерение длительности импульса, на мой взгляд, проще реализовать через МС33290 (http://compcar.ru/forum/showthread.php?t=4992). Нужно будет только отправить запрос и получить готовый результат.
Нашел автора скетча и он предложил такую схему
Вложение 15959
http://compcar.ru/forum/attachment.p...chmentid=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")
Судя по схеме автор с электроникой не дружит
А в той схеме которую вы давали ранее,тоже с оптопарой,
номинал номиналы конденсатора и сопротивления какие? На датчик скорости можно использовать такую же схему? Оптопара написанная в схеме автора подойдет? А что у автора неправильно, перестраховался?
Я не говорю что работать не будет, но для чего автор прилепил резистор 4 ом ? Возможно в цепи из-за него будет протекать большой ток, или он может привести к неисправности ЭБУ
То что он не дружит с электроникой понятно по делителю перед светодиодом.
Вложение 15960
Так будет работать ?
Ссылка битая
Немножко параметры подправил
Можно к любым бортовым, дикретным датчикам цеплять и к датчику скорости в том числе
С конденсатором я промахнулся, нужен 10n он же 0,01мкф
Для датчика скорости возможно 0,01мкф будет многовато, нужно рассчитывать или пробовать
для 5в можно и без оптрона обойтись
купил 4 оптопары, все собрал по схеме и.... ни одна оптопара не работает. Как их можно проверить на работоспособность кроме как подать напряжение? надпись на оптопаре С С4 РС817 sharp http://www.e-voron.dp.ua/catalog/pc817
А почему решил что не работает?
собрал все по схеме которую Вы дали мне на пару постов выше и почему то не работает. Я подаю 12в на первую ногу через резистор а на ноге 4 ничего не получаю.2 и 3 на землю.
Что именно ты там хочешь получить? Если мерить омметром, то должно быть около 2 кОм. Этого достаточно для контроллера для определения изменения логического уровня сигнала.
Собрал простенький тестер оптопар, найденный на просторах интернета Вложение 15988
Из 4 штук, светодиод сработал только на одной оптопаре. Интересно как я их все убил ?
http://compcar.ru/forum/attachment.p...chmentid=15988
Подскажите какие компоненты брать.
РЕЗИСТОР (+/-5%) 0,25ВТ 2,7 КОМ
РЕЗИСТОР (+/-5%) 0,25ВТ 5,1 КОМ
Подойдут?
А конденсаторы какие лучше брать
КОНДЕНСАТОР МЕТАЛЛОПЛЕНОЧНЫЙ 0,01 МКФ,10%, 250V (CBB-21)
КОНДЕНСАТОР ДИСКОВЫЙ 0,01 МКФ/50В,Z5U,+80-20%
И какой конденсатор ставить на датчик скорости ? Судя по мануалу он работает 1.5В-6.5В, 0,01 МКФ много будет ? Или его можно без оптопары ?
Подскажите еще такой момент. В скетче реализована функция которая проверяет напряжение на А0 и если оно падает ниже 3В то скидывает двухзначное число в EEPROM. Как лучше подключить конденсатор, чтобы дать ардуине лишнюю секунду что бы успеть сбросить данные.
К пину +5
+5 это вход или выход ?
Можно использовать как Вход, и Выход
Только если использовать как Выход имейте ввиду нельзя перегружать по току
Если питать ардуину через USB, то можно
Если питать через Vin, от бортовой сети автомобиля то нельзя
С LM2596 можно на +5в запитать, Vin не нужен
Или это касается только нерегулируемого входного напряжения ?Цитата:
Сообщение от ;
Это для касательно Vin, если нет внешних стабилизированных +5в
Тогда у меня получается так.Вложение 16079
http://compcar.ru/forum/attachment.p...chmentid=16079