Велокомп

Обсуждаем контроллеры компании Atmel.
Ответить
Открыл глаза
Сообщения: 43
Зарегистрирован: Пт мар 29, 2013 13:07:03

Сообщение MAndrey90 »

Привет народ. Есть атмега8515, хочу на ней собрать велокомпьютер. Проблема заключается в следующем.Как настроить таймер и выводить(считать) текущую скорость велосипеда. По геркону будут считаться количество оборотов, длина окружности будет постоянной величиной. желательно с кодом. Весь моск себе уже сломал.
Реклама
Мудрый кот
Аватара пользователя
Сообщения: 1817
Зарегистрирован: Пн ноя 29, 2010 15:58:43

Сообщение igor-x »

весь моск уже поломали другие
http://cxem.net/mc/mc154.php
Реклама
akl
Друг Кота
Сообщения: 4450
Зарегистрирован: Пт мар 07, 2008 06:54:43
Откуда: Ижевск

Сообщение akl »

MAndrey90 Когда-то писАл :oops:
Спойлер
V=S/T
S[m]=L*Nx,
где L[m]-длина окружности колеса, Nx-целое число оборотов колеса за время измерения
T=to*nox=nox/Fo,
где to-период частоты тактирования Fo, nox-число периодов частоты тактирования за время прохождения Nx.
V[м/сек]=Fo*L*Nx/nox или
10*V[км/час]=36*Fo*L*Nx/nox. Для более полного удовлетворения потребностей при различных входных параметрах
введем в выражение еще одну составляющую Z, а именно число импульсов от датчика за один оборот колеса.
Получаем итоговое выражение

10*V[км/час]=K*Nx/nox*Z, где
K-коэффициент пропорциональности, определением которого займемся ниже.


Допустим, что Fo=7'372'877Hz ( ну нет у нас резонатора 10МГц. Идти в магазин лениво; да и жаба орет благим матом.
Зато в развалах нашли такой и измерили его частоту),
L=2.07345м( взяли рулетку и измерили длину окружности), Z=1(один магнит на колесе и один геркон) и спидометр может
определять скорость 180.0км/час.
Время измерения примем ~0.3 секунды.
Велик, без сомнения, не сможет двигаться с такой скоростью, но учитывать это мы обязаны.
180'000 м/3600 сек= 50м/сек или 15м за 0.3 сек
Nx при этом будет 15/2.07345=7,23 оборота. Дождемся прохождения полного оборота колеса и тогда Nx=8. Эти 8 оборотов
колесо совершит за 0,331752 секунды или за nox=2'445'966 периодов Fo
K=36*7'372'877*2.07345=550'342'505.

10*V[км/час]=550'342'505*Nx/nox.

Например:
Измеряется скорость 28.76км/час
Колесо при какой скорости совершит один оборот за 28.76[км/час]/3.6=7.9(8)[м/сек]-> 7.9(8)[м/сек]/2.07345[м]=
3.85xxx[1/сек] или 0.259541сек. Так как период меньше принятого времени измерения дожидаемся прохождения еще одного
периода. При этом Nx=2 и nox=3'827'127
10*V=550'342'505*2/3'827'127=287.6
V=28.8 км/час
Если подойдёт, то можно и поисками асма заняться.
Открыл глаза
Сообщения: 43
Зарегистрирован: Пт мар 29, 2013 13:07:03

Сообщение MAndrey90 »

меня интересует программная реализация,кто нибубь поможет кодом?
Реклама
Эиком - электронные компоненты и радиодетали
Друг Кота
Сообщения: 3424
Зарегистрирован: Вт ноя 30, 2010 11:46:16
Откуда: Україна

Сообщение BoRtO »

Пора что то поменять в своей жизни - поменял windows.
КПІ РТФ!
Реклама
Открыл глаза
Сообщения: 43
Зарегистрирован: Пт мар 29, 2013 13:07:03

Сообщение MAndrey90 »

Мне этот исходник ни о чем не говорит, куча всяких букв. Нужный мне кусок я так и не смог найти.
Реклама
Открыл глаза
Сообщения: 43
Зарегистрирован: Пт мар 29, 2013 13:07:03

Сообщение MAndrey90 »

Попытался написать код, но он нормально не работает, в чем ошибка? напрягают меня переменные величин . По нажатию кнопки(или геркону) на ЖКи выводятся случайные симовлы.

Код: Выделить всё

#include <mega8515.h>
#include <delay.h>
#include <lcd.h>
#asm
  .equ __lcd_port=0x15 ;
#endasm
#include <lcd.h>
 unsigned int num;// время
unsigned int l=100;//длина окружности
unsigned int n ; //кол-во оборотов
unsigned int v=0;//скорость
interrupt [TIM1_COMPA] void timer1_compa_isr(void)
{
TCNT1H=0;
TCNT1L=0;
 num++;  

}
 interrupt [EXT_INT0] void ext_int0_isr(void)
{ 
  n++; 
    
    }      


void main(void)
{
  MCUCR |= (0<<ISC01)|(0<<ISC00); //устанавливаем условие внешенго прерывания от INT0
    GICR |= (1<<INT0);   
    MCUCR |= (0<<ISC10)|(0<<ISC11); //устанавливаем условие внешенго прерывания от INT1
    GICR |= (1<<INT1);
PORTA=0x00;
DDRA=0x00;
PORTB=0x00;
DDRB=0x00;
PORTC=0x00;
DDRC=0x00;
PORTD=0x00;
DDRD=0x00;
PORTE=0x00;
DDRE=0x00;
TCCR0=0x00;
TCNT0=0x00;
OCR0=0x00;
TCCR1A=0x00;
TCCR1B=0x05;
TCNT1H=0x00;
TCNT1L=0x00;
ICR1H=0x00;
ICR1L=0x00;
OCR1AH=0x1E;
OCR1AL=0x85;
OCR1BH=0x00;
OCR1BL=0x00;
MCUCR=0x00;
EMCUCR=0x00;
TIMSK=0xC0;
UCSRB=0x00;
ACSR=0x80;
SPCR=0x00;


// Global enable interrupts
#asm("sei")

while (1)
      {
          v=l*n/num;//находим скорость
       lcd_init(16);//выводим на ЖКИ
  lcd_clear();
  lcd_gotoxy(0,0);  
    lcd_putchar(v);
  

      }
}
Мудрый кот
Аватара пользователя
Сообщения: 1817
Зарегистрирован: Пн ноя 29, 2010 15:58:43

Сообщение igor-x »

напрягают меня переменные величин
а что это за величины?
Открыл глаза
Сообщения: 43
Зарегистрирован: Пт мар 29, 2013 13:07:03

Сообщение MAndrey90 »

Ну время, расстояние. длина окружности и т.п.
Мудрый кот
Аватара пользователя
Сообщения: 1817
Зарегистрирован: Пн ноя 29, 2010 15:58:43

Сообщение igor-x »

так вам уже предложили 2 готовых устройства которые можно скопировать не напрягаясь.
если же вы ставите себе задачу изучения вычислений на МК, то вероятно надо поискать учебные материалы .
Открыл глаза
Сообщения: 43
Зарегистрирован: Пт мар 29, 2013 13:07:03

Сообщение MAndrey90 »

так, таких мк у меня нет, придется перекомпилировать весь проект, что равнозначно созданию прошивки по новой.
Ответить

Вернуться в «AVR»