-
Вложений: 1
Преобразовать частоты для спидометра
Подскажите пожалуйста, как сделать на Carduino преобразователь частоты импульсов датчика скорости спидометра, датчик выдаёт 10 импульсов за оборот, а нужно чтобы было 8, одонометр работает по подсчёту количества импульсов, а спидометр по частоте. Нужен соответственно преобразователь частоты. Я так понимаю что на Carduino это не проблема сделать но в программировании и микроконтроллерах не силён, подскажите как написать программу под эту задачу.
вот таблица значений, первая частота что должно быть на выходе, вторая что есть на входе.
-
Re: Преобразовать частоты для спидометра
Если упрощенно сделать то Ардуино дожен принимать и подменивать импульсы, при подмене импульсов пропускать каждый пятый импульс. Одометр точно будет без погрешности работать , а вот спидометр незнаю, нужно пробовать
-
Re: Преобразовать частоты для спидометра
Если просто пропускать импульсы то стрелка спидометра начинает дёргаться, нужно именно преобразовать частоту, меняя время каждого импульса или промежутки между импульсами
-
Re: Преобразовать частоты для спидометра
Тогда можно так, принимаем импульс и считаем его длительность, полученную длительность умножаем на коэффициент 1,25 и выдаем импульс с новой длительностью
-
Re: Преобразовать частоты для спидометра
Цитата:
Сообщение от
Chip
Тогда можно так, принимаем импульс и считаем его длительность, полученную длительность умножаем на коэффициент 1,25 и выдаем импульс с новой длительностью
врятли так получится, будет наложение импульсов,
-
Re: Преобразовать частоты для спидометра
Какое наложение если мы рвем цепь датчика, с коробки пускам на вход ардуино , а с выхода ардуино на спидометр.
-
Re: Преобразовать частоты для спидометра
про цепь понятно, я про то что будет постоянный сдвиг на 1.25, таймеры будут неодновременно запускаться и останавливаться, и через несколько импульсов произойдет перескок, один таймер обгонит другой, впринципе ничего страшного не произойдет, просто второй таймер будет отсчитывать два раза одно и тоже время, а показания первого таймеры потеряются. :)
-
Re: Преобразовать частоты для спидометра
На самом деле есть несколько вариантов подсчета времени, выкладываю один из них. Данным способом можно подсчитывать и в тоже время выполнять любые операции.
PHP код:
unsigned long math_time,old_time,real_time;
void setup()
{
Serial.begin(115200);
}
void loop()
{
delay(500);
real_time = micros();
math_time = real_time - old_time;
old_time = real_time;
Serial.println(math_time);
}
-
Re: Преобразовать частоты для спидометра
Вот пример того как подобное реализованно на другом микроконтроллере:
Цитата:
Собственно 12F675. На лапу внешнего прерывания заводим сигнал с вазовского датчика и таймером считаем сколько тиков длится импульс и общий период. Пишем в переменную. Это было в прерывании. В основном цикле умножаем на нужный коэффициент и програмным таймером выводим на другую лапу то, что нужно. И скважность и период получаются пропорциональны. Если взять другой пик с CCP, то программа еще проще станет. Насчет общей погрешности не тестировал, т.к. пока все происходит "на столе".
Можно сделать это на Carduino ?
-
Re: Преобразовать частоты для спидометра
-
Re: Преобразовать частоты для спидометра
Как вариант брать частоту за секунду, то есть считать количество импульсов за секунду, делить на 1.25 и выдавать опять же частотой за секунду.
Но как написать программу я не знаю, помогите пожалуйста.
-
Re: Преобразовать частоты для спидометра
в код вижне могу написать прогу, но не в ардунио,
-
Re: Преобразовать частоты для спидометра
Как то так :
PHP код:
int taho_out = 13;
unsigned long math_time,old_time,real_time;
int taho_time;
void setup()
{
pinMode(taho_out, OUTPUT); // порт как выход
attachInterrupt(0, taho, CHANGE); // привязываем 0-е прерывание к функции taho().
}
void loop()
{
if (taho_time > 1 && taho_time < 100) //мин макс
{
digitalWrite(taho_out, HIGH);
delay(taho_time);
digitalWrite(taho_out, LOW);
delay(taho_time);
}
}
void taho()
{
real_time = millis(); //получить реальное время
math_time = real_time - old_time; //считаем длительность принятого импульса
old_time = real_time; //сохранить реальное время
taho_time = trunc(math_time * 1.25); //расчитать новое время длительности импульса
}
-
Re: Преобразовать частоты для спидометра
чегото я не понимаю, раз 13 прописан как выход то откуда берутся входные данные ? тобишь кто меряет начальный импульс и откуда он берётся ?
А что за прерывание и что оно делает ?
-
Re: Преобразовать частоты для спидометра
ВХод D2, выход D13, их желательно разязать оптопарами или согласовать уровни и токи.
В прерывании есть коменты.
-
Re: Преобразовать частоты для спидометра
всеравно не понимаю - где в программе описывается вход d2 ?
вроде начинаю немного понимать, цифровой вход d2 нигде не описывается потому что он встроен в функцию прерывания 0 и функция прерывания 0 его сама задействует.
Прошу прощения, просто ничего в программировании не понимаю и пытаюсь разобраться.
-
Re: Преобразовать частоты для спидометра
Все верно, прерывание 0 привязано к D2
-
Re: Преобразовать частоты для спидометра
-
Re: Преобразовать частоты для спидометра
Не получилось, контроллер считает что то не то, похоже просто возбуждается, светодиод на 13 выводе мигает хаотично с разной яркостью. Подскажите пожалуйста в чём может быть дело ?
-
Re: Преобразовать частоты для спидометра
а как импульсы подаешь на вход? Схему покажи
-
Re: Преобразовать частоты для спидометра
Также как и вот тут нарисовано http://www.compcar.ru/forum/attachme...7&d=1259307513
На ногу D2 через резисторы подстрочником до 10ком на землю и подстрочником до 20ком на сам сигнал, на самом сигнале с датчика скорости есть ещё диод, он развязывал его с панелью приборов, она нехорошо влияла на дополнительное оборудование, но врятли он как то влияет на процесс, датчик скорости стандартный вазовский, 10 импульсов за оборот.
Схема возбуждается и без подключения датчика, буквально от прикосновения пальцем к выводу d2
-
Re: Преобразовать частоты для спидометра
Не нравится мне твоя схема подключения :)
Проверь что на входе контроллера
Я бы на логический сигнал не ставил делитель.
Поставь диод как на схеме, включи внутреннюю подтяжку и выбери условие срабатывания прерывания
-
Re: Преобразовать частоты для спидометра
Спасибо за совет, диод там уже стоит также как и на схеме, без резистроров пробовал, также возбуждается, а вот с программированием у меня плохо, подскажитите пожалуйста как включить подтяжку и выбрать условное срабатывание?
-
Re: Преобразовать частоты для спидометра
есть 4 вида прерывания:
LOW срабатывает когда на входе низкий уровень
CHANGE срабатывает при любом изменении логического уровня на входе
RISING срабатывает при изменении логического уровня с низкого (LOW) на высокий(HIGH)
FALLING срабатывает при изменении логического уровня с высокого (HIGH) на низкий (LOW)
-
Re: Преобразовать частоты для спидометра
То есть в этой строчке
attachInterrupt(0, taho, CHANGE); // привязываем 0-е прерывание к функции taho().
надо поменять CHANGE на RISING или FALLING и посмотреть как себя поведёт, правильно? А как задействовать подтягивающий резистор в прерывании?
И ещё подскажите плиз, нога VIN и рядом GND по идее питание контроллера через встроенный стабилизатор в том числе и от бортовой сети автомобиля, но у меня контроллер не работает при таком подключении, только когда питается от USB порта ноутбука, что с ним не так, это не выводы для подачи питания ?
-
Re: Преобразовать частоты для спидометра
Проверь свой стабилизатор http://www.compcar.ru/forum/showthread.php?t=5762
digitalWrite(2, HIGH); // подключить подтягивающий резистор
-
Re: Преобразовать частоты для спидометра
Стабилизатор действительно на 9 вольт распаян и через него не контроллер не работает.
Попробовал разные виды прерываний но результат практически тот же - не работает, самовозбуждение пропало, но результат тот же - при низкой скорости появляются лишние импульсы, светодиод на них реагирует яркими вспышками а стрелка спидометра хаотично прыгает, с увеличением скорости такие импульсы исчезают, стрелка стабилизируется но показывает очень низкую скорость совсем не пропорционально настоящей, а на её изменение реагирует но также очень слабо. Что ещё может быть не так ? Сама вычислительная часть правильно написана ?