Адаптер Сигнала Скорости
Транзистор kc238b, аналог (?) обычного кт315.
3 цифровой pin на ARDUINO - сигнал с датчика скорости.
4 цифровой pin на ARDUINO - выход на стрелочный спидометр.
A0 - аналоговый вход, сюда подключается потенциометр для регулировки. 3,3kOm (например) контакты слева направо GND/СИГНАЛ/+5V.
вместо Hz в прошивке км/ч .
При 100hz показания равны 60км/ч
скетч
//******************************************************************** volatile unsigned long micros_sp = 0; volatile byte sz = 0; //счетчик обнуления volatile unsigned int sp = 0; //скорость volatile unsigned int InputHz = 0; volatile unsigned int OutputHz = 0; double popravka = 0; volatile boolean st = false; //триггер unsigned long timing; unsigned long timing2; int Vixod=4; #define PIN_POT A0 unsigned long Period; unsigned long sp2; unsigned long Skvajnost; bool Status=0; int rotat; //******************************************************************** void setup(){ Serial.begin(115200); //инициализация ком порта attachInterrupt(1, speedometr, RISING); //прерывание спидометра по фронту импульса pinMode(PIN_POT, INPUT); pinMode (Vixod, OUTPUT); } //******************************************************************** void loop(){ if (millis() - timing > 50) { timing = millis(); if (sz != 0){sz--;}else{sp = 0;}; InputHz=sp; popravka=map(analogRead(PIN_POT),0,1023,0,200)*0.01; //Period=6000; // тестовый меандр OutputHz=InputHz*popravka; Period=600000/OutputHz; sp2=600000/Period; Serial.println ((String)OutputHz+" Hz x"+(String)popravka); Serial.println ((String)sp+"km/h"); Serial.println ((String)sp2); } Skvajnost= Period/2 ; // такая скважность называется меандр if (Status==0) { if ( (micros()-timing2)>= Skvajnost) { timing2 = micros(); digitalWrite(Vixod, HIGH); Status=1; } } if (Status==1) { if ( (micros()-timing2)>= (Period-Skvajnost) ){ timing2 = micros(); digitalWrite(Vixod, LOW); Status=0; } } } //******************************************************************** void speedometr(){ //измеряем частоту на входе спидометра по прерыванию if(!st){micros_sp = micros();} else {sp = (600000/(micros() - micros_sp));} st = !st; sz = 30; }
Транзистор kc238b, аналог (?) обычного кт315.
3 цифровой pin на ARDUINO - сигнал с датчика скорости.
4 цифровой pin на ARDUINO - выход на стрелочный спидометр.
A0 - аналоговый вход, сюда подключается потенциометр для регулировки. 3,3kOm (например) контакты слева направо GND/СИГНАЛ/+5V.
вместо Hz в прошивке км/ч .
При 100hz показания равны 60км/ч
скетч
//******************************************************************** volatile unsigned long micros_sp = 0; volatile byte sz = 0; //счетчик обнуления volatile unsigned int sp = 0; //скорость volatile unsigned int InputHz = 0; volatile unsigned int OutputHz = 0; double popravka = 0; volatile boolean st = false; //триггер unsigned long timing; unsigned long timing2; int Vixod=4; #define PIN_POT A0 unsigned long Period; unsigned long sp2; unsigned long Skvajnost; bool Status=0; int rotat; //******************************************************************** void setup(){ Serial.begin(115200); //инициализация ком порта attachInterrupt(1, speedometr, RISING); //прерывание спидометра по фронту импульса pinMode(PIN_POT, INPUT); pinMode (Vixod, OUTPUT); } //******************************************************************** void loop(){ if (millis() - timing > 50) { timing = millis(); if (sz != 0){sz--;}else{sp = 0;}; InputHz=sp; popravka=map(analogRead(PIN_POT),0,1023,0,200)*0.01; //Period=6000; // тестовый меандр OutputHz=InputHz*popravka; Period=600000/OutputHz; sp2=600000/Period; Serial.println ((String)OutputHz+" Hz x"+(String)popravka); Serial.println ((String)sp+"km/h"); Serial.println ((String)sp2); } Skvajnost= Period/2 ; // такая скважность называется меандр if (Status==0) { if ( (micros()-timing2)>= Skvajnost) { timing2 = micros(); digitalWrite(Vixod, HIGH); Status=1; } } if (Status==1) { if ( (micros()-timing2)>= (Period-Skvajnost) ){ timing2 = micros(); digitalWrite(Vixod, LOW); Status=0; } } } //******************************************************************** void speedometr(){ //измеряем частоту на входе спидометра по прерыванию if(!st){micros_sp = micros();} else {sp = (600000/(micros() - micros_sp));} st = !st; sz = 30; }
Полная схема подключения
Подключение от датчика с подтяжкой на 5 В
Рабочая (живая схема):
Список деталей для сборки:
транзистор КС238 или КТ3102 или КТ315.
оптрон РС 817
преобразователь 5В
переменник
резисторы 2.2ком, 1ком, 10к
Вариант 2. Корректор тахометра и спидометра.
A0 pin ардуино - вход от потенциометра регулятора спидометра.
2pin ардуино - вход - сигнал тахометра от ЭБУ двигателя
3pin ардуино - вход - сигнал от датчика скорости
4pin ардуино - выход - на спидометр в приборку, соединять только через транзистор как по схеме выше.
7pin ардуино - выход - на тахометр в приборку, соединять только через транзистор как по схеме выше.
скетч:
//ТАХОМЕТР
volatile unsigned long micros_th1 = 0;
volatile boolean sttaho = false; //триггер тахометра
volatile byte sztaho = 0; //счетчик обнуления
volatile unsigned int sptaho = 0; //кол-во оборотов
//КОРРЕКЦИЯ ТАХОМЕТРА
volatile unsigned int InputTaho = 0;
volatile unsigned int OutputTaho = 0;
double popravkaTaho = 1.5; //ДЛЯ двигателя 4ц приборка от 6ц - коэффициент 1.5
//СПИДОМЕТР
volatile unsigned long micros_sp = 0;
volatile byte sz = 0; //счетчик обнуления
volatile unsigned int sp = 0; //скорость
volatile boolean st = false; //триггер
//КОРРЕКЦИЯ СПИДОМЕТРА
volatile unsigned int InputSpeed = 0;
volatile unsigned int OutputSpeed = 0;
double popravka = 0;
//ВРЕМЯ РАБОТЫ ОСНОВНОЙ ПРОГРАММЫ (каждые 50 миллисекунд - указано в loop)
unsigned long timing;
//ГЕНЕРАТОР ИМПУЛЬСОВ СПИДОМЕТРА
unsigned long timing2;
unsigned long Period;
unsigned long Skvajnost;
bool Status=0;
//ГЕНЕРАТОР ИМПУЛЬСОВ ТАХОМЕТРА
unsigned long timing3;
unsigned long PeriodTaho;
unsigned long SkvajnostTaho;
bool StatusTaho=0;
//ПИНЫ
int OUTSPEEDPIN=4; //ПИН ВЫХОДА - НА СПИДОМЕТР
int OUTTAHOPIN=7; //ПИН ВЫХОДА - НА ТАХОМЕТР
#define PIN_POT A0 //ПИН СИГНАЛА ОТ ПОТЕНЦИОМЕТРА ПОПРАВКИ
//********************************************************************
void setup(){
Serial.begin(115200); //инициализация ком порта
attachInterrupt(1, speedometr, RISING); //прерывание спидометра по фронту импульса
attachInterrupt(0, tahometr, RISING); //прерывание тахометр по фронту импульса
pinMode(PIN_POT, INPUT);
pinMode(OUTSPEEDPIN, OUTPUT);
pinMode(OUTTAHOPIN, OUTPUT);
}
//********************************************************************
void loop()
{
if (millis() - timing > 50)
{
timing = millis();
//Считаем спидометр:
if (sz != 0)
{
sz--;
}
else
{
sp = 0;
}
InputSpeed=sp;
popravka=map(analogRead(PIN_POT),0,1023,0,200)*0.01; //Коэффициент умножения входящего сигнала от 0.00 до 2.00.
OutputSpeed=InputSpeed*popravka; //Вычисление правильной скорости
Period=600000/OutputSpeed; //Вычисление периода импульса
//Считаем тахометр
if (sztaho != 0)
{
sztaho--;
}
else
{
sptaho = 0;
}
InputTaho=sptaho;
OutputTaho=InputTaho*popravkaTaho; //Вычисление правильной скорости
PeriodTaho=600000/OutputTaho; //Вычисление периода импульса
}
//Генерируем импульсы для СПИДОМЕТРА
Skvajnost= Period/2 ; //такая скважность называется меандр
if (Status==0) {
if ( (micros()-timing2)>= Skvajnost) {
timing2 = micros();
digitalWrite(OUTSPEEDPIN, HIGH);
Status=1;
}
}
if (Status==1) {
if ( (micros()-timing2)>= (Period-Skvajnost) ){
timing2 = micros();
digitalWrite(OUTSPEEDPIN, LOW);
Status=0;
}
}
//Генерируем импульсы для ТАХОМЕТРА
SkvajnostTaho=PeriodTaho/2 ;
if (StatusTaho==0) {
if ( (micros()-timing3)>= SkvajnostTaho) {
timing3 = micros();
digitalWrite(OUTTAHOPIN, HIGH);
StatusTaho=1;
}
}
if (StatusTaho==1) {
if ( (micros()-timing3)>= (PeriodTaho-SkvajnostTaho) ){
timing3 = micros();
digitalWrite(OUTTAHOPIN, LOW);
StatusTaho=0;
}
}
}
//********************************************************************
void speedometr(){ //измеряем частоту на входе спидометра по прерыванию
if(!st){micros_sp = micros();}
else {sp = (600000/(micros() - micros_sp));}
st = !st;
sz = 30;
}
void tahometr(){ //измеряем частоту на входе тахометра по прерыванию
if(!sttaho){micros_th1 = micros();}
else {sptaho = (600000/(micros() - micros_th1));}
sttaho = !sttaho;
sztaho = 30;
}
ет
Ссылка на источник: https://fanclub-vw-bus.ru/forum/viewtopic.php?t=25745
ОтветитьУдалить