Форум программистов, компьютерный форум, киберфорум
Наши страницы
Микроконтроллеры Atmega AVR
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.67/33: Рейтинг темы: голосов - 33, средняя оценка - 4.67
kot_kypotytmyk
0 / 0 / 0
Регистрация: 14.12.2013
Сообщений: 24
#1

велоспидометр на avr

22.04.2014, 12:20. Просмотров 6014. Ответов 17
Метки нет (Все метки)

Здравствуйте, прошу прощения заранее, если кто-то посчитает мой вопрос слишком глупым.
Хочу сделать велоспидометр на меге 8. В интернете много вариантов данного устройства, но ни в одном нет исходника, что бы я мог решить свой вопрос не спрашивая его тут.

Мои рассуждения. Прошу поправить где что не так.
Что бы определить скорость, нам надо считать импульсы колеса за известный промежуток времени (t). Количество импульсов * длину колеса /время (t) = скорость.
Далее. Импульсы считать мы можем таймером-счетчиком 1, он может тактироваться от внешних импульсов, приходящих на ножку PD5 (корпус tqfp)
Таймер мы настроим так TCCR1B = 0b00000111; регистр TCCR1A=0. Прерывание по переполнению разрешать не будем, т.к. это должна быть очень большая скорость, которую на велосипеде вряд ли получиться развить.
Затем. Нужно отсчитывать равные промежутки времени и сбрасывать счетный регистр (TCNT1) первого таймера-счетчика.
Для этого используем второй таймер.
Вот тут у меня начинаются первые вопросы. на какую частоту нам настроить второй таймер? Если тактовая частота процессора 8МГц (нужно ли уменьшить?) при делителе freq/1024 получится , если я понимаю правильно 8 кгц, т.е. 8 тысяч раз в секунду. Это же очень много. Даже если изменим freq до 1 МГц, то все равно будет не мало. как лучше сделать? Внутри обработчика прерывания TC2 добавить переменную, которая будет считать попадания в обработчик, и когда она дойдет до 100, допустим, только тогда сбрасывать TCNT1?
Еще у меня была идея использовать внешний часовой кварц, но его можно повесить только для первого таймера, а он уже занят счетчиком.

Пожалуйста помогите разобраться, люди добрые :)
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
22.04.2014, 12:20
Ответы с готовыми решениями:

AVR AVRISP STK500 V3.0 USB ISP Programmer for AVR IC
Люди помогите плз. не могу разобраться. приобрел этот чудный девайс (AVR...

Анализ стека AVR / AVR stack analysis
Привет! Уперся я в стек, и решил понять что почем. Нашел вот такой вот...

AVR Atmega324PU не прошивается AVR ISP Mk2
Добрый день. На плату впаян данный микроконтроллер в корпусе tqfp. При...

AVR Studio 6 и AVR Toolchain вопросы!
Всем доброго времени суток. Решил я написать софтинку в новой студии от...

AVR Studio 6 Avr simulator
Подскажите каким образом стартануть прогу в avr symulator с адреса boottooder...

17
45893569365
0 / 0 / 0
Регистрация: 06.04.2013
Сообщений: 172
22.04.2014, 12:31 #2
Ну да, делают обычно программный счетчик. Выбирают системный тик например 1Кгц или 100гц, в прерывании от таймера увеличивают переменную и засыпают. Как отсчитали нужное значение (например 1сек ) уже выполняется основной код.

Есть такая утилитка для быстрого выбора таймера, предделителя и значения предзагрузки.

[195.03 Кб]
0
YTYOUT
0 / 0 / 0
Регистрация: 02.10.2012
Сообщений: 1,946
22.04.2014, 12:36 #3
Вам надо посчитать количество импульсов таймера-счетчика 1 за секунду . Такой вот принятый интервал измерения скорости , который легко переводится в км/ч. (Так на каую частоту надо настроить второй таймер? ) А вот сколько импульсов Вы получите, зависит от расположения датчика
0
kot_kypotytmyk
0 / 0 / 0
Регистрация: 14.12.2013
Сообщений: 24
22.04.2014, 12:56 #4
Цитата Сообщение от 45893569365
Ну да, делают обычно программный счетчик. Выбирают системный тик например 1Кгц или 100гц, в прерывании от таймера увеличивают переменную и засыпают. Как отсчитали нужное значение (например 1сек ) уже выполняется основной код.

Есть такая утилитка для быстрого выбора таймера, предделителя и значения предзагрузки.
Цитата Сообщение от YTYOUT
Вам надо посчитать количество импульсов таймера-счетчика 1 за секунду . Такой вот принятый интервал измерения скорости , который легко переводится в км/ч. (Так на каую частоту надо настроить второй таймер? ) А вот сколько импульсов Вы получите, зависит от расположения датчика
Спасибо большое за ответы и за желание помочь в решении проблемы :)
Но если мы будем считать количество импульсов за секунду , то и частота обновления соответственно будет равна одной секунде. Т.е., допустим, велосипедист едет, резко тормозит, и секунду, у него ( ну +/-) он будет видеть еще предыдущую скорость. Хотелось бы, что бы скорость менялась довольно динамично, но при этом, и не слишком быстро..
С Вашей помощью, теперь алгоритм примерно такой:
Тактовая частота процессора: 8 Мгц (пока не менял)
Таймер-счетчик 2 настраиваем на частоту f/1024, для этого записываем в TCCR2 = 0b00000111; Дальше нужно разрешить прерывания.
Вот тут я запутался. Прерывание если мы разрешим по переполнению, то таймер будет увеличиваться 8000 раз в секунду, пока не дойдет до 255, затем сбросится. Но нам же нужно что бы он, ну для начала 1 раз в секунду тикал. Да, еще конечно помним про то, что в обработчике мы сначала увеличиваем переменную, потом уже считаем скорость.. Тогда, наверное лучше использовать таймер в режиме сравнения. Вопрос, только, аое число записать в счетный регистр, что бы время было удобное для расчета скорости.
0
45893569365
0 / 0 / 0
Регистрация: 06.04.2013
Сообщений: 172
22.04.2014, 13:16 #5
не раз в секунду. А раз в 10миллисекунд. Вызовет прерывание, в прерывании вы перезагрузите значение, чтобы он опять перполнился через 10mS. И в этом же прерывании увеличите вашу переменную софтверного таймера. Ну пусть будет 250mS, чтобы дисплей обновился четыре раза в секунду. Тогда надо будет досчитать до 24, сбросить в ноль и запустить код, который считает количество импульсов от колеса и пересчитает в километры в час. Это тупо в лоб.
0
ShodS
0 / 0 / 0
Регистрация: 01.02.2010
Сообщений: 2,011
22.04.2014, 13:37 #6
Цитата Сообщение от kot_kypotytmyk
Но если мы будем считать количество импульсов за секунду , то и частота обновления соответственно будет равна одной секунде.
Чет вы как то не так считаете...
Надо считать количество тиков таймера в промежутке между фронтами импульса с датчика колеса... и эту цифру переводить в скорость...
Тогда, если колесо будет вращаться со скоростью 1 об\сек, то и обновление на дисплее будет 1 раз\сек...
Если колесо вращается со скоростью 10 об\сек то и обновление дисплея будет 10 раз\сек
0
45893569365
0 / 0 / 0
Регистрация: 06.04.2013
Сообщений: 172
22.04.2014, 13:42 #7
Цитата Сообщение от ShodS
Чет вы как то не так считаете...
Надо считать количество тиков таймера в промежутке между фронтами импульса с датчика колеса... и эту цифру переводить в скорость...
Тогда, если колесо будет вращаться со скоростью 1 об\сек, то и обновление на дисплее будет 1 раз\сек...
Если колесо вращается со скоростью 10 об\сек то и обновление дисплея будет 10 раз\сек
Кстати, да. Если импульс за оборот колеса (а не спицы считать), то надо период измерять. Скорость то мааааленькая.
0
kot_kypotytmyk
0 / 0 / 0
Регистрация: 14.12.2013
Сообщений: 24
22.04.2014, 13:46 #8
Цитата Сообщение от 45893569365
Цитата Сообщение от ShodS
Чет вы как то не так считаете...
Надо считать количество тиков таймера в промежутке между фронтами импульса с датчика колеса... и эту цифру переводить в скорость...
Тогда, если колесо будет вращаться со скоростью 1 об\сек, то и обновление на дисплее будет 1 раз\сек...
Если колесо вращается со скоростью 10 об\сек то и обновление дисплея будет 10 раз\сек
Кстати, да. Если импульс за оборот колеса (а не спицы считать), то надо период измерять. Скорость то мааааленькая.
Цитата Сообщение от ShodS
Цитата Сообщение от kot_kypotytmyk
Но если мы будем считать количество импульсов за секунду , то и частота обновления соответственно будет равна одной секунде.
Чет вы как то не так считаете...
Надо считать количество тиков таймера в промежутке между фронтами импульса с датчика колеса... и эту цифру переводить в скорость...
Тогда, если колесо будет вращаться со скоростью 1 об\сек, то и обновление на дисплее будет 1 раз\сек...
Если колесо вращается со скоростью 10 об\сек то и обновление дисплея будет 10 раз\сек

Спасибо за свет! Т.е. тогда лучше датчик повесит на ножку внешних прерываний (INT1/INT0) ?
0
YTYOUT
0 / 0 / 0
Регистрация: 02.10.2012
Сообщений: 1,946
22.04.2014, 13:53 #9
На любое
0
ShodS
0 / 0 / 0
Регистрация: 01.02.2010
Сообщений: 2,011
22.04.2014, 13:55 #10
Цитата Сообщение от kot_kypotytmyk
Спасибо за свет! Т.е. тогда лучше датчик повесит на ножку внешних прерываний (INT1/INT0) ?
Да, это лучший вариант...

Хотя тут принцип такой же, а разведено так, что вход на обычной ножке... пришлось программно опрашивать линию... в принципе все работает, хотя там до 6000 об\мин меряет... а у вас намного меньше будет скорость...
0
dsshooozzzi
0 / 0 / 0
Регистрация: 03.01.2011
Сообщений: 250
25.04.2014, 15:47 #11
Добавлю своих 5коп.
У меня на скуте я измеряю количество оборотов за промежуток времени, а не количество времени.
Это связано с тем, что когда колесо подает сигнал и останавливается, то значение скорости не меняется пока не будет сброс от таймера. Ибо следующий импульс может прийти завтра ;)
Алгоритм на пальцах:
1. На INT1(0) поступают сигналы и суммируются.
2. Каждые 250мс запоминаем количество импульсов на INT1(0), и обнуляем счетчик.
Количество импульсов я сохраняю в массив[8] по кругу и устанавливаю флаг.
3. В майне, при наличии флага, сбрасываю флаг и вывожу значение скорости, суммируя значения массива[8].
Код ф-ции SpeedSotsAndDraw()
Код
void SpeedSotsAndDraw()
{
unsykned int NewSpeed = 0;
unsykned char cPointer;
char path[7] = "s\\1\\X\n\r";
// Сумируем насчитанные значения
for(cPointer = 0; cPointer < SpeedFilterN; cPointer++)
{
NewSpeed += SpeedArray[cPointer];
}
// Поскольку отсчеты по 0,25 сек,
// то при SpeedFilterN == 8 - Имеем скорось за последние 2 сек
// Переводим [обороты/сек] в [10км/час]
NewSpeed = NewSpeed * 24.75;//49.5;
// На случай, если показания не влезут в индикатор
if(NewSpeed > 999) NewSpeed = 999;

// Обновляем показания на дисплее
//   cPointer = NewSpeed/100;
//   if( cPointer != (SpeedOnDyspley/100) )
//   {
path[4] = NewSpeed/100 + 48;
DrawImage(path);
//   }

//   cPointer = ((NewSpeed/10)%10);
//   if( cPointer != ((SpeedOnDyspley/10)%10) )
//   {
path[2] = 2;
path[4] = ((NewSpeed/10)%10) + 48;
DrawImage(path);
//   }

//   cPointer = NewSpeed%10;
//   if( cPointer != (SpeedOnDyspley%10) )
//   {
path[2] = 3;
path[4] = NewSpeed%10 + 48;
DrawImage(path);
//   }

// слайдер привязан к первому символу спидометра
// Если первый символ изменился
if( ((SpeedOnDyspley+1)/100) != ((NewSpeed+1)/100) )
DrawSlide(
(((NewSpeed+1)/100)-1),
(((SpeedOnDyspley+1)/100)-1),
280);

// Сохраняем значение, что выведено на дисплей
SpeedOnDyspley = NewSpeed;
}
Бланк дисплея
<Изображение удалено>

P.S. Геркон лучше не использовать - возможны ложные срабатывания при тряске. Датчик Холла в помощь.
0
Sykmottir
0 / 0 / 0
Регистрация: 15.12.2010
Сообщений: 931
25.04.2014, 16:09 #12
Цитата Сообщение от dsshooozzzi
P.S. Геркон лучше не использовать - возможны ложные срабатывания при тряске. Датчик Холла в помощь.
Если речь идет о батарейном питании, то следует учесть, что датчик Холла жрет не мало.
0
ImTuTb!
0 / 0 / 0
Регистрация: 04.03.2011
Сообщений: 594
25.04.2014, 22:42 #13
Все велокомпы на герконах
0
dsshooozzzi
0 / 0 / 0
Регистрация: 03.01.2011
Сообщений: 250
26.04.2014, 00:27 #14
Я слышал, что можно герконом воспользоваться даже на мопеде, но личный опыт показал, что 4 геркона разных производителей ложно срабатывают. Хотя... если учесть, что движок у меня дырынчит...
0
Sthuthu
0 / 0 / 0
Регистрация: 10.04.2014
Сообщений: 879
27.04.2014, 11:21 #15
В качестве датчика можно попробовать индуктивный
Как тут на странице 26
0
YTYOUT
0 / 0 / 0
Регистрация: 02.10.2012
Сообщений: 1,946
27.04.2014, 13:37 #16
На лисопеде ведь по идее есть генератор . И помоему напряжение зависит от скорости - АЦП
0
Sthuthu
0 / 0 / 0
Регистрация: 10.04.2014
Сообщений: 879
27.04.2014, 14:00 #17
Цитата Сообщение от YTYOUT
На лисопеде ведь по идее есть генератор . И помоему напряжение зависит от скорости - АЦП
это ну оооочень приблизительная скорость + проскальзывания ротора генератора
0
Hoskir
0 / 0 / 0
Регистрация: 31.03.2010
Сообщений: 30
29.04.2014, 09:37 #18
kot_kypotytmyk
Датчик надо вешать не на INT1/INT0 а на вход захвата таймера, настраивать таймер на режим захвата. В прерывании по событию захвата таймера, высчитывать разницу между тиками. Так ты с лёгкостью вычислишь обороты колеса. А уже пересчитав количество оборотов на длину окружности колеса, высчитаешь скорость.
На колесо ставить либо датчик холла, либо оптопару. Хотя оптопару грязью закидает и работать не будет. Как вариант неодимовый нигнит и датчик из катушки. Вариантов хватает, выбери самый энерго-экономичный.
Если в капче таймера не разберёшься, могу скинуть готовый кусок программы на сях, сам разрабатываю автоматический подсос на карбюратор, обороты двигателя так считать буду.
0
29.04.2014, 09:37
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
29.04.2014, 09:37

Как подружить AVR+AVR?
Приветствую Вас уважаемые форумчане! Требуется связать 2 AVR-ки, по...

CAVR против AVR Studio, что не так в программе под AVR Studio
Проблема такая, есть исходник, если его компилировать в CAVR заливаю в МК все...

GCC и AVR Studio 5 и AVR Studio 4.18
Доброго дня Всем! Кто может подсказать следующее - у меня установлена AVR...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
18
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2018, vBulletin Solutions, Inc.
Рейтинг@Mail.ru