#1 2015-08-03 20:58:53

maksik
Учасник
Зареєстрований: 2015-02-12
Повідомлень: 5

Считывание скорости автомобиля с датчика скорости.

Штатный датчик скорости авто выдает импульсы амплитудой до 12 В.
1 км/ч . соотваетствует частоте 1,66 Гц. на датчике.
60 км/ч   = 100 Гц.
100км/ч  =  166 Гц.
Датчик подключен на аналоговый, вход arduino pro mini , через делитель напряжения задача состоит в том чтобы считать текущею скорость автомобиля и его пробег.

Функция для определения скорости ниже.

int checkSpeed(){
    unsigned long time1 =millis();  // определяем время начала выполнения функции  если > 1000 возвращаем 0
    unsigned long pulseStart;        // начало первого импульса
    int pulse=0;                           // длинна импульса в мс.
    int schet=0;                          // 0 - начало первого импульса , 1  - конец первого , 2 начало второго (время между 0 и 2 -- частота )
    while (millis()-time1<300){       //цыкл выполняется если с момента начала выполнения прошло меньше 300 мс.
      if (analogRead(SPEEDPIN)>600 && schet==2){
          pulse = millis()- pulseStart;
          return 1000/pulse/1.66;
      }
      else if (analogRead(SPEEDPIN)>600 && schet==0){
          pulseStart=millis();
          schet =1;
      }
      else if(analogRead(SPEEDPIN)<600 && schet==1){
          schet =2;
      }      
    }
    return 1000/pulse/1.66;

константа SPEEDPIN определена раньше (пин который подключен к датчику скорости).


Будет ли работать эта функция (протестировать на автомобиле пока нету возможности ), и как реализовать подсчет пробега?

Спасибо.

Остання редакція maksik (2015-08-03 21:07:13)

Неактивний

#2 2015-08-04 19:41:13

freeman
Учасник
З  Киев
Зареєстрований: 2014-09-16
Повідомлень: 82

Re: Считывание скорости автомобиля с датчика скорости.

А бы советовал использовать оптопару вместо делителя, сам столкнулся недавно с логикой 12В.
Оптопара например sharp pc817

Неактивний

#3 2015-08-05 21:53:38

Максим
Гість

Re: Считывание скорости автомобиля с датчика скорости.

freeman пише:

А бы советовал использовать оптопару вместо делителя, сам столкнулся недавно с логикой 12В.
Оптопара например sharp pc817

Спасибо , так и сделаю ,даже можно использовать цыфровой пин а не аналоговый, позже в исправленном варианте выложу в свободный доступ чертежи плат и схему устройства, но 1 образец сделал на делителе , так что буду делать с ним .
На выходных ставил на машину испытывал, паказывает чесно сказать ерунду , показания вроде как зависят от скорости , но на скорости допустим примерно 20 км.ч. показывает значения от 0 до 24 и периодически (раз в несколько секунд) даже за 100км.ч. наверное ошибка в программе, когда автомобиль не двигается показывает стабильно 0.

#4 2015-08-11 23:20:56

brigadir
Учасник
Зареєстрований: 2015-03-04
Повідомлень: 17

Re: Считывание скорости автомобиля с датчика скорости.

Максим, давайте напишемо вашу функцію по іншому smile
Будемо читати датчик на кожному проході loop().
Оскільки у вас імпульс аналоговий, будемо ловити його вершину.
Будемо дивитися, скільки часу пройшло між двома імпульсами.
По цьому часу будемо рахувати "миттєву" швидкість.

void loop()
{
	int impulseValue = analogRead(IMPULSE_PIN);
	static int prevImpulseValue = impulseValue;
	bool impulseRaises = (impulseValue > prevImpulseValue);
	static bool prevImpulseRaises = impulseRaises;
	static long prevImpulseTime = millis();
	if (prevImpulseRaises && !impulseRaises)		// зловили вершину імпульсу
	{
		long impulseTime = millis();
		long impulseDuration = impulseTime - prevImpulseTime;		// impulseDuration в мілісекундах
		long speed = 602 / impulseDuration;							// 602 = 1000 / 1.66
		Serial.print("speed: "); Serial.println(speed);
		prevImpulseTime = impulseTime;
	}
	prevImpulseValue = impulseValue;
	prevImpulseRaises = impulseRaises;
}

Декілька ремарок:
static змінні ініціалізуємо поточними значеннями.
Обчислення ведемо в цілочисельному форматі, оскільки операції з float дорого коштують. speed можна було б писати в метрах/годину для більшої точності, для цього замість 602 впишемо 602000.
Можливо, значення з датчика шумлять, тоді прийдеться згладжувати сигнал. Або реалізувати інший варіант: замість вершини ловимо момент, коли сигнал проходить коридор, наприклад 200-800.
Я код не перевіряв. Якщо буде глючити, варто писати лог (Serial.print) починаючи зі значень сигналу і поступово доходячи до значень швидкості.

Неактивний

Швидке повідомлення

Введіть повідомлення і натисніть Надіслати

Підвал форуму