|
Виж темите без отговор | Виж активните теми
Дата и час: Пон Юли 27, 2026 6:19 pm
|
Страница 1 от 1
|
[ 11 мнения ] |
|
Въпрос за математически изчисления в С за AVR
| Автор |
Съобщение |
|
Ugeen
Ранг: Новодошъл
Регистриран на: Пон Яну 16, 2006 5:20 pm Мнения: 122 Местоположение: гр. Горна Оряховица
|
 Въпрос за математически изчисления в С за AVR
Колеги,отдавна се занимавам с контролери,правил съм много неща ,но никога не ми се е налагало да ги ползвам за сметки и то на дробни числа.В момента правя един оборотмер с ATMega8 и ми се налага да ползвам малко математика.Идеята е следната: На вход за външно прекъсване ще постъпват импулси от опто датчик.На всяко преминаване на вала през датчика ще се нулира и ще се запуска 16bit timer,който да отчита времето за едно пълно завъртане на вала.Това време ще бъде Time_per_oborot(s)=Timer.(1/Fclock(Hz)). където Timer е отчетената от таймера стойност,а Fclock e честотата с която се тактува таймера.За да се сметнат оборотите на вала за една минута трябва да се ползва израза :
Oborot_per_minute=60/(Timer/Fclock)
Ползвам CodeVisionAVR.Въпросът ми е:Как трябва да се зададе този израз за смятане.Не знам до колко сложни изрази могат да се пишат.Трябва да се декларират променливи от типа float,а аз не съм наясно с тях.Доколкото прочетох заемат
4 byte от паметта,но как могат да се достъпват тези байтове и кой какво съдържа, никъде не е споменато.Другото което ме интересува как от полученото въпросно дробно число да отделя цялата част и да я преобразувам в десетичен код за да я индицирам върху 4 разряден седемсегментен индикатор.За вас може и да е елементарно ,но аз за пръв път се сблъсквам с това,а нали знаете,човек се учи докато е жив.Надявам се на помощта ви за която предварително благодаря.
|
| Нед Мар 26, 2006 5:58 pm |
|
 |
|
evc
Ранг: Напреднал
Регистриран на: Пет Окт 21, 2005 8:45 am Мнения: 499
|
Дефинирай ги "float" и след изчислението ползвай функцията за пробразуване на типове. В HI-TECH има FloatToStr(float, *string). Също има и FloatToBCD.
_________________ Простотията е Божи дар, но човек не бива да парадира с подаръците си!
|
| Нед Мар 26, 2006 6:10 pm |
|
 |
|
TheWizard
Ранг: Форумен бог
Регистриран на: Сря Апр 27, 2005 12:48 pm Мнения: 6094
|
Ugeen: Можеш да смяташ сложни уравнения, проблема е времето(ресурсите) за което ще се извършат.
Преобразувай си формулите до INTEGER аритметика
|
| Нед Мар 26, 2006 7:06 pm |
|
 |
|
Ugeen
Ранг: Новодошъл
Регистриран на: Пон Яну 16, 2006 5:20 pm Мнения: 122 Местоположение: гр. Горна Оряховица
|
Дай някакъв пример ,какво имаш в предвид.Например с тази формула която съм написал
|
| Нед Мар 26, 2006 7:16 pm |
|
 |
|
TheWizard
Ранг: Форумен бог
Регистриран на: Сря Апр 27, 2005 12:48 pm Мнения: 6094
|
Ами не си дал подробности:
мин-макс Oborot_per_minute, % грешка,
разредност на Timer-а,
параметри на Fclock(мин-мах), итн.
|
| Нед Мар 26, 2006 7:31 pm |
|
 |
|
Ugeen
Ранг: Новодошъл
Регистриран на: Пон Яну 16, 2006 5:20 pm Мнения: 122 Местоположение: гр. Горна Оряховица
|
Ами да кажем такта на таймера да е 3096Hz.Обороти от 0 до 1500 ,за грешка не ми трябва да е много точно ,да кажем един оборот.
|
| Нед Мар 26, 2006 7:39 pm |
|
 |
|
Gogo
Ранг: Форумен бог
Регистриран на: Чет Фев 24, 2005 11:41 pm Мнения: 1049 Местоположение: Pz
|
Под определени обороти (да не говорим за 0) не може да стане точно така. Най-малкото ще трябва да си "наставиш" таймера с един-два регистъра. 
|
| Нед Мар 26, 2006 7:49 pm |
|
 |
|
Ugeen
Ранг: Новодошъл
Регистриран на: Пон Яну 16, 2006 5:20 pm Мнения: 122 Местоположение: гр. Горна Оряховица
|
Добре ,да кажем мин. обороти да са 100
|
| Нед Мар 26, 2006 7:56 pm |
|
 |
|
TheWizard
Ранг: Форумен бог
Регистриран на: Сря Апр 27, 2005 12:48 pm Мнения: 6094
|
не си казал и колко са отчетите за 1 секунда :)
|
| Нед Мар 26, 2006 8:16 pm |
|
 |
|
Ugeen
Ранг: Новодошъл
Регистриран на: Пон Яну 16, 2006 5:20 pm Мнения: 122 Местоположение: гр. Горна Оряховица
|
по един път на секунда
|
| Пон Мар 27, 2006 8:08 am |
|
 |
|
Реконструктор
Ранг: Форумен бог
Регистриран на: Съб Сеп 25, 2004 12:32 pm Мнения: 8382 Местоположение: София
|
Почти цялата аритметика в ЕКУ-то ми е на float и бачка перфектно (gcc), така че давай смело.  Имай предвид, че изрази от типа на n/f където n е int а f e float n трябва да се каства насилствено към float, т.е. (float)n/f. Иначе по подразбиране кастването е обратно - n/(int)f и резултата е int и стават грешки.
Значетелно по-бързо е използването на числа с фиксирана запетая, отначало тръгнах по тоя път, но писането и дебъгването стават много тежки и предпочетох да ми е по-леко на душата и минах на float. 
|
| Пон Мар 27, 2006 10:48 am |
|
|
|
Страница 1 от 1
|
[ 11 мнения ] |
|
Кой е на линия |
Потребители разглеждащи този форум: 0 регистрирани и 1 госта |
|
Вие не можете да пускате нови теми Вие не можете да отговаряте на теми Вие не можете да променяте собственото си мнение Вие не можете да изтривате собствените си мнения Вие не можете да прикачвате файл
|
|