| Микроконтролери и електроника http://mcu-bg.com/mcu_site/ |
|
| Промяна на f на PWM по време на работа? http://mcu-bg.com/mcu_site/viewtopic.php?f=7&t=6341 |
Страница 1 от 1 |
| Автор: | StiV [ Пет Дек 05, 2008 1:52 pm ] | |||||||||
| Заглавие: | Промяна на f на PWM по време на работа? | |||||||||
Здравейте, Налага ми се при промяна на един от пиновете на 16F628А да се промени честотата на PWM, сътветно коефициентана запълване да остане същия. При връщане в предното състояние на извода, да се възстанови и първоначалната честота. За инициализация ползвам това и си работи:
Пробвах го като извиквам същата подпрограма (нова инициализация на PWM) с други стойности за честотата, но нещо не се получава. Или може директно да се променят стойностите по някакъв начин? |
||||||||||
| Автор: | ji4ka [ Пет Дек 05, 2008 3:25 pm ] |
| Заглавие: | |
По време на работа директно си зареждай само PR2 и CCPR1L , модула си има буфери и промяната ще се появи в началото на следващия период. Не забравяй ,че запълването се пресмята за всяка честота отделно. |
|
| Автор: | StiV [ Пет Дек 05, 2008 3:55 pm ] | ||||||||||||||||||
| Заглавие: | |||||||||||||||||||
Пробвах и това и не се получи, а едва сега се светвам защо не е станало. CCPR1L е в Банка0, а PR2 в Банка1 и съм забравил да ги превключа. Ейййй, това банкиране ще ме побърка
Да, това го имам в предвид. За точно изчисляване на честотата и периода ползвам една програмка PWM calculator, някой я беше пуснал тук преди време. Сега четох един руски datasheet за ССР на 16F. Ta там са написали: Здесь можно изменить период и длительности импульса ШИМ: bcf PIR1, TMR2IF |
|||||||||||||||||||
| Автор: | ji4ka [ Пет Дек 05, 2008 4:11 pm ] | |||||||||
| Заглавие: | ||||||||||
Не се коси, то целия свят се е побъркал от това банкиране, при тая финансова криза. |
||||||||||
| Автор: | StiV [ Пет Дек 05, 2008 5:29 pm ] |
| Заглавие: | |
Благодаря помощта и за линка - доста полезни неща има. По тая логика, прав ли ще съм да си мисля, че може да се състави и някаква мелодия от няколко тона например, ако се променят по тоя начин стойностите? |
|
| Автор: | ¶ [ Пет Дек 05, 2008 5:30 pm ] |
| Заглавие: | |
PWM има една подробност, която често убягва на хората, CCPR1L:CCP1CON<5:4> се копира във буферните регистри на всяко съвпадение на TMR2 с PR2. Обаче CCPR1L:CCP1CON<5:4> са два регистъра, докато заредиш твоята променлива в тях, е възможно да съвпаднe TMR2 с PR2, тогава може CCPR1L да е презареден, а CCP1CON<5:4> да не е презареден, или обратното, тогава за един цикъл ще има разбалансиране на PWM от реално нужната ни стойност. Затова е хубаво да се използва като refresh rate TMR2, още повече че може да му се включва делителя от 1 до 16 цикъла. Това го забелязах на едни платки, извършващи PID регулиране, вместо TMR2 използваха TMR0 за да генерират прекъсване, след което в главната програма презареждаха CCPR1L:CCP1CON<5:4>. И тъй като периода на TMR0 не беше кратен на периода на TMR2, то на определен брой цикли на TMR2 се получава неправилно презареждане. Ефекта не се забелязва лесно, но при натоварване на системата, от време на време PID закона прави "отскоци", които на симулатора не се получават. Засега преработих само програмата, като 1-во презареждам CCPR1L, а след това CCP1CON<5:4>, и да ги хване в процес на презареждане, поне старшите битове ще са ми вярни, 2-та младши могат и да се клатят. Пуснахме нова платка с друг процесор, там ще променя изцяло софтуера, т.е. ще изхвърля прекъсването на TMR0. |
|
| Автор: | ji4ka [ Съб Дек 06, 2008 2:18 am ] | |||||||||
| Заглавие: | ||||||||||
К'во го мислиш , направо го пробвай и ще видиш (пардон -чуеш). Естествено ,че става. |
||||||||||
| Автор: | ji4ka [ Съб Дек 06, 2008 2:36 am ] | |||||||||
| Заглавие: | ||||||||||
Има и друг вариант но е малко по-голям гърч. Проверяваш ТМР2 дали е близо до нулирване, ако да - изчакваш го в цикъл докато се нулира, ако не- презареждаш си спокойно. Мисля ,че 10-на инструкции стигаха да презаредиш. А това дали първо презареждаш CCPR1L или двата бита ,мисля ,че няма значение , помисли пак - винаги само тия два бита са разликата. Просто в единия случай бъркаш старата стойност , а в другия новата за един период време, но грешката си е само в двата младши бита. |
||||||||||
| Автор: | ¶ [ Съб Дек 06, 2008 4:04 am ] | ||||||||||||||||||
| Заглавие: | |||||||||||||||||||
Е да, ама не, както казва Димитър Бочаров |
|||||||||||||||||||
| Автор: | ji4ka [ Нед Дек 07, 2008 12:34 am ] |
| Заглавие: | |
Ами просто имаш закъснение на новите данни с един период на ТМР2, но обикновено PWM-a управлява много по-бавни процеси и не би трябвало да е голям проблем. Но по принцип такива гличове в периферията не е желателно да ги има. Проблема ти се решава с 5 реда код преди зареждането, не ти трябва смяна на таймерите. |
|
| Автор: | ¶ [ Пон Дек 08, 2008 6:03 pm ] | |||||||||
| Заглавие: | ||||||||||
По принцип може и така, но най-елегантното и просто решение е синхронно зареждане на CCPR1L:CCP1CON<5:4>. При положение, че TMR2 работи, защо да се използва и втори таймер ? |
||||||||||
| Автор: | ji4ka [ Вто Дек 09, 2008 1:08 am ] | |||||||||
| Заглавие: | ||||||||||
За да не ръждясва. |
||||||||||
| Страница 1 от 1 | Часовете са според зоната UTC + 2 часа [ DST ] |
| Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group http://www.phpbb.com/ |
|