Страница 1 из 2
Электронный Спидометр
Добавлено: 20 сен 2019, 20:21
Serjik
В поиске не нашел подсказки на свои вопросы. Нужен электронный спидометр на авто, в авто нет чего либо похожего на ЭБУ. Датчик считает 14 импульсов на метр (был установлен электронный). По идее я использую скоростной счетчик. [spoiler]
Безымянный.jpg
[/spoiler]
В счетчике назначаю пин (2), использую функцию подсчета импульсов, ставлю разрешение на сброс, ставлю компаратор. При достижении одного километра (14000имп) на компараторе появляется высокий уровень и происходит сброс счетчика. Километр в час мы скорость обозначили! А дальше затык. Не могу сообразить как считать эти километры в час (Km/h) с выводом на дисплей.

По идее нужен еще один скоростной счетчик который будет считать эти километры в час, но это же чепуха выходит! Может у кого есть мысли?
1.flp
Но если сделать как напрашивается, второй счетчик то я боюсь предположить какие тормоза будут в купе с дисплеем.

Не пробовал скетч гонять в реале, но предположу что это решение будет ошибкой. Скорее всего есть более сложное, но менее затратное по ресурсам.
3.flp
Электронный Спидометр
Добавлено: 20 сен 2019, 21:34
pan
Serjik писал(а): 20 сен 2019, 20:21
При достижении одного километра (14000имп)
так вам спидометр нужен или одометр?
если спидометр то так:
14000 имп - это километр.
1 час - 3600 сек.
14000 / 3600 = 3.88888888 количество импульсов каждую секунду при скорости 1 км/ч (не очень удачное количество импульсов, ну да ладно)
каждую секунду смотрим сколько импульсов насчитали и делим на 3.88888888....
т.е если за секунду пришло 388.8888 импульсов, значит мчим 100 км/ч
не забываем каждую секунду сбрасывать счетчик.
Serjik писал(а): 20 сен 2019, 20:21
При достижении одного километра (14000имп) на компараторе появляется высокий уровень и происходит сброс счетчика.
это будет оооочень медленный спидометр

Электронный Спидометр
Добавлено: 20 сен 2019, 21:56
Serjik
[ref=#ff8000]pan[/ref], Далее, скорость движения (при датчике на 14000 импульсов на км) вычисляется по формуле:
F = 0,14/Т
где Т - период в секундах, a F - скорость в км/час. Поскольку период измерен в микросекундах фактически формула:
F= 1400000/Т
Правильно?
Нашел статью где предлагается такой вариант:
где:-
int Htime1; // длительность положительного полупериода датчика скорости
int Ltime1; // длительность отрицательного полупериуда датчика скорости
float Ttime1; // период датчика скорости
float Frequency1; //скорость движения
Сам замер:-
Htime1=pulseIn(8, HIGH); // измерение положительного полупериода датчика скорости
Ltime1=pulseIn(8, LOW; // измерение отрицательного полупериода датчика скорости
Ttime1=Htime1+Ltime1; //вычисление периода датчика скорости
Frequency1=600000/Ttime1; // вычисление скорости движения
Набросал блок, проверте где ошибки? Чувствую где то начудил в блоке.
SPEED1.ubi
Электронный Спидометр
Добавлено: 20 сен 2019, 22:00
pan
упрощенный расчет я примерно показал как сделать.
но если Вам нужна очень высокая точность измерения скорости, то тогда да, измерять длительность импульсов.
только зачем в авто измерять сотые доли км/ч ?
Электронный Спидометр
Добавлено: 20 сен 2019, 22:08
Serjik
[ref=#ff8000]pan[/ref], вот со входом отдельно, но что то не могу вспомнить как выход прописывать. Посмотрите правильность.
SPEED2.ubi
Отправлено спустя 2 минуты 43 секунды:
pan писал(а): 20 сен 2019, 22:00
только зачем в авто измерять сотые доли км/ч ?
Так там же выход float! Если пропишу как int будет ошибка в выводе данных. Или я что то не понял?
Ну как выход можно потом конвертировать данные на выходе с блока в int. Монструозно, но на первый раз для криворучки сойдет.

Электронный Спидометр
Добавлено: 20 сен 2019, 22:09
pan
Serjik писал(а): 20 сен 2019, 22:08
Так там же выход float
а это при чём.
я про метод подсчета скорости, а не про тип "входов"
Электронный Спидометр
Добавлено: 20 сен 2019, 22:17
Serjik
pan писал(а): 20 сен 2019, 22:09
я про метод подсчета скорости, а не про тип "входов"
Тоесть я могу параметр Frequency1 объявить как int?
Отправлено спустя 1 минуту 54 секунды:
[ref=#ff8000]pan[/ref], А что не так с методом?
Htime1=pulseIn(8, HIGH); // измерение положительного полупериода датчика скорости
Ltime1=pulseIn(8, LOW; // измерение отрицательного полупериода датчика скорости
Ttime1=Htime1+Ltime1; //вычисление периода датчика скорости
Frequency1=600000/Ttime1; // вычисление скорости движения
Электронный Спидометр
Добавлено: 20 сен 2019, 22:26
pan
Serjik писал(а): 20 сен 2019, 22:17
А что не так с методом?
я не говорил, что с ним что-то не так.
просто не люблю усложнять там где не надо.
всё...
ну или я чего-то не понимаю
Электронный Спидометр
Добавлено: 20 сен 2019, 22:36
dizzyy
pan писал(а): 20 сен 2019, 22:00
но если Вам нужна очень высокая точность измерения скорости, то тогда да, измерять длительность импульсов.
я думаю тут меряется длительность импульса форсунки ..
как бы 2 в 1 .. и одометр и расход
Электронный Спидометр
Добавлено: 20 сен 2019, 22:39
pan
[ref]dizzyy[/ref], я не гадалка. так написано
Serjik писал(а): 20 сен 2019, 20:21
Нужен электронный спидометр на авто
Serjik писал(а): 20 сен 2019, 20:21
Датчик считает 14 импульсов на метр
на форсунку не похоже вроде, не?
Отправлено спустя 1 минуту 34 секунды:
dizzyy писал(а): 20 сен 2019, 22:36
как бы 2 в 1 .. и одометр и расход
который будет зависеть от того, на какой передаче едешь?
или точнее НЕ зависеть
Электронный Спидометр
Добавлено: 20 сен 2019, 22:40
dizzyy
pan писал(а): 20 сен 2019, 22:38
на форсунку не похоже вроде, не?
я про
Код: Выделить всё
Htime1=pulseIn(8, HIGH); // измерение положительного полупериода датчика скорости
Ltime1=pulseIn(8, LOW; // измерение отрицательного полупериода датчика скорости
Ttime1=Htime1+Ltime1; //вычисление периода датчика скорости
Frequency1=600000/Ttime1; // вычисление скорости движения
Электронный Спидометр
Добавлено: 20 сен 2019, 22:41
Serjik
[ref=#ff8000]pan[/ref], Я попробовал так, но в вашем случае идет измерение за интервал в одну секунду. Если нагрузить еще кодом под завязку, то таймер почему то сбивается и идет измерение за любое время, но не секунду. Я хотел просто считать импульсы, дробить из расчета 14000имп/км и выводить их в виде цифер км/ч.
Отправлено спустя 1 минуту 5 секунд:
[ref]dizzyy[/ref], Нет там форсунок. Карбюратор.
Ну я догадывался что тут решение не детское нужно. Нужно думать.
Электронный Спидометр
Добавлено: 20 сен 2019, 22:43
pan
dizzyy писал(а): 20 сен 2019, 22:40я про
понятия не имею откуда этот код и что он делает.
даже вникать не буду
Отправлено спустя 58 секунд:
Serjik писал(а): 20 сен 2019, 22:41
Если нагрузить еще кодом под завязку, то таймер почему то сбивается
в настройках счетчика поставьте галку "аппаратный таймер"
Электронный Спидометр
Добавлено: 20 сен 2019, 22:47
Serjik
pan писал(а): 20 сен 2019, 22:43
в настройках счетчика поставьте галку "аппаратный таймер"
Аппаратный таймер обеспечивает более высокую точность счета, но накладывает некоторые ограничения. Во первых применение аппаратного таймера исключает возможность использования 3 и 11 цифровых выходов в режиме ШИМ. Во вторых все скоростные счетчики в проекте использующие аппаратный таймер будут иметь одинаковое время счета.
Вот этого мне ну ни как нельзя.
Электронный Спидометр
Добавлено: 20 сен 2019, 22:50
pan
Serjik писал(а): 20 сен 2019, 22:47
Вот этого мне ну ни как нельзя.
так мы об этом только узнали
Электронный Спидометр
Добавлено: 20 сен 2019, 22:59
Serjik
[ref=#ff8000]pan[/ref], Прошу прощения. У меня еще там два скоростных счетчика которые работают по разному. Один на 2секунды, второй на 5 секунд.
Отправлено спустя 5 минут 52 секунды:
if (1) {_dispTempLength1 = (((String((1400000UL)/((_SCT_1_PDON)+(_SCT_1_NDON)), DEC)))).length();
if (_disp1oldLength > _dispTempLength1) {_isNeedClearDisp1 = 1;}
_disp1oldLength = _dispTempLength1;
_lcd1.setCursor(int((16 - _dispTempLength1)/2), 0);
_lcd1.print(((String((1400000UL)/((_SCT_1_PDON)+(_SCT_1_NDON)), DEC))));
} else {
if (_disp1oldLength > 0) {_isNeedClearDisp1 = 1; _disp1oldLength = 0;}
}
По сути то же самое действие что и у этого скетча? :
int Htime1; // длительность положительного полупериода датчика скорости
int Ltime1; // длительность отрицательного полупериуда датчика скорости
float Ttime1; // период датчика скорости
float Frequency1; //скорость движения
Сам замер:-
Htime1=pulseIn(8, HIGH); // измерение положительного полупериода датчика скорости
Ltime1=pulseIn(8, LOW; // измерение отрицательного полупериода датчика скорости
Ttime1=Htime1+Ltime1; //вычисление периода датчика скорости
Frequency1=1400000/Ttime1; // вычисление скорости движения
Электронный Спидометр
Добавлено: 21 сен 2019, 08:14
Sancho
Электронный Спидометр
Добавлено: 21 сен 2019, 15:33
Serjik
[ref=#ff8000]Sancho[/ref], почти, но не то.
Измерение скорости вращения путём измерения интервала между импульсами ( один импульс на оборот).
счет идет не правильный.
Не пойму, почему такие тормоза в работе? Первые 30км/ч вроде нормально, а дальше идет разброс почти в 20-40км/ч по сравнению с реальной.

Частота вроде не превышает и 10кгц. Может идет переполнение? Может стоит сделать принудительное обнуление счетчика через скажем 1 секунду?
Что типа так?:
[spoiler]
Безымянный1.jpg
[/spoiler]
Электронный Спидометр
Добавлено: 21 сен 2019, 18:53
Sancho
[ref]Serjik[/ref], А так?
скорость в 100м/ч, т.е. 657=65,7км/ч
Отправлено спустя 50 секунд:
Мож где ошибся - суббоТНИЦА...
Электронный Спидометр
Добавлено: 22 сен 2019, 05:13
DmitriyL
спидометр.JPG
Вот рабочая схема спидометра. Скоростной счетчик рассчитан на подсчет количества импульсов за 1 секунду. Через меню вводится коэффициент спидометра, представляющий собой количество импульсов с датчика скорости на один километр. Если желаете точнее спидометр, то сделайте подсчет импульсов не за секунду, а за больший интервал, уменьшив константу 3600 во столько же. Скорость будет точнее, но определение ее будет с заметным запаздыванием.
PS Неправильное применение форматов чисел действительно приводят к некорректной работе схемы, потому последовательность умножений и делений исключительно такая, как приведена на рисунке.