Тахометр
- Войдите на сайт для отправки комментариев
Категорически приветствую.
Есть автомобиль с установленным на него ресивером 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;
}
Я уже сбился с ног пытаясь определить причину такого глюка. Хотя бы заставить нормально работать от бортовой сети. Подскажите, куда копать. Проблему неверных значений думаю решить "отбросом" слишком быстрых изменений.
ЗЫ: В Ардуино новичек.
Вы бы схему привели.
Судя по описанию, у Вас проблема с питанием. Но, возможно, не только с ним.