Форум программистов, компьютерный форум, киберфорум
Наши страницы

Микроконтроллеры Atmega AVR

Войти
Регистрация
Восстановить пароль
 
 
kot_kypotytmyk
0 / 0 / 0
Регистрация: 14.12.2013
Сообщений: 24
#1

велоспидометр на avr - Atmega AVR микроконтроллер

22.04.2014, 12:20. Просмотров 5997. Ответов 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 (Atmega AVR микроконтроллер):

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

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

Анализ стека AVR / AVR stack analysis - Atmega AVR микроконтроллер
Привет! Уперся я в стек, и решил понять что почем. Нашел вот такой вот скриптик: http://dlbeer.co.nz/oss/ovstack.html Вкратце,...

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

AVR Studio 6 Avr simulator - Atmega AVR микроконтроллер
Подскажите каким образом стартануть прогу в avr symulator с адреса boottooder (atmega8a, 0x0F80). Также не нашел где выставить частоту МК.

Как подружить AVR+AVR? - Atmega AVR микроконтроллер
Приветствую Вас уважаемые форумчане! Требуется связать 2 AVR-ки, по классической схеме Master -> Slave. Проштудировал топики на эту...

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
27.04.2014, 11:21
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
27.04.2014, 11:21
Привет! Вот еще темы с ответами:

CAVR против AVR Studio, что не так в программе под AVR Studio - Atmega AVR микроконтроллер
Проблема такая, есть исходник, если его компилировать в CAVR заливаю в МК все работает, если этот же код (ПОДМОРОФЕЧЕННЫЙ) я компилирую в...

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

AVR + PS/2 - Atmega AVR микроконтроллер
Хочу состыковать AVR + PS/2 клавиатуру, нужен исходник на ассемблере. Есть у кого опыт реализации?

avr+ps/2 - Atmega AVR микроконтроллер
День добрый Пишу свою библиотеку для работы с клавиатурой ps/2 .MACRO USORT_INIT .equ XTAL = 8000000 .equ baudrate = 9600 ...


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

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

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