Страница 1 из 1

Измеритель скорости на ATMEGA8.

Добавлено: Вт апр 04, 2017 16:44:50
Tuz
Приветствую Уважаемые форумчане. Недавно по просьбе знакомого автомоделиста ( скорее по желанию попробовать собрать что-то серьезное) начал разработку измеритель скорости. В чем заключается суть данного девайса. Модель автомобиля едет по кругу в произвольный момент времени (т. е. по желанию спортсмена) при нажатии на кнопку начинается отсчет определенного количества кругов. И после все этих процедур выводится финальный результат. Забыл упомянуть до нажатия на кнопку показывается скорость каждого круга. Так спортсменам легче определить лучший момент.

Добавлено after 28 minutes 52 seconds:
Выклыдываю проект в протеусе и собственно саму программу.

Добавлено after 23 minutes 22 seconds:
Схему в протеусе выложить не получается(не знаю почему, но скорей всего ограничение модератора) Попробую нарисовать .jpeg
Программу выложил. Если есть мысли как её ускорить, сделать более читаемой критика приветствуется(попрошу сильно не пинаться это моя 2я программа).

Re: Измеритель скорости на ATMEGA8.

Добавлено: Вт апр 04, 2017 19:01:14
АлександрЛ
Tuz писал(а): Схему в протеусе выложить не получается(не знаю почему, но скорей всего ограничение модератора) Попробую нарисовать .jpeg .
Заархивируйте файл протеуса в *.rar или *.zip - тогда выложится..

Re: Измеритель скорости на ATMEGA8.

Добавлено: Ср апр 05, 2017 05:31:49
akl
Tuz писал(а):Программу выложил. Если есть мысли как её ускорить, сделать более читаемой критика приветствуется(попрошу сильно не пинаться это моя 2я программа).
Можно уйти от магических чисел типа

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

	TCNT1 = 57535;
, а сразу записать

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

TCNT1 = -8000 ; 1мс
или вообще уйти от привязки к частоте тактирования

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

TCNT1 = -F_CPU/1000; 1мс
Не нравится проведение расчёта скорости. Операция деления должна проводиться в последнюю очередь. Не думаю, что компилятор настолько продвинутый, что сам определяет порядок выполнения операций.
Думаю, что лучше задать режим работы таймера по сравнению с автосбросом и привязать к 1мс динамическую индикацию.

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

OCR1A=F_CPU/1000-1; 1мс
TCCR1B=ICES1+WGM12+CS10; CTC F_CPU/1

Re: Измеритель скорости на ATMEGA8.

Добавлено: Ср апр 05, 2017 08:28:36
Tuz
Спасибо за совет АлександрЛ. Проект в протеусе выложил.

Добавлено after 41 minute 38 seconds:

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

 или вообще уйти от привязки к частоте тактирования 
ТCNT1 = -F_CPU/1000; 1мс 
Отиличная мысль. Буду исправлять.

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

 Не нравится проведение расчёта скорости. Операция деления должна проводиться в последнюю очередь. Не думаю, что компилятор настолько продвинутый, что сам определяет порядок выполнения операций.
Если вы имеете в виду эту часть кода
return (uint16_t)(((float)50000/data)*3600);
то здесь после деления, результат умножается что бы вывести нужную часть числа из дробной части (Поскольку точка скорей всего будет включена постоянно). Что бы вывести деление из формулы нужно будет добавить переменную и добавить еще отдельную строку кода для умножения. Что то типа этого:
float temp;
temp = ((float)50000/data):
return (uint16_t)(temp*3600);
Больше ничего в голову не приходит. Результат по формуле выдается правильный.

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

Думаю, что лучше задать режим работы таймера по сравнению с автосбросом и привязать к 1мс динамическую индикацию.
OCR1A=F_CPU/1000-1; 1мс
TCCR1B=ICES1+WGM12+CS10; CTC F_CPU/1
Про динамическую индикацию думал, но не успел добратся

Re: Измеритель скорости на ATMEGA8.

Добавлено: Ср апр 05, 2017 08:51:39
akl
Не понимаю в ваших кыржиках, но почему нельзя сделать так

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

3600*50000/data

Re: Измеритель скорости на ATMEGA8.

Добавлено: Чт апр 06, 2017 16:35:41
Tuz
Эту формулу я скопировал с термометра. Подставил только свои значения. Но следуя вашей формуле умножение можно убрать совсем, оставив только деление.

Re: Измеритель скорости на ATMEGA8.

Добавлено: Пт апр 07, 2017 02:42:04
akl
Именно так, объявив константой.
http://radiokot.ru/forum/viewtopic.php? ... 2#p2988312