Тахометр
- Войдите на сайт для отправки комментариев
Категорически приветствую.
Есть автомобиль с установленным на него ресивером 21127 (изменяемая геометрия), переключать ресивер необходимо на определенных оборотах, но штатный ЭБУ авто не "умеет" обращаться с соленоидом ресивера, переключающим каналы. Для решения данной проблемы были приобретены:
- Iskra Neo
- 2-х канальный релейный модуль
Схема соединения Дуина->Релейный модуль:
- 5V -> VCC
- GND -> GND
- PIN9 -> In1
- PIN8 -> In2
На цифровой порт 3 подключен тахометр через диод 1N4001.
Когда дуина подключена к ПК, соединяю 3-й пин с 7-м и генерирую на 7-й пин сигнал, все работает.
Траблы начинаются при подключении к автомобилю.
При подключении дуины к бортовой сети (через ЮСБ, проводами) все нормально.
Берем сигнал тахометра с ЭУР и подключаем его к 3-му цифровому порту через диод 1N4001, ибо при заглушенном двигателе вольтметр показывает +12 вольт, а при запущенном +4.7 вольта.
При запуске двигателя дуина начинает считывать полную ахинею, тогда мы берем и отключаем ее от бортовой сети автомобиля и подключаем внешнее питание (в моем случае крона или ноутбук) и, вуаля, дуина без проблем считывает обороты двигателя, но, иногда, проскакивают "глюки": скажем, на холостых дуина считает все верно в пределах 900-1000 об/мин, но могут проскочить значения: 500, 14000, 9000...
Так же было замечено: дуина подключена к автомобилю + подключен тахометр, запускаем двигатель, ОТКЛЮЧАЕМ плюсовой провод от дуины, оставляя только тахометр и минусовой провод... дуина продолжает работать...
#define RELE_SHIFT_LIGHT 9 //Цифровой порт #9 управления реле шифт-лампы #define RELE_VALVE_21127 8 //Цифровой порт #8 управления реле клапана ресивера #define VELOCITY_GAUGE 3 //Цифровой порт #3 сигнал тахометра #define ON 0 //Включено #define OFF 1 //Выключено volatile unsigned int RPM_ON_VALVE_21127 = 4350; //Включать клапан ресивера при достижении оборотов, об/мин volatile unsigned int RPM_ON_SHIFT_LIGHT = 1500; //Включать шифт лампу при достижении оборотов, об/мин volatile unsigned long microsold = 0; //Предыдущее значение таймера volatile unsigned int rpm = 0; //Обороты коленвала, об/мин volatile unsigned int rpmOFF = 0; //Обороты коленвала для отключения коротких каналов, об/мин volatile byte sz = 0; //счетчик обнуления volatile boolean st = false; //триггер void setup() { Serial.begin(115200); //pinMode(7, OUTPUT); //Устанавливаем выходы реле pinMode(RELE_VALVE_21127, OUTPUT); //Устанавливаем режим работы выхода #8(Клапан ресивера) как выход. pinMode(RELE_SHIFT_LIGHT, OUTPUT); //Устанавливаем режим работы выхода #9(шифт-лампа) как выход. pinMode(VELOCITY_GAUGE, INPUT); //Устанавливаем режим работы выхода #3(Сигнал тахометра) как вход. //При включении зажигания выключить реле digitalWrite(RELE_VALVE_21127, OFF); //По умолчанию реле клапана ресивер выключено digitalWrite(RELE_SHIFT_LIGHT, OFF); //По умолчанию реле шифт-лампы выключено //Устанавливаем вход тахометра digitalWrite(VELOCITY_GAUGE, HIGH); //Внутренняя подтяжка attachInterrupt(0, RPM, RISING); //Устанавливаем считывание оборотов через прерывание //tone(7, 33); //Эмуляция выходного сигнала тахометра для тестов на пин 4. 100Hz = 2*3000 об/мин. 2 импульса за один оборот } void loop(){ Serial.println(rpm); if (sz != 0){ sz--; }else{ rpm = 0; }; rpmOFF = rpm + 100; //Если текущие обороты больше или равны максимально заданным для переключения ресивера, с учетом времени реакции, то переключаем ресивер на короткий. //В противном случае включаем дальний ресивер if(rpm>=RPM_ON_VALVE_21127){ digitalWrite(RELE_VALVE_21127, ON); }else if(rpmOFF<RPM_ON_VALVE_21127){ digitalWrite(RELE_VALVE_21127, OFF); } //Если текущие обороты больше или равны максимально заданным для шифт лампы, с учетом времени реакции, то включаем лампу. //В противном случае выключаем лампу if(rpm>=RPM_ON_SHIFT_LIGHT){ digitalWrite(RELE_SHIFT_LIGHT, ON); }else if(rpm<RPM_ON_SHIFT_LIGHT){ digitalWrite(RELE_SHIFT_LIGHT, OFF); } delay(500); } //Считывание оборотов void RPM(){ //rpm = (1000000.0/(micros() - microsold))*60/2; //microsold = micros(); if(!st){ microsold = micros(); }else{ rpm = (1000000.0/(micros() - microsold))*60/2; //об/мин. 100Hz = 2*3000 об/мин. импульс 2 раза за один оборот. } st = !st; sz = 10; }
Я уже сбился с ног пытаясь определить причину такого глюка. Хотя бы заставить нормально работать от бортовой сети. Подскажите, куда копать. Проблему неверных значений думаю решить "отбросом" слишком быстрых изменений.
ЗЫ: В Ардуино новичек.
Вы бы схему привели.
Судя по описанию, у Вас проблема с питанием. Но, возможно, не только с ним.