| Микроконтролери и електроника http://mcu-bg.com/mcu_site/ |
|
| Въпрос за математически изчисления в С за AVR http://mcu-bg.com/mcu_site/viewtopic.php?f=7&t=2092 |
Страница 1 от 1 |
| Автор: | Ugeen [ Нед Мар 26, 2006 5:58 pm ] |
| Заглавие: | Въпрос за математически изчисления в С за 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 разряден седемсегментен индикатор.За вас може и да е елементарно ,но аз за пръв път се сблъсквам с това,а нали знаете,човек се учи докато е жив.Надявам се на помощта ви за която предварително благодаря. |
|
| Автор: | evc [ Нед Мар 26, 2006 6:10 pm ] |
| Заглавие: | |
Дефинирай ги "float" и след изчислението ползвай функцията за пробразуване на типове. В HI-TECH има FloatToStr(float, *string). Също има и FloatToBCD. |
|
| Автор: | TheWizard [ Нед Мар 26, 2006 7:06 pm ] |
| Заглавие: | |
Ugeen: Можеш да смяташ сложни уравнения, проблема е времето(ресурсите) за което ще се извършат. Преобразувай си формулите до INTEGER аритметика |
|
| Автор: | Ugeen [ Нед Мар 26, 2006 7:16 pm ] |
| Заглавие: | |
Дай някакъв пример ,какво имаш в предвид.Например с тази формула която съм написал |
|
| Автор: | TheWizard [ Нед Мар 26, 2006 7:31 pm ] |
| Заглавие: | |
Ами не си дал подробности: мин-макс Oborot_per_minute, % грешка, разредност на Timer-а, параметри на Fclock(мин-мах), итн. |
|
| Автор: | Ugeen [ Нед Мар 26, 2006 7:39 pm ] |
| Заглавие: | |
Ами да кажем такта на таймера да е 3096Hz.Обороти от 0 до 1500 ,за грешка не ми трябва да е много точно ,да кажем един оборот. |
|
| Автор: | Gogo [ Нед Мар 26, 2006 7:49 pm ] |
| Заглавие: | |
Под определени обороти (да не говорим за 0) не може да стане точно така. Най-малкото ще трябва да си "наставиш" таймера с един-два регистъра. |
|
| Автор: | Ugeen [ Нед Мар 26, 2006 7:56 pm ] |
| Заглавие: | |
Добре ,да кажем мин. обороти да са 100 |
|
| Автор: | TheWizard [ Нед Мар 26, 2006 8:16 pm ] |
| Заглавие: | |
не си казал и колко са отчетите за 1 секунда :) |
|
| Автор: | Ugeen [ Пон Мар 27, 2006 8:08 am ] |
| Заглавие: | |
по един път на секунда |
|
| Автор: | Реконструктор [ Пон Мар 27, 2006 10:48 am ] |
| Заглавие: | |
Почти цялата аритметика в ЕКУ-то ми е на float и бачка перфектно (gcc), така че давай смело. Значетелно по-бързо е използването на числа с фиксирана запетая, отначало тръгнах по тоя път, но писането и дебъгването стават много тежки и предпочетох да ми е по-леко на душата и минах на float. |
|
| Страница 1 от 1 | Часовете са според зоната UTC + 2 часа [ DST ] |
| Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group http://www.phpbb.com/ |
|