|
Виж темите без отговор | Виж активните теми
Дата и час: Вто Юли 28, 2026 6:04 am
Реализиране на софтуерен PWM
| Автор |
Съобщение |
|
Zeus
Ранг: Почетен член
Регистриран на: Вто Окт 03, 2006 11:58 am Мнения: 924 Местоположение: Ботевград
|
 Реализиране на софтуерен PWM
Досега съм имал нужда само от един такъв модул и съм ползвал вградения. Сега ми трябват 8 бр., които да работят независимо. Няма изисквания за поддържане на постоянна честота и форма на сигнала. Трябва ми да регулирам независимо плавната подсветка на 8 осветителни тела. Ще използвам 16Ф88. Тепърва ще си изграждам методиката и ще се радвам на всякакви съвети. (Може би не е сложно за реализация, но като не съм се занимавал до сега, ще ми отнеме време)
|
| Пон Яну 21, 2008 4:05 pm |
|
 |
|
ToHu
Ранг: Форумен бог
Регистриран на: Нед Сеп 26, 2004 9:21 pm Мнения: 30686 Местоположение: София
|
Ами щом не е толкова критично ....8 синхрони ШИМ, примерно таймер се прекъсва на всеки 100 мкс, Имаш 16 променливи, по 2 на ШИМ, това са стойноста на всеки шим, при влизане в прекъсване от таймер аинкрементваш едната и я сравняваш с другата. Когато се изравнят сваляш изхода з съответния ШИМ. Като достигнеш някакева максимална стойност, да речем 100, нулираш променливите които се инкрементват, и вдигаш изходите на всички ШИМ-ве. Друг вариант който моцже да спедсти инструкции, в зависимост от процесора е да не сравняваш, а да намаляваш към 0, применро при пик това е по ефективно като код. Като достигнеш 0, сваляш изхода, достигнеш ли зададената от теб стойност сетваш про,менливите с зелания коефициент на запълване. Вече от тук нататък могат да с ползват всякакви разновидности, зависи какво имаш като софтуер и хардуер, какво може да позлваш ...
|
| Пон Яну 21, 2008 4:54 pm |
|
 |
|
MYXATA
Ранг: Форумен бог
Регистриран на: Пон Юни 05, 2006 1:48 pm Мнения: 4906 Местоположение: където небето среща земята, ракията е Jameson, а бирата Guinness
|
елегантното/малко скъпо решение е :
http://www.nxp.com/acrobat_download/dat ... 9551_7.pdf
иначе може с изместващ регистър с дискретни елементи или реализиран на евтино CPLD 
_________________ ... ако трети ден не ти се работи... това означава, че е сряда !
|
| Пон Яну 21, 2008 4:55 pm |
|
 |
|
stanleyhacker
Ранг: Новодошъл
Регистриран на: Чет Дек 02, 2004 7:22 pm Мнения: 140
|
Ако например периаода ти е 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 и не я клирваш.
Това всичко е примерно разбира се просто начин за който се сещам. Смятам, че ще имаш достатъчно време да вършиш и други неща през това време когато не си в прекъсване. На колко микросекунди и колко стъпки вече е твое решение.
|
| Пон Яну 21, 2008 5:02 pm |
|
 |
|
stanleyhacker
Ранг: Новодошъл
Регистриран на: Чет Дек 02, 2004 7:22 pm Мнения: 140
|
Чакай да сложа и един пример за променлива = 5:
Влизаш в прекъсването и се окаже че timer = 0 - сетваш изхода на тая променлива.
Влизаш пак и timer = 1, 2, 3, 4, - нищо не правиш с тоя изход, може пак да сетнеш, ако кода стане по-четлив и компактен.
Влизаш - timera станал 5, тогава нулираш изхода.
Пак ще влезеш, но timer е вече 6, 7, 8, 9 - нищо не правиш или пак нулираш.
ТАка проверка за всеки от 8-те извода. При следващо прекъсване ще си с timer = 0 и всичко отначало.
|
| Пон Яну 21, 2008 5:15 pm |
|
 |
|
Реконструктор
Ранг: Форумен бог
Регистриран на: Съб Сеп 25, 2004 12:32 pm Мнения: 8382 Местоположение: София
|
Честотата нужно ли е да се променя или е константна?
|
| Пон Яну 21, 2008 5:41 pm |
|
 |
|
stanleyhacker
Ранг: Новодошъл
Регистриран на: Чет Дек 02, 2004 7:22 pm Мнения: 140
|
Честотата по принцип е най-добре да е възможно най- висока за да не се виждат трептения. От друга страна обаче ще има загуби в управляващите ключове (транзистори). Но тъй-като пикчето е бавна машинка не смятам да се притесняваме за загубите 
|
| Пон Яну 21, 2008 5:48 pm |
|
 |
|
Zeus
Ранг: Почетен член
Регистриран на: Вто Окт 03, 2006 11:58 am Мнения: 924 Местоположение: Ботевград
|
Благодаря на всички. Вече започнах да правя нещо подобно на това, което казвате с таймер 1. За сега го правя за 1 пин, после лесно ще стане за 8. Честотата няма да я изменям. Предполагам и 100 херца ще ми свърши работа, щом ще управлявам лампи/светодиоди без да се усеща трептене. Сега ще прегледам основно всички съвети, за да си помогна на работата.
|
| Пон Яну 21, 2008 5:57 pm |
|
 |
|
stanleyhacker
Ранг: Новодошъл
Регистриран на: Чет Дек 02, 2004 7:22 pm Мнения: 140
|
100 Hz са малко за светодиоди
|
| Пон Яну 21, 2008 6:06 pm |
|
 |
|
Zeus
Ранг: Почетен член
Регистриран на: Вто Окт 03, 2006 11:58 am Мнения: 924 Местоположение: Ботевград
|
Това успях да сглобя набързо
ШИМ си работи добре, като го гледам на осцилоскопа. Обаче честотата ми се струва, че е доста по ниска от очакваната - по мои изчисления период - 28us, а на осцилоскопа периода ми излиза около 9-10 ms. Къде бъркам?
|
| Пон Яну 21, 2008 7:21 pm |
|
 |
|
JoroS
Ранг: Популярен
Регистриран на: Съб Юли 09, 2005 12:49 pm Мнения: 306 Местоположение: София
|
Светодиодите са бързи. Ако в зоната на осветителните тела ще има въртящи се части, не забравяй стробоскопичния ефект 
|
| Пон Яну 21, 2008 8:35 pm |
|
 |
|
bobyk
Ранг: Ориентиран
Регистриран на: Пон Яну 09, 2006 11:32 am Мнения: 276 Местоположение: Kozloduy
|
Сетвай таймера още щом влезеш в прекъсването щото иначе към периода добаваш и закъснението в прекъсването (сметките, а при 8 шим-а май ще е доста). Като гледам има на къде да увеличаваш честотата така че няма проблем.
А относно това че диодите са бързи, то окото е достатъчно бавно, би трябвало и 100Hz да стигат, макар че повече е по-добре, ама над килохерц няма смисъл.
|
| Пон Яну 21, 2008 9:11 pm |
|
 |
|
the_electronic_m@n
Ранг: Минаващ
Регистриран на: Пет Окт 05, 2007 8:34 pm Мнения: 76 Местоположение: Русе
|
При по висока честота ще постигнеш по голям интензитет на светлината излъчена от светодиодите. От опита ми с RGB контролерите съм достигнал до извода, че 800-1000Hz е оптимален вариант интензитет/загуби.
|
| Пон Яну 21, 2008 9:22 pm |
|
 |
|
Zeus
Ранг: Почетен член
Регистриран на: Вто Окт 03, 2006 11:58 am Мнения: 924 Местоположение: Ботевград
|
Няма да има движение на светодиодите. ШИМ-а ще го напасвам визуално. И все пак, не можах да схвана от къде ми дойде тази огромна разлика между изчисления и получения период на сигнала. Ще взема да пробвам при тези настройки да превключвам един порт без да ползвам прекъсване, да видя каква честота ще ми изкара. Да не би нещо да идва от това, че ползвам вътрешния осцилатор или пък нещо съм объркал при конфигурирането. Но това май ще е утре. 
|
| Вто Яну 22, 2008 12:46 am |
|
 |
|
stanleyhacker
Ранг: Новодошъл
Регистриран на: Чет Дек 02, 2004 7:22 pm Мнения: 140
|
y и z са с едни и същи стойности - обедини ги в една променлива. нулират се по едно и също време и се инкрементират по едно и също време. Генерратора сигурно наистина не е инициализиран, за да има такава разлика във времената. Иначе за 28us период не съм сигуремн , че C-то ще се справи да провери всичките 8 променливи на PWMa. Или на асемблер, или малко по -бавна честота на ШИМа, или малко по-висока на генеаратора - с кварц.
Както винаги ще трябват компромиси. 
|
| Сря Яну 23, 2008 1:46 pm |
|
|
Кой е на линия |
Потребители разглеждащи този форум: 0 регистрирани и 2 госта |
|
Вие не можете да пускате нови теми Вие не можете да отговаряте на теми Вие не можете да променяте собственото си мнение Вие не можете да изтривате собствените си мнения Вие не можете да прикачвате файл
|
|