|
Виж темите без отговор | Виж активните теми
Дата и час: Вто Юли 28, 2026 9:35 am
|
Страница 1 от 1
|
[ 12 мнения ] |
|
Промяна на f на PWM по време на работа?
| Автор |
Съобщение |
|
StiV
Ранг: Ориентиран
Регистриран на: Съб Фев 05, 2005 10:58 pm Мнения: 284 Местоположение: Varna
|
 Промяна на f на PWM по време на работа?
Здравейте,
Налага ми се при промяна на един от пиновете на 16F628А да се промени честотата на PWM, сътветно коефициентана запълване да остане същия. При връщане в предното състояние на извода, да се възстанови и първоначалната честота.
За инициализация ползвам това и си работи:
Пробвах го като извиквам същата подпрограма (нова инициализация на PWM) с други стойности за честотата, но нещо не се получава. Или може директно да се променят стойностите по някакъв начин?
_________________ Господ прощава, тока не. А глада е по силен от тока !
|
| Пет Дек 05, 2008 1:52 pm |
|
 |
|
ji4ka
Ранг: Форумен бог
Регистриран на: Чет Фев 01, 2007 4:04 am Мнения: 1539
|
По време на работа директно си зареждай само PR2 и CCPR1L , модула си има буфери и промяната ще се появи в началото на следващия период. Не забравяй ,че запълването се пресмята за всяка честота отделно.
|
| Пет Дек 05, 2008 3:25 pm |
|
 |
|
StiV
Ранг: Ориентиран
Регистриран на: Съб Фев 05, 2005 10:58 pm Мнения: 284 Местоположение: Varna
|
Пробвах и това и не се получи, а едва сега се светвам защо не е станало. CCPR1L е в Банка0, а PR2 в Банка1 и съм забравил да ги превключа. Ейййй, това банкиране ще ме побърка
Да, това го имам в предвид. За точно изчисляване на честотата и периода ползвам една програмка PWM calculator, някой я беше пуснал тук преди време.
Сега четох един руски datasheet за ССР на 16F. Ta там са написали:
Здесь можно изменить период и длительности импульса ШИМ: bcf PIR1, TMR2IF
_________________ Господ прощава, тока не. А глада е по силен от тока !
|
| Пет Дек 05, 2008 3:55 pm |
|
 |
|
ji4ka
Ранг: Форумен бог
Регистриран на: Чет Фев 01, 2007 4:04 am Мнения: 1539
|
Не се коси, то целия свят се е побъркал от това банкиране, при тая финансова криза.  Иначе сметките може да си ги правиш и в програмата ако си сложиш някоя процедура за умножение, стига да има нужда. Потърси из нета, има доста готови, например тука: http://www.piclist.com/techref/microchip/routines.htm
|
| Пет Дек 05, 2008 4:11 pm |
|
 |
|
StiV
Ранг: Ориентиран
Регистриран на: Съб Фев 05, 2005 10:58 pm Мнения: 284 Местоположение: Varna
|
Благодаря помощта и за линка - доста полезни неща има.
По тая логика, прав ли ще съм да си мисля, че може да се състави и някаква мелодия от няколко тона например, ако се променят по тоя начин стойностите?
_________________ Господ прощава, тока не. А глада е по силен от тока !
|
| Пет Дек 05, 2008 5:29 pm |
|
 |
|
¶
Ранг: Форумен бог
Регистриран на: Пет Фев 25, 2005 1:58 pm Мнения: 4585 Местоположение: US
|
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.
_________________ Ето аз дишам, работя, живея и програми пиша тъй както умея, с проца под вежди се гледаме строго и боря се с него доколкото мога....
|
| Пет Дек 05, 2008 5:30 pm |
|
 |
|
ji4ka
Ранг: Форумен бог
Регистриран на: Чет Фев 01, 2007 4:04 am Мнения: 1539
|
К'во го мислиш , направо го пробвай и ще видиш (пардон -чуеш). Естествено ,че става.  Но то звук може и с ТМР0 да се прави, ПВМ-а и за по-фини неща става.
|
| Съб Дек 06, 2008 2:18 am |
|
 |
|
ji4ka
Ранг: Форумен бог
Регистриран на: Чет Фев 01, 2007 4:04 am Мнения: 1539
|
Има и друг вариант но е малко по-голям гърч. Проверяваш ТМР2 дали е близо до нулирване, ако да - изчакваш го в цикъл докато се нулира, ако не- презареждаш си спокойно. Мисля ,че 10-на инструкции стигаха да презаредиш.
А това дали първо презареждаш CCPR1L или двата бита ,мисля ,че няма значение , помисли пак - винаги само тия два бита са разликата. Просто в единия случай бъркаш старата стойност , а в другия новата за един период време, но грешката си е само в двата младши бита.
|
| Съб Дек 06, 2008 2:36 am |
|
 |
|
¶
Ранг: Форумен бог
Регистриран на: Пет Фев 25, 2005 1:58 pm Мнения: 4585 Местоположение: US
|
Е да, ама не, както казва Димитър Бочаров  Помисли го пак: примерно стара стойност 0x03FF, нова 0x30F, ако заредиш 1-во младшите 2 бита, ще заредиш 2 единици, в този момент те удря TMR2 == PR2, и за старша стойност ти остава 0xFF, а не новата 0xC3 , ако обаче направиш обратното, т.е. първо заредиш старшите битове и в този момент те удари TMR2 == PR2 ще имаш заредени вече новите 0xC3, а младшите 2 бита ще се мандахерцат и ще имаш минимална разлика. Затова казах, че ще преработя софтуера, така че прекъсването да е само по TMR2. Досега винаги така съм презареждал PWM, в такт с периода на PWM, а не асинхронно. Въпросния код така го наследих, дори в началото въобще не ми светна, че това може да е проблем, обаче като се натовари системата с 250А ток и това хълцане на PWM-а от време на време разклаща системата. Вярно, че когато PID закона е в "захват" новата и старата стойност практически са равни, но докато влезне в захват, в зависимост от константите, може да минат и 2-3 секунди.
_________________ Ето аз дишам, работя, живея и програми пиша тъй както умея, с проца под вежди се гледаме строго и боря се с него доколкото мога....
|
| Съб Дек 06, 2008 4:04 am |
|
 |
|
ji4ka
Ранг: Форумен бог
Регистриран на: Чет Фев 01, 2007 4:04 am Мнения: 1539
|
Ами просто имаш закъснение на новите данни с един период на ТМР2, но обикновено PWM-a управлява много по-бавни процеси и не би трябвало да е голям проблем. Но по принцип такива гличове в периферията не е желателно да ги има. Проблема ти се решава с 5 реда код преди зареждането, не ти трябва смяна на таймерите.
|
| Нед Дек 07, 2008 12:34 am |
|
 |
|
¶
Ранг: Форумен бог
Регистриран на: Пет Фев 25, 2005 1:58 pm Мнения: 4585 Местоположение: US
|
По принцип може и така, но най-елегантното и просто решение е синхронно зареждане на CCPR1L:CCP1CON<5:4>. При положение, че TMR2 работи, защо да се използва и втори таймер ?
_________________ Ето аз дишам, работя, живея и програми пиша тъй както умея, с проца под вежди се гледаме строго и боря се с него доколкото мога....
|
| Пон Дек 08, 2008 6:03 pm |
|
 |
|
ji4ka
Ранг: Форумен бог
Регистриран на: Чет Фев 01, 2007 4:04 am Мнения: 1539
|
За да не ръждясва.  Понякога не е удобно да се обвърза ПВМ-а с периода на системата - например прекъсване точно на 10мс или 1сек. и т.н, трудно се бута и честотата ако потрябва. Но щом като няма такива изисквания, синхронното си е най-добре.
|
| Вто Дек 09, 2008 1:08 am |
|
|
|
Страница 1 от 1
|
[ 12 мнения ] |
|
Кой е на линия |
Потребители разглеждащи този форум: 0 регистрирани и 2 госта |
|
Вие не можете да пускате нови теми Вие не можете да отговаряте на теми Вие не можете да променяте собственото си мнение Вие не можете да изтривате собствените си мнения Вие не можете да прикачвате файл
|
|