roboforum.ru

Технический форум по робототехнике.

Измерение скорости (HELP)

Измерение скорости (HELP)

Aptem » 13 окт 2009, 11:54

Всем привет! Нужна помощь. Хочу сделать спидометр на AVR по типу велокомпьютеров (возможность вводить длину окружности).
Сталкнулся с проблемой, что длина окружности не целое число а дробь. Может кто подобное делал? Если можно раскажите как вы обрабатывали информацию.

Re: Измерение скорости (HELP)

avr123.nm.ru » 13 окт 2009, 12:03

Скорость маленькая и поэтому можно все во float считать как на калькуляторе. Вот типы переменных в CVAVR подробно рассмотрены - Язык Си для микороконтроллеров - http://avr123.nm.ru/05.htm

Любителям АСМ посложней чуток.

Re: Измерение скорости (HELP)

Aptem » 13 окт 2009, 14:26

avr123.nm.ru, Спасибо что откликнулись, но к сожалению я незнаю СИ. После посещения вашего курса я понял что мне нужно, но к сожалению я несмог найти подробной информации и примеров работы с числами с плавающей точкой. Если не трудно ткините носом туда где это можно посмотреть.

Re: Измерение скорости (HELP)

=DeaD= » 13 окт 2009, 14:29

Так вы Си собираетесь изучать или нет? :)

Re: Измерение скорости (HELP)

galex1981 » 13 окт 2009, 14:34

Можешь в принципе изучить Бейсик для МК, быстрее изучишь чем С ;)

Re: Измерение скорости (HELP)

executer » 13 окт 2009, 14:40

а еще можеш длинну окружности в мм вводить, целым числом

Re: Измерение скорости (HELP)

Master » 13 окт 2009, 15:34

А в чем проблема с дробными числами?

Добавлено спустя 1 минуту 58 секунд:
Да и вообще какое это имеет значение?
Ставим геркон или щелевую оптопару на колесо, и измеряем время между сигналами прохождения это точки. Время (t) знаем, длину окружности (S) колеса знаем, V=S/t.
Все.

Re: Измерение скорости (HELP)

Aptem » 19 окт 2009, 16:48

Всем спасибо за варианты решения задачи. К счастью разобрался, но возникла другая проблема: Преобразование кода для 7 сегментного индикатора. Понял что делается таблица преобразование, а дальше не ясно. Может кто обьяснит? (заранние благодарен)

Re: Измерение скорости (HELP)

executer » 19 окт 2009, 16:57

ну если у тебя тройку надо показать, смотриш в массиве в ячейке номер 3 что записано. читаеш и отправляеш на порт к которому сегмент подключен.
а в ячейке третьей должна быть комбинация 0 и 1 записана при записи в порт которой появится не краказябла а красивая тройка на индикаторе.
(это образно, располагать массив в памяти программ обычно предлагают. чтоб озу константами не засирать)

Re: Измерение скорости (HELP)

Aptem » 20 окт 2009, 08:55

Я не могу понять алгоритм преобразования. У меня получается например значение 0xС6 тобишь 198(км/ч), что дольше делать немогу понять. Обьясните пожалуйста.

Re: Измерение скорости (HELP)

Виталий » 20 окт 2009, 09:02

Неслабо ты разогнался на велике =)
X = 198;
п.1 Берем остаток от деления на 10:
X % 10 = 198 % 10 = 8;
п.2 Записываем число в крайний правый индикатор.
X := X / 10 = 198 / 10 = 19;

потом выполняем п.1. для числа 19...

Re: Измерение скорости (HELP)

Aptem » 20 окт 2009, 10:54

Честно говоря это не на велик, а на мотоцикл и 199км/ч это максимальное эначение. Вы уж меня простите но я немогу понять нашел пример, сделал в итоге пишет фигню.
Посмотрите пожалуйста что я делаю не так?
.equ a = 0
.equ b = 1
.equ c = 2
.equ d = 3
.equ e = 4
.equ f = 5
.equ g = 6

code_3:
mov r16,ZH
rcall get_7
sts D0,r0

mov r16,ZL
andi r16,$f0
swap r16
rcall get_7
sts D1,r0

mov r16,ZL
andi r16,$0f
rcall get_7
sts D2,r0
ret


get_7:
ldi XL,Low(Segm<<1)
ldi XH,High(Segm<<1)
clr r17
add XL,r16
add XH,r17
lpm
ret

Segm:
Z0_1: .db 1<<a|1<<b|1<<c|1<<d|1<<e|1<<f, 1<<b|1<<c
Z2_3: .db 1<<a|1<<b|1<<d|1<<e|1<<g, 1<<a|1<<b|1<<c|1<<d|1<<g
Z4_5: .db 1<<b|1<<c|1<<f|1<<g, 1<<a|1<<c|1<<d|1<<f|1<<g
Z6_7: .db 1<<a|1<<c|1<<d|1<<e|1<<f|1<<g, 1<<a|1<<b|1<<c
Z8_9: .db 1<<a|1<<b|1<<c|1<<d|1<<e|1<<f|1<<g, 1<<a|1<<b|1<<c|1<<d|1<<f|1<<g

.dseg

D0: .byte 1
D1: .byte 1
D2: .byte 1

Re: Измерение скорости (HELP)

Master » 20 окт 2009, 12:34

что я делаю не так?

Пишешь на асме, шутка :)

Если на С то я делал так
1. Объявляем массив значений порта которые нужно выдать чтобы вывести соответствующее число.
Код: Выделить всёРазвернуть
 static char digits[] = {
   0b00111111, //0
   0b00000110, //1
   0b01011011, //2
   0b01001111, //3
   0b01100110, //4
   0b01101101, //5
   0b01111101, //6
   0b00000111, //7
   0b01111111, //8
   0b01101111, //9   
};


2. Процедура вывода на дисплей
Код: Выделить всёРазвернуть
void Displey(void)
{
   data=123; //число которое выводим;

   //Выводим индикатор единиц
   ind_ed;  //Процедура включения соответствующего индикатора
   PORTD=digits[data%10];  //123%10=3, следовательно digits[3], что по массиву означает 0b01001111, //3
   pause; //Процедура паузы, устраняем мерцание порядка 5 мс
   data=data/10;  //123/10=12

   //Выводим индикатор десятков
   ind_des; //Процедура включения соответствующего индикатора
   PORTD = digits[data%10];  //12%10=2
   pause;
   data=data/10;  //12/10=1

   //Выводим индикатор сотен
   ind_sot; //Процедура включения соответствующего индикатора
   PORTD = digits[data];
   pause;
}

Re: Измерение скорости (HELP)

Aptem » 20 окт 2009, 13:53

Master, ОГРОМНОЕ ВАМ СПАСИБО! Блоголаря вашему примеру я разобрался, теперь работает правильно! :Yahoo!:

Re: Измерение скорости (HELP)

Master » 20 окт 2009, 13:59

Заходите еще.


Rambler\'s Top100 Mail.ru counter