Корректор электронного (стрелочного) спидометра на ARDUINO
- Артур
- Друг клуба
- Сообщения: 1580
- Зарегистрирован: 12 ноя 2009, 22:38
- Бус: T3 2.8 VR6
- Откуда: Ессентуки
Корректор электронного (стрелочного) спидометра на ARDUINO
Нет, залил - поехал. Внимание: код я не проверял на работоспособность. Напиши пожалуйста, если старый код у тебя работает, а новый не будет, исправлю.
8(928)376-99-75
Корректор электронного (стрелочного) спидометра на ARDUINO
К сожелению не заработал. но это видимо из за того что датчик абс у меня двухпроводной. На столе от генератора импульсов жизнь была. Есть ли возможность изменить код под двухпроводной датчик? Датчик бош на 128 ом сопротивлением. Одной ногой на минусе...
Корректор электронного (стрелочного) спидометра на ARDUINO
//ТАХОМЕТР
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;
}
Вот этот работает. правда стрелка порой скачет . но это на столе. в машине не пошел...
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;
}
Вот этот работает. правда стрелка порой скачет . но это на столе. в машине не пошел...
- Артур
- Друг клуба
- Сообщения: 1580
- Зарегистрирован: 12 ноя 2009, 22:38
- Бус: T3 2.8 VR6
- Откуда: Ессентуки
Корректор электронного (стрелочного) спидометра на ARDUINO
В коде нечего менять.
Датчик надо правильно подключать.
Видимо нет резистором подтяжки на 5 вольт
Датчик надо правильно подключать.
Видимо нет резистором подтяжки на 5 вольт
8(928)376-99-75
Корректор электронного (стрелочного) спидометра на ARDUINO
Видимо все же дело в датчике, он у меня аналоговый. Переводить из аналога в цифру то ещё занятие...
Корректор электронного (стрелочного) спидометра на ARDUINO
Как настроить последний код? У меня спидометр и тахометр, и тот и другой врут, Тахо занижает а спидо наоборот завышает
Корректор электронного (стрелочного) спидометра на ARDUINO
Как откатать для точного показометра?
- Артур
- Друг клуба
- Сообщения: 1580
- Зарегистрирован: 12 ноя 2009, 22:38
- Бус: T3 2.8 VR6
- Откуда: Ессентуки
Корректор электронного (стрелочного) спидометра на ARDUINO
последний код я не доделал, он не имеет калибровок спидометра по шагам, только один общий коэффициент на весь диапазон от нуля до бесконечности.
Арифметически, разгоняешся до 100км/ч по GPS, смотришь что показывает твой стрелочный спидометр, к примеру он у тебя показывает 86км/ч.
Сто делишь на восемьдесят шесть, будет равно 1,16. Вот твой коэффициент. Если показывает больше ста, пусть 140, всё тоже самое
100 : 140=0,714.
Вносишь 0,714 в код программы, заливаешь в ардуино. PROFIT.
Для тахометра либо методом на глаз, либо если ты знаешь, сколько твой датчик тахометра выдаёт импульсов на оборот, прямо в арудинке можешь выводить в монитор порта количество импульсов с датчика тахометра (или с ЭБУ), далее смотришь на экране компьютера , сколько импульсов даёт, сопоставляешь со своим стрелочным. Арифметически находишь коэффициент, записываешь в скетч, прошиваешь. PROFIT.
Арифметически, разгоняешся до 100км/ч по GPS, смотришь что показывает твой стрелочный спидометр, к примеру он у тебя показывает 86км/ч.
Сто делишь на восемьдесят шесть, будет равно 1,16. Вот твой коэффициент. Если показывает больше ста, пусть 140, всё тоже самое
100 : 140=0,714.
Вносишь 0,714 в код программы, заливаешь в ардуино. PROFIT.
Для тахометра либо методом на глаз, либо если ты знаешь, сколько твой датчик тахометра выдаёт импульсов на оборот, прямо в арудинке можешь выводить в монитор порта количество импульсов с датчика тахометра (или с ЭБУ), далее смотришь на экране компьютера , сколько импульсов даёт, сопоставляешь со своим стрелочным. Арифметически находишь коэффициент, записываешь в скетч, прошиваешь. PROFIT.
8(928)376-99-75
Корректор электронного (стрелочного) спидометра на ARDUINO
Грустно, у меня спедо нелинейная шкала, до 60км терпимо, разбег около 4кмч, а вот выше разбег почти в 20км на 140кмч