Тахометр

Романыч
Романыч аватар
Offline
Зарегистрирован: 22.07.2016

Категорически приветствую.
Есть автомобиль с установленным на него ресивером 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;
}

Я уже сбился с ног пытаясь определить причину такого глюка. Хотя бы заставить нормально работать от бортовой сети. Подскажите, куда копать. Проблему неверных значений думаю решить "отбросом" слишком быстрых изменений.
ЗЫ: В Ардуино новичек.

andriano
andriano аватар
Offline
Зарегистрирован: 20.06.2015

Вы бы схему привели.

Судя по описанию, у Вас проблема с питанием. Но, возможно, не только с ним.