| Микроконтролери и електроника http://mcu-bg.com/mcu_site/ |
|
| Реализиране на софтуерен PWM http://mcu-bg.com/mcu_site/viewtopic.php?f=3&t=5358 |
Страница 1 от 2 |
| Автор: | Zeus [ Пон Яну 21, 2008 4:05 pm ] |
| Заглавие: | Реализиране на софтуерен PWM |
Досега съм имал нужда само от един такъв модул и съм ползвал вградения. Сега ми трябват 8 бр., които да работят независимо. Няма изисквания за поддържане на постоянна честота и форма на сигнала. Трябва ми да регулирам независимо плавната подсветка на 8 осветителни тела. Ще използвам 16Ф88. Тепърва ще си изграждам методиката и ще се радвам на всякакви съвети. (Може би не е сложно за реализация, но като не съм се занимавал до сега, ще ми отнеме време) |
|
| Автор: | ToHu [ Пон Яну 21, 2008 4:54 pm ] |
| Заглавие: | |
Ами щом не е толкова критично ....8 синхрони ШИМ, примерно таймер се прекъсва на всеки 100 мкс, Имаш 16 променливи, по 2 на ШИМ, това са стойноста на всеки шим, при влизане в прекъсване от таймер аинкрементваш едната и я сравняваш с другата. Когато се изравнят сваляш изхода з съответния ШИМ. Като достигнеш някакева максимална стойност, да речем 100, нулираш променливите които се инкрементват, и вдигаш изходите на всички ШИМ-ве. Друг вариант който моцже да спедсти инструкции, в зависимост от процесора е да не сравняваш, а да намаляваш към 0, применро при пик това е по ефективно като код. Като достигнеш 0, сваляш изхода, достигнеш ли зададената от теб стойност сетваш про,менливите с зелания коефициент на запълване. Вече от тук нататък могат да с ползват всякакви разновидности, зависи какво имаш като софтуер и хардуер, какво може да позлваш ... |
|
| Автор: | MYXATA [ Пон Яну 21, 2008 4:55 pm ] |
| Заглавие: | |
елегантното/малко скъпо решение е : http://www.nxp.com/acrobat_download/dat ... 9551_7.pdf иначе може с изместващ регистър с дискретни елементи или реализиран на евтино CPLD |
|
| Автор: | stanleyhacker [ Пон Яну 21, 2008 5:02 pm ] |
| Заглавие: | |
Ако например периаода ти е 100 микросекунди и имаш 10 стъпки Правиш прекъсване от таймер на всеки 10 микросекунди. Правиш променлива timer = 0. В прекъсването променливата timer ти брои от 0 до 9 (инкементва се с 1 )и после пак превърта на 0 . Така знаеш къде във времето си, като настъпи прекъсване. Другото , което правиш е разбира се по една променлива за всеки изход, която казва ккава интензивността на светене от 0 до 10. Та във всяко прекъсване гледаш timer къде във времето си и сравняваш с тия 8 променливи. Ако имаш променлива = 0 при timer = 0 не буташ изхода и , ако имаш друга променлива = 1, при timer = 0 - сетваш изхода и в 1, като стане timer = 1 клирваш изхода и в 0. и т.н. до 9. Ако имаш поменлива = 10 - сетваш я при timer = 0 и не я клирваш. Това всичко е примерно разбира се просто начин за който се сещам. Смятам, че ще имаш достатъчно време да вършиш и други неща през това време когато не си в прекъсване. На колко микросекунди и колко стъпки вече е твое решение. |
|
| Автор: | stanleyhacker [ Пон Яну 21, 2008 5:15 pm ] |
| Заглавие: | |
Чакай да сложа и един пример за променлива = 5: Влизаш в прекъсването и се окаже че timer = 0 - сетваш изхода на тая променлива. Влизаш пак и timer = 1, 2, 3, 4, - нищо не правиш с тоя изход, може пак да сетнеш, ако кода стане по-четлив и компактен. Влизаш - timera станал 5, тогава нулираш изхода. Пак ще влезеш, но timer е вече 6, 7, 8, 9 - нищо не правиш или пак нулираш. ТАка проверка за всеки от 8-те извода. При следващо прекъсване ще си с timer = 0 и всичко отначало. |
|
| Автор: | Реконструктор [ Пон Яну 21, 2008 5:41 pm ] |
| Заглавие: | |
Честотата нужно ли е да се променя или е константна? |
|
| Автор: | stanleyhacker [ Пон Яну 21, 2008 5:48 pm ] |
| Заглавие: | |
Честотата по принцип е най-добре да е възможно най- висока за да не се виждат трептения. От друга страна обаче ще има загуби в управляващите ключове (транзистори). Но тъй-като пикчето е бавна машинка не смятам да се притесняваме за загубите |
|
| Автор: | Zeus [ Пон Яну 21, 2008 5:57 pm ] |
| Заглавие: | |
Благодаря на всички. Вече започнах да правя нещо подобно на това, което казвате с таймер 1. За сега го правя за 1 пин, после лесно ще стане за 8. Честотата няма да я изменям. Предполагам и 100 херца ще ми свърши работа, щом ще управлявам лампи/светодиоди без да се усеща трептене. Сега ще прегледам основно всички съвети, за да си помогна на работата. |
|
| Автор: | stanleyhacker [ Пон Яну 21, 2008 6:06 pm ] |
| Заглавие: | |
100 Hz са малко за светодиоди |
|
| Автор: | Zeus [ Пон Яну 21, 2008 7:21 pm ] | ||
| Заглавие: | |||
Това успях да сглобя набързо ШИМ си работи добре, като го гледам на осцилоскопа. Обаче честотата ми се струва, че е доста по ниска от очакваната - по мои изчисления период - 28us, а на осцилоскопа периода ми излиза около 9-10 ms. Къде бъркам?
|
|||
| Автор: | JoroS [ Пон Яну 21, 2008 8:35 pm ] |
| Заглавие: | |
Светодиодите са бързи. Ако в зоната на осветителните тела ще има въртящи се части, не забравяй стробоскопичния ефект |
|
| Автор: | bobyk [ Пон Яну 21, 2008 9:11 pm ] |
| Заглавие: | |
Сетвай таймера още щом влезеш в прекъсването щото иначе към периода добаваш и закъснението в прекъсването (сметките, а при 8 шим-а май ще е доста). Като гледам има на къде да увеличаваш честотата така че няма проблем. А относно това че диодите са бързи, то окото е достатъчно бавно, би трябвало и 100Hz да стигат, макар че повече е по-добре, ама над килохерц няма смисъл. |
|
| Автор: | the_electronic_m@n [ Пон Яну 21, 2008 9:22 pm ] |
| Заглавие: | |
При по висока честота ще постигнеш по голям интензитет на светлината излъчена от светодиодите. От опита ми с RGB контролерите съм достигнал до извода, че 800-1000Hz е оптимален вариант интензитет/загуби. |
|
| Автор: | Zeus [ Вто Яну 22, 2008 12:46 am ] |
| Заглавие: | |
Няма да има движение на светодиодите. ШИМ-а ще го напасвам визуално. И все пак, не можах да схвана от къде ми дойде тази огромна разлика между изчисления и получения период на сигнала. Ще взема да пробвам при тези настройки да превключвам един порт без да ползвам прекъсване, да видя каква честота ще ми изкара. Да не би нещо да идва от това, че ползвам вътрешния осцилатор или пък нещо съм объркал при конфигурирането. Но това май ще е утре. |
|
| Автор: | stanleyhacker [ Сря Яну 23, 2008 1:46 pm ] |
| Заглавие: | |
y и z са с едни и същи стойности - обедини ги в една променлива. нулират се по едно и също време и се инкрементират по едно и също време. Генерратора сигурно наистина не е инициализиран, за да има такава разлика във времената. Иначе за 28us период не съм сигуремн , че C-то ще се справи да провери всичките 8 променливи на PWMa. Или на асемблер, или малко по -бавна честота на ШИМа, или малко по-висока на генеаратора - с кварц. Както винаги ще трябват компромиси. |
|
| Страница 1 от 2 | Часовете са според зоната UTC + 2 часа [ DST ] |
| Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group http://www.phpbb.com/ |
|