Отговори на тема  [ 12 мнения ] 
Промяна на f на PWM по време на работа? 
Автор Съобщение
Ранг: Ориентиран
Ранг: Ориентиран
Аватар

Регистриран на: Съб Фев 05, 2005 10:58 pm
Мнения: 284
Местоположение: Varna
Мнение Промяна на 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) с други стойности за честотата, но нещо не се получава. Или може директно да се променят стойностите по някакъв начин?

_________________
Господ прощава, тока не. А глада е по силен от тока !


Пет Дек 05, 2008 1:52 pm
Профил ICQ
Ранг: Форумен бог
Ранг: Форумен бог

Регистриран на: Чет Фев 01, 2007 4:04 am
Мнения: 1539
Мнение 
По време на работа директно си зареждай само PR2 и CCPR1L , модула си има буфери и промяната ще се появи в началото на следващия период. Не забравяй ,че запълването се пресмята за всяка честота отделно.


Пет Дек 05, 2008 3:25 pm
Профил
Ранг: Ориентиран
Ранг: Ориентиран
Аватар

Регистриран на: Съб Фев 05, 2005 10:58 pm
Мнения: 284
Местоположение: Varna
Мнение 
ji4ka написа:
По време на работа директно си зареждай само PR2 и CCPR1L

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

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

_________________
Господ прощава, тока не. А глада е по силен от тока !


Пет Дек 05, 2008 3:55 pm
Профил ICQ
Ранг: Форумен бог
Ранг: Форумен бог

Регистриран на: Чет Фев 01, 2007 4:04 am
Мнения: 1539
Мнение 
StiV написа:
[.... Ейййй, това банкиране ще ме побърка :o

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


Пет Дек 05, 2008 4:11 pm
Профил
Ранг: Ориентиран
Ранг: Ориентиран
Аватар

Регистриран на: Съб Фев 05, 2005 10:58 pm
Мнения: 284
Местоположение: Varna
Мнение 
Благодаря помощта и за линка - доста полезни неща има.
По тая логика, прав ли ще съм да си мисля, че може да се състави и някаква мелодия от няколко тона например, ако се променят по тоя начин стойностите?

_________________
Господ прощава, тока не. А глада е по силен от тока !


Пет Дек 05, 2008 5:29 pm
Профил ICQ
Ранг: Форумен бог
Ранг: Форумен бог
Аватар

Регистриран на: Пет Фев 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
Профил WWW
Ранг: Форумен бог
Ранг: Форумен бог

Регистриран на: Чет Фев 01, 2007 4:04 am
Мнения: 1539
Мнение 
StiV написа:
Благодаря помощта и за линка - доста полезни неща има.
По тая логика, прав ли ще съм да си мисля, че може да се състави и някаква мелодия от няколко тона например, ако се променят по тоя начин стойностите?

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


Съб Дек 06, 2008 2:18 am
Профил
Ранг: Форумен бог
Ранг: Форумен бог

Регистриран на: Чет Фев 01, 2007 4:04 am
Мнения: 1539
Мнение 
¶ написа:
...Пуснахме нова платка с друг процесор, там ще променя изцяло софтуера, т.е. ще изхвърля прекъсването на TMR0.

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


Съб Дек 06, 2008 2:36 am
Профил
Ранг: Форумен бог
Ранг: Форумен бог
Аватар

Регистриран на: Пет Фев 25, 2005 1:58 pm
Мнения: 4585
Местоположение: US
Мнение 
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 секунди.

_________________
Ето аз дишам, работя, живея и програми пиша тъй както умея, с проца под вежди се гледаме строго и боря се с него доколкото мога....


Съб Дек 06, 2008 4:04 am
Профил WWW
Ранг: Форумен бог
Ранг: Форумен бог

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


Нед Дек 07, 2008 12:34 am
Профил
Ранг: Форумен бог
Ранг: Форумен бог
Аватар

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


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

_________________
Ето аз дишам, работя, живея и програми пиша тъй както умея, с проца под вежди се гледаме строго и боря се с него доколкото мога....


Пон Дек 08, 2008 6:03 pm
Профил WWW
Ранг: Форумен бог
Ранг: Форумен бог

Регистриран на: Чет Фев 01, 2007 4:04 am
Мнения: 1539
Мнение 
¶ написа:
...При положение, че TMR2 работи, защо да се използва и втори таймер ?

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


Вто Дек 09, 2008 1:08 am
Профил
Покажи мненията от миналия:  Сортирай по  
Отговори на тема   [ 12 мнения ] 

Кой е на линия

Потребители разглеждащи този форум: 0 регистрирани и 2 госта


Вие не можете да пускате нови теми
Вие не можете да отговаряте на теми
Вие не можете да променяте собственото си мнение
Вие не можете да изтривате собствените си мнения
Вие не можете да прикачвате файл

Търсене:
Иди на:  
cron
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group.
Designed by ST Software for PTF.
Хостинг и Домейни