Снятие данных с линии тахометра

todlich
Offline
Зарегистрирован: 01.02.2017

Здравствуйте. Задумал в свой Ланос сделать тахометр, от ЭБУ идет линия (в приборке так же есть эта линия, но она висит, тк нет тахометра) в которой меандр с амплитудой в 12В и неизвестной скважностью. Так вот вопрос как снять с этой линии данные, при этом не угобив ЭБУ машины и ардуину. Был бы сигнал от 0В до 5В тут было бы более ясная картина, измерения от 0 до 1023 и дальше градировать. Вопрос по програмной части, использовать прерывания или есть другой способ работы с уже обработанным сигналом от датчиков, приходящий с ЭБУ.

P.S. форум почитал, нужного ответа для себя не нашел.

evgta
Offline
Зарегистрирован: 02.09.2016

использовать 

pulseIn()

а также вот такую схему, стабилитрон на 4,7в

 

и не раз на форуме писалось, есть и с прерываниями и с пульсином и без прерываний

todlich
Offline
Зарегистрирован: 01.02.2017

с pulsein код примерно так?
 


rpm_h = pulseIn(RPM_PIN, HIGH);
rpm_l = pulseIn(RPM_PIN, LOW);
rpm_period=(rpm_h+rpm_l);

rpm_freq = (1000000/rpm_period);
rpm = rpm_freq*30;

ну  и rpm уже куда-то отправляем (экран/сериал порт)

так же порылся по теме стабилитрона, данная схема не будет более корректно работать?

если использовать вашу схему, как рассчитывается R?

evgta
Offline
Зарегистрирован: 02.09.2016

10K поставить и будет ок. возможно конденсатор понадобится для фильтрации помех

примерно такой скетч, коэф с 24 по 27 строку свои подставляем

#include <Wire.h>               //Библиотека для работы с I2C
#include <LiquidCrystal_I2C.h>  //Библиотека для работы с экраном
LiquidCrystal_I2C lcd(63,16,2);  // Устанавливаем дисплей
long fff =0;
long yyy = 0;
long zzz = 0; 
int xxx;
void setup() 
{
 pinMode(2, INPUT);
 lcd.begin();                     
 lcd.clear(); 
  lcd.backlight();// Включаем подсветку дисплея 
}
void loop() 
{   
     zzz=0;
    for(xxx=0; xxx<20; xxx++)
    {
    yyy = pulseIn(2, LOW,20000);  // должно быстрее работать при неработающем движке
    fff=pulseIn(2, HIGH,20000);
yyy=yyy+fff;
     if (yyy==0){break;}  //или так
     yyy=1000000/yyy;
     yyy=yyy*60;
     yyy=yyy/108; 
    zzz =zzz+yyy;
    }
zzz=yyy; ///    
zzz=zzz/20;
   lcd.setCursor(0,0);
   lcd.print(zzz);
   lcd.print("      ");
} 

 

todlich
Offline
Зарегистрирован: 01.02.2017

немного не понятно 18 строка xxx<20 откуда берется 20, так же непонятно в 26 строке откуда 108 и в 30 строке zzz=zzz/20; 

evgta
Offline
Зарегистрирован: 02.09.2016

18я цикл в 20 измерений для усреднения, 26 количество периодов на оборот КВ, и еще, если сигнал переменка, то надо диод добавить чтобы пол импульса отрезать