Свежие обсуждения
Микроконтроллеры

Спидометр на AVR

1 4

Добрый день всем.
Загорелся желанием сделать спидометр для велосипеда на какой-нить AVR, 2313, например. Почему такую устаревшую выбрал- потому что уже немного её поюзал. Впрочем, непринципиально.
Обороты колеса определяет геркон на вилке+магнит на спице. Таймер/счётчик0 работает в режиме таймера без деления частоты, т.е. 4МГц. Теперь надо следить за переполнением таймера. Это ясно как. В одну секунду Т/С0 переполняется 15625 раз. А если ехать медленно (1 м/с), то (с моим диаметром колеса) Т/С0 переполнится 62500 раз за оборот колеса. Дальше проще: число $FF00-это 65280 переполнений (скорость чуть меньше 1 м/с). Значит, количество переполнений пишем в 2 байта, и проверяем старший на равенство его $FF. Если равно, то делаем вывод: слишком медленно. Это что касаемо подсчёта времени оборота.
Опрашивать геркон (я тут прикинул по максимальной скорости) нужно раз в 80-100 мс. До сих пор мне всё понятно и легко. Что делать дальше - не представляю.
Самое сложное для меня математические расчёты. Я нашёл где-то алгоритм выделения сотен, десятков, единиц из 16-разрядного представления числа переполнений Т/С0(в моём случае). Но он предназначен для частотомера, т.е. с точностью до наоборот. Вам он наверняка известен: из числа вычитаем 100, проверяем - не стало ли оно отрицательным, опять вычитаем. Как только отрицательное, так прибавляем 100, начинаем отнимать 10, опять проверка флага Z и т.д.
Как поступить в случае спидометра - не представляю. Я, конечно мало что пока понимаю в МК, но надеюсь с вашей помощью и советами станет меньше белых пятен.
Может кто уже думал над этим, или в сети встречал какой-нить ликбез на эту тему, - если не жалко, поделитесь. А может сначала стоит поюзать какие-нить проекты попроще, чтобы "набить руку". Просто обидно: лето заканчивается, а я без спидометра.

 

для начала можно почитать здесь:
http://pro-radio.ru/urbanism/4241/

 

Да, прочитал, спасибо. Есть там парочку моментов, которые щас распечатаю, а дома переварю. Но ведь в основном люди говорят о реализации "замыкателя", счётчика оборотов. Меня больше интересовало не столько hard, сколько soft. Всё равно спасибо.

 

Простейший способ - заводите в программе таблицу (массив) пар "время оборота"-"скорость". Ищете место, где T[i] <= измеренное_время <= T[i+1]. Берете V[i]. Далее c V[i] поступаете как с частотомером. Табличка будет небольшая, полагаю, более 100 км/ч на велосипеде гонять не собираетесь

 

Не помню как в 2313, но в Tiny2313 точно есть модуль захвата. Запускаем таймер1, включаем модуль захвата, разрешаем прерывание от него, цепляем геркон на ножку захвата(ICP) - и получаем прерывание, допустим, при спаде сигнала. Модуль захвата к этому времени уже захватил значение таймера на момент спада в специальный регистр. Нам осталось только вычесть из него предыдущее значение, чтобы получить период вращения колеса в тиках таймера.

типа такого:


SIGNAL(SIG_INPUT_CAPTURE1)
{
static unsigned int prev_ticks = 0; // предыдущее значение
unsigned int ticks = ICR1; // захваченное значение таймера1
unsigned int period = ticks - prev_ticks; // период
prev_ticks = ticks; // запомним для следующего раза
}

Ну а вычисление скорости из периода оборота колеса и его радиуса - это школьная математика.

 

Школьная математика...
Я не знаю как на ассемблере делить

 

А что для AVRов, ATMEL не сделал апноутов по математическим процедурам?
Для PICов например есть матем. библиотека для работы с целыми числами AN617(посмотрите pdf там есть алгоритмы может поможет), умножение/деление/суммирование/вычитание в плоть до 32битных чисел. Также есть библиотеки для чисел с плав. точкой и всякие SIN, COS и т.д.

 

AHTOXA: Не помню как в 2313, но в Tiny2313 точно есть модуль захвата. Запускаем таймер1, включаем модуль захвата, разрешаем прерывание от него, цепляем геркон на ножку захвата(ICP) - и получаем прерывание, допустим, при спаде сигнала.

Антоха дело говорит, опрос датчика в цикле - в корне неверное решение, другое дело прерывание - и красиво и правильно.

 

Так-так, значит надо лучше читать и изучать матчасть.
Насколько я понял: Т/С1 у меня отслеживает прерывания, а Т/С0 считает время. Правильно ли я понимаю??

 

TPAH3uCTOP: Загорелся желанием сделать спидометр для велосипеда на какой-нить AVR,
Как раз сейчас , для развлечения делаю на TINY26L
Правда, на Алгоритм Билдер.
Алгоритм такой: После включения питания (3в) - глубокий сон (паузр даун) , индикатор показывает часы (встроенные в него) . При срабатывании геркона (с RC цепочкой ) -просыпаемся ,если это первое срабатывание после сна, то сбрасываем ТМР0 , нет 16-разр. делим некое число учитывающее ПИ , диаметр колеса и тп , на содержимое таймера (МБ) и регистра (СБ) .
Далее от лени , что бы не переписывать 16 деление на 24 или 32 , я умножаю остаток на десять и делю повторно.
По окончании снова засыпаю , на этот раз не глубоко (идл). Если за 32 сек не придет имп с геркона -глубокий сон, на индикаторе часы.
Результат - скорость за оборот с десятыми км/час. Кроме того считаю путь.
Пробовал как частотомером считать имп с геркона - за 7 сек - скорость без десятых-неинтересно и долго.Лучше считать спицы.
библиотеки на асм есть в http://elm-chan.org/cc_e.html
DDR: опрос датчика в цикле - в корне неверное решение, другое дело прерывание - и красиво и правильно.
А в моем случае и не возможное -проснуться можно только ИНТ0 (причем 0 , не фронтом)