Микроконтролери и електроника
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, сътветно коефициентана запълване да остане същия. При връщане в предното състояние на извода, да се възстанови и първоначалната честота.
За инициализация ползвам това и си работи:

Цитат:
InitCCP1 clrf CCP1CON
clrf TMR2
bsf STATUS,RP0
movlw 0x58 ; 700Hz
movwf PR2
bcf STATUS,RP0
movlw 0x9 ; 10%
movwf CCPR1L
bsf STATUS,RP0
movlw B'11110001'
movwf TRISB
clrf PIE1
bcf STATUS,RP0
clrf PIR1
movlw 0x2C
movwf CCP1CON
movlw 0x6
movwf T2CON
return

Пробвах го като извиквам същата подпрограма (нова инициализация на PWM) с други стойности за честотата, но нещо не се получава. Или може директно да се променят стойностите по някакъв начин?

Автор:  ji4ka [ Пет Дек 05, 2008 3:25 pm ]
Заглавие: 

По време на работа директно си зареждай само PR2 и CCPR1L , модула си има буфери и промяната ще се появи в началото на следващия период. Не забравяй ,че запълването се пресмята за всяка честота отделно.

Автор:  StiV [ Пет Дек 05, 2008 3:55 pm ]
Заглавие: 

ji4ka написа:
По време на работа директно си зареждай само PR2 и CCPR1L

Пробвах и това и не се получи, а едва сега се светвам защо не е станало. CCPR1L е в Банка0, а PR2 в Банка1 и съм забравил да ги превключа. Ейййй, това банкиране ще ме побърка :o
ji4ka написа:
Не забравяй ,че запълването се пресмята за всяка честота отделно.

Да, това го имам в предвид. За точно изчисляване на честотата и периода ползвам една програмка PWM calculator, някой я беше пуснал тук преди време.
Сега четох един руски datasheet за ССР на 16F. Ta там са написали:
Здесь можно изменить период и длительности импульса ШИМ:
bcf PIR1, TMR2IF

Автор:  ji4ka [ Пет Дек 05, 2008 4:11 pm ]
Заглавие: 

StiV написа:
[.... Ейййй, това банкиране ще ме побърка :o

Не се коси, то целия свят се е побъркал от това банкиране, при тая финансова криза. :D Иначе сметките може да си ги правиш и в програмата ако си сложиш някоя процедура за умножение, стига да има нужда. Потърси из нета, има доста готови, например тука: http://www.piclist.com/techref/microchip/routines.htm

Автор:  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 ]
Заглавие: 

StiV написа:
Благодаря помощта и за линка - доста полезни неща има.
По тая логика, прав ли ще съм да си мисля, че може да се състави и някаква мелодия от няколко тона например, ако се променят по тоя начин стойностите?

К'во го мислиш , направо го пробвай и ще видиш (пардон -чуеш). Естествено ,че става. :wink: Но то звук може и с ТМР0 да се прави, ПВМ-а и за по-фини неща става.

Автор:  ji4ka [ Съб Дек 06, 2008 2:36 am ]
Заглавие: 

¶ написа:
...Пуснахме нова платка с друг процесор, там ще променя изцяло софтуера, т.е. ще изхвърля прекъсването на TMR0.

Има и друг вариант но е малко по-голям гърч. Проверяваш ТМР2 дали е близо до нулирване, ако да - изчакваш го в цикъл докато се нулира, ако не- презареждаш си спокойно. Мисля ,че 10-на инструкции стигаха да презаредиш.
А това дали първо презареждаш CCPR1L или двата бита ,мисля ,че няма значение , помисли пак - винаги само тия два бита са разликата. Просто в единия случай бъркаш старата стойност , а в другия новата за един период време, но грешката си е само в двата младши бита.

Автор:  [ Съб Дек 06, 2008 4:04 am ]
Заглавие: 

ji4ka написа:
¶ написа:
...Пуснахме нова платка с друг процесор, там ще променя изцяло софтуера, т.е. ще изхвърля прекъсването на TMR0.

Има и друг вариант но е малко по-голям гърч. Проверяваш ТМР2 дали е близо до нулирване, ако да - изчакваш го в цикъл докато се нулира, ако не- презареждаш си спокойно. Мисля ,че 10-на инструкции стигаха да презаредиш.
А това дали първо презареждаш CCPR1L или двата бита ,мисля ,че няма значение , помисли пак - винаги само тия два бита са разликата. Просто в единия случай бъркаш старата стойност , а в другия новата за един период време, но грешката си е само в двата младши бита.


Е да, ама не, както казва Димитър Бочаров ;-) Помисли го пак: примерно стара стойност 0x03FF, нова 0x30F, ако заредиш 1-во младшите 2 бита, ще заредиш 2 единици, в този момент те удря TMR2 == PR2, и за старша стойност ти остава 0xFF, а не новата 0xC3 , ако обаче направиш обратното, т.е. първо заредиш старшите битове и в този момент те удари TMR2 == PR2 ще имаш заредени вече новите 0xC3, а младшите 2 бита ще се мандахерцат и ще имаш минимална разлика. Затова казах, че ще преработя софтуера, така че прекъсването да е само по TMR2. Досега винаги така съм презареждал PWM, в такт с периода на PWM, а не асинхронно. Въпросния код така го наследих, дори в началото въобще не ми светна, че това може да е проблем, обаче като се натовари системата с 250А ток и това хълцане на PWM-а от време на време разклаща системата. Вярно, че когато PID закона е в "захват" новата и старата стойност практически са равни, но докато влезне в захват, в зависимост от константите, може да минат и 2-3 секунди.

Автор:  ji4ka [ Нед Дек 07, 2008 12:34 am ]
Заглавие: 

Ами просто имаш закъснение на новите данни с един период на ТМР2, но обикновено PWM-a управлява много по-бавни процеси и не би трябвало да е голям проблем. Но по принцип такива гличове в периферията не е желателно да ги има. Проблема ти се решава с 5 реда код преди зареждането, не ти трябва смяна на таймерите.

Автор:  [ Пон Дек 08, 2008 6:03 pm ]
Заглавие: 

ji4ka написа:
Ами просто имаш закъснение на новите данни с един период на ТМР2, но обикновено PWM-a управлява много по-бавни процеси и не би трябвало да е голям проблем. Но по принцип такива гличове в периферията не е желателно да ги има. Проблема ти се решава с 5 реда код преди зареждането, не ти трябва смяна на таймерите.


По принцип може и така, но най-елегантното и просто решение е синхронно зареждане на CCPR1L:CCP1CON<5:4>. При положение, че TMR2 работи, защо да се използва и втори таймер ?

Автор:  ji4ka [ Вто Дек 09, 2008 1:08 am ]
Заглавие: 

¶ написа:
...При положение, че TMR2 работи, защо да се използва и втори таймер ?

За да не ръждясва. :) Понякога не е удобно да се обвърза ПВМ-а с периода на системата - например прекъсване точно на 10мс или 1сек. и т.н, трудно се бута и честотата ако потрябва. Но щом като няма такива изисквания, синхронното си е най-добре.

Страница 1 от 1 Часовете са според зоната UTC + 2 часа [ DST ]
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group
http://www.phpbb.com/