Микроконтролери и електроника
http://mcu-bg.com/mcu_site/

PWM при PIC16F819
http://mcu-bg.com/mcu_site/viewtopic.php?f=3&t=10274
Страница 1 от 2

Автор:  npelov [ Нед Юли 01, 2012 5:06 pm ]
Заглавие:  PWM при PIC16F819

Става въпрос за задаване на duty cycle на PWM модула. Има ли начин да е сигурно, че ще се запише цялата стойност CCPR1L:CCP1CON<5:4> в буфера? Примерно ако реша да пиша CCPR1L и след това вата бита ще отнеме известно количество инструкции. Ако точно по средата тогава се latch-не стойността може да не се запише цялата в буфера. По принцип не е толкова проблемно но в случая е възможно да се коригира стойността на всеки импулс.

Един от вариантите е да се пише в CCPR1L:CCP1CON<5:4> при прекъсване на TIMER2. Това дава един период време за да запиша стойността (както и по-голямо закъснение)

Подробности:
Става въпрос за контрол на MOSFET в зарядно за акумулатор (тема: Constant Volgate+Constant Current SMPS по схемата на TGI)
Ползвам 8 бита за duty cycle. Щеше да е удобно CCP1CON<5:4> да съдържа старшите, а не младшите битове.
Fosc = 20 МХз
PR2 = 0x3F (78.12kHz)

Edit: ето кода с койт ще сетвам duty:

Код:
; вариант 1 - с временна променлива
setPwm
   banksel   CCP1CON
   rlf      CCP1CON, w
   andlw   0x1F
   movwf   temp
   rlf      temp, f

   rrf      pwm, f
   rrf      temp, f

   rrf      pwm, f
   rrf      temp, w
   movwf   CCP1CON
   movf   pwm, w
   andlw   0x3F
   movwf   CCPR1L
   
   return


; вариант 2 - без временна променлива
setPwm
   banksel   CCP1CON
   movlw   0x0F
   andwf   CCP1CON, f

   rrf      pwm, f
   skipz
   iorlw   0x10

   rrf      pwm, f
   skipz
   iorlw   0x20

   movf   pwm, w
   andlw   0x3F
   movwf   CCPR1L

   return

Автор:  Пушека [ Нед Юли 01, 2012 5:58 pm ]
Заглавие:  Re: PWM при PIC16F819

За една зареждачка 10бит ШИМ не е ли излишен разкош??
Ако ще зареждаш с токове до 10А при 250нива са едни нищожни 40мА. 100Ач батерия няма и да усети разликата. А ти ще си улесниш живота.

Автор:  tgi [ Нед Юли 01, 2012 6:24 pm ]
Заглавие:  Re: PWM при PIC16F819

А бе той за улесняване ще намери начин да си улесни живота ама човекът пита
може ли като с истински процесор да напише 16 бита променлива наведнъж (или нещо
от рода) :D .

Очевидно просто иска да разбере, не да реши конкретен проблем - аз не му
знам отговора, ама пикоборци тук колкото щеш, все някой ще знае.

Автор:  Пушека [ Нед Юли 01, 2012 7:26 pm ]
Заглавие:  Re: PWM при PIC16F819

Лачването на MSB+LSB става когато периодния таймер TMR2 съвпадне с записаното в PR2. Сиреч с всеки нов период.
"CCPR1L and CCP1CON<5:4> can be written to at any
time but the duty cycle value is not latched into
CCPR1H until after a match between PR2 and TMR2
occurs (i.e., the period is complete)." - стр70
Записа на двете е на 2 инструкции разтояние.
Пиши си спокойно първо 2та мл бита после другите и си свиркай

Автор:  Cekins [ Нед Юли 01, 2012 7:36 pm ]
Заглавие:  Re: PWM при PIC16F819

Ами той варианта за да няма ефекти е да се пише при PR2 match... @tgi сори ама е 8 битов процесора - няма как да се случи да се запише в една команда :) Всъщност имат и такива проблясъци ама не и в простите PWM-и... Иначе наистина ако нацелиш точно на момента на ъпдейта може и да не влезе заданието както трябва. При тази резолюция 2 бита са си нещо, ама пък при тая честота въоще няма да се усети - реално ще имаш само един грешен период, тъй като следващия вече ще си е добре.

Автор:  tgi [ Нед Юли 01, 2012 7:51 pm ]
Заглавие:  Re: PWM при PIC16F819

Бе и 6840 беше таймер (дизайн 70-те) с 8 битова жица ама имаше как човек
да прочете/напише 16 бита без да му се превърти междувременно :D .

Автор:  Cekins [ Нед Юли 01, 2012 9:02 pm ]
Заглавие:  Re: PWM при PIC16F819

На таймерите има (на някой пик-ове). На разните по-така пвм-и също. Просто тоя пвм така е направен, че за да му се зададе запълването не става само с една инструкция. Той е 10 битов като 8 те старши бита се сравняват с таймера (който е 8 битов) а двата младши или с прескалер или ако няма с quarter clock на ядрото. И за да е пълен фън, двата младши са натикани в контрол регистъра на пвм-а. Сигурно са имали някаква причина да го направят толкова изчанчено.

Автор:  Desert Leo [ Нед Юли 01, 2012 9:13 pm ]
Заглавие:  Re: PWM при PIC16F819

npelov написа:
Става въпрос за задаване на duty cycle на PWM модула. Има ли начин да е сигурно, че ще се запише цялата стойност CCPR1L:CCP1CON<5:4> в буфера? Примерно ако реша да пиша CCPR1L и след това вата бита ще отнеме известно количество инструкции. Ако точно по средата тогава се latch-не стойността може да не се запише цялата в буфера. По принцип не е толкова проблемно но в случая е възможно да се коригира стойността на всеки импулс.

Един от вариантите е да се пише в CCPR1L:CCP1CON<5:4> при прекъсване на TIMER2. Това дава един период време за да запиша стойността (както и по-голямо закъснение)

Подробности:
Става въпрос за контрол на MOSFET в зарядно за акумулатор (тема: Constant Volgate+Constant Current SMPS по схемата на TGI)
Ползвам 8 бита за duty cycle. Щеше да е удобно CCP1CON<5:4> да съдържа старшите, а не младшите битове.
Fosc = 20 МХз
PR2 = 0x3F (78.12kHz)

Edit: ето кода с койт ще сетвам duty:

Код:
; вариант 1 - с временна променлива
setPwm
   banksel   CCP1CON
   rlf      CCP1CON, w
   andlw   0x1F
   movwf   temp
   rlf      temp, f

   rrf      pwm, f
   rrf      temp, f

   rrf      pwm, f
   rrf      temp, w
   movwf   CCP1CON
   movf   pwm, w
   andlw   0x3F
   movwf   CCPR1L
   
   return


; вариант 2 - без временна променлива
setPwm
   banksel   CCP1CON
   movlw   0x0F
   andwf   CCP1CON, f

   rrf      pwm, f
   skipz
   iorlw   0x10

   rrf      pwm, f
   skipz
   iorlw   0x20

   movf   pwm, w
   andlw   0x3F
   movwf   CCPR1L

   return



Пелов, заеб...авай асемблера - време ти е... Вервай ми!

Автор:  tgi [ Нед Юли 01, 2012 9:30 pm ]
Заглавие:  Re: PWM при PIC16F819

Cekins написа:
На таймерите има (на някой пик-ове). На разните по-така пвм-и също. Просто тоя пвм така е направен, че за да му се зададе запълването не става само с една инструкция. Той е 10 битов като 8 те старши бита се сравняват с таймера (който е 8 битов) а двата младши или с прескалер или ако няма с quarter clock на ядрото. И за да е пълен фън, двата младши са натикани в контрол регистъра на пвм-а. Сигурно са имали някаква причина да го направят толкова изчанчено.


Ясно бе, майтапя се естествено. Причината им е била навярно, че са свивали къде каквото
може с някаква цел, то и така върши работа.

Лео, пик (и арм..) асемблерът е наистина кофти за употреба но за такива работи за каквито
става дума в момента е пъти по-подходящ от езици на ниво разговорник. То свестен
език е пъти по-подходящ за всички приложения де ама пик асемблерът не е такъв.

Успявал съм да свърша работа за минути на лайняв, непознат за мене (x86) асемблер
която човек (е, не особено грамотен) и се балтавеше дни.
А съм бил свидетел повече пъти отколкото мога да си спомня как и грамотни и неграмотни
губят дни в битка с разговорника за неща, които човек знаещ езика просто не го спират.
Та съветът ти не е особено практичен, ако и да повтаря набрало популярност клише :)

Автор:  Cekins [ Нед Юли 01, 2012 9:38 pm ]
Заглавие:  Re: PWM при PIC16F819

Ами точно тоя пвм нито е кой знае колко бърз, нито с кой знае каква резолюция, още по-малко е предвиден да му се сменя запълването на всеки период. Въоще става само за по-простички неща на по-ниски честоти. Ако искаш "мега як, мега бърз, мега фин" пвм - това не е твоя чип.

Автор:  Пушека [ Нед Юли 01, 2012 11:28 pm ]
Заглавие:  Re: PWM при PIC16F819

Cekins написа:
... Сигурно са имали някаква причина да го направят толкова изчанчено.

Евтин ПИК, но с 10бит ШИМ. Е леко неизползваем :). Те добре знаят, че малко мазохисти ще го ползват, като 10битов. Но пък рекламата се върти с пълна сила и рибетата кълват...

Автор:  npelov [ Пон Юли 02, 2012 2:58 pm ]
Заглавие:  Re: PWM при PIC16F819

Първо да кажа на тези дето са се объркали (Пушека) - ползването на ШИМ-а с 8 бита не решава проблема с писането на две места защото ... ами освен ако не е 2 битов шим все се пише на две места. Аз ползвам 8 бита защото реших че 10 бита резолюция не си заслужава усложнението в случая, а и честота под 50 кХз няма да се отрази добре на размерите на дросела. Май е въпрос на лош дизайн от микрочип. Ако бяха сложили старшите битове - никъв проблем няма.
Второ (cekins) писането е 4 инструкции, като 1 може да се премести малко по-нагоре:
movwf CCP1CON
movf pwm, w
andlw 0x3F
movwf CCPR1L
Аз също си мисля че един период с леко грешно запълване (2 бита грешка) няма да е кой знае какъв проблем ако не се случва често. Все пак ме дразни. Варианта е както посочи Пушека да го сетвам в прекъсването на Timer 2. Това означава че корекцията винаги ще е с един цял период закъснение в повече - около 13 us ... май не е много за импулсно захранване/зарядно.

Desert Leo ... Правя го, но само ако е нещо по-голямо. Обикновено пак миксирам C с малко функции на Асемблер. За PIC16 обаче е доста по-трудно да пишеш и на двете. Пък и това е мериш АЦП -> сетваш ПВМ. Не е кой знае колко сложно че да го опростявам със С.

И пак казвам да се ползва като 10 битов и 8 битов е еднакво сложно откъм писане в PWM.

Автор:  tgi [ Пон Юли 02, 2012 3:53 pm ]
Заглавие:  Re: PWM при PIC16F819

npelov написа:
... Варианта е както посочи Пушека да го сетвам в прекъсването на Timer 2. Това означава че корекцията винаги ще е с един цял период закъснение в повече - около 13 us ... май не е много за импулсно захранване/зарядно.
...


А, това ще ти свърши работата идеално, не му се чуди. Доколкото разбирам тоя таймер 2
е цъкарката за периода на PWM-а; ако пишеш асинхронно пак ще имаш един период
закъснение максимум (което ще се случва понякога), така ще е винаги толкова и
нещата може дори да станат малко по-подредени откъм стабилност и т.н. То и АДЦ-то
едва ли прави много по-бързо едно преобразуване та не виждам проблем идващ от
тая посока.

Автор:  Пушека [ Пон Юли 02, 2012 5:40 pm ]
Заглавие:  Re: PWM при PIC16F819

Пелов, нещо си се помешал с тоя ШИМ. :)
Колкото и да ти е странно, че младшите 2байта са отделени, за да ги ползваш с ТМР2 който е 8 битов ти трябва и прескелера(или си ползва четвъртинките от клока). Ама върху тях нямаш физически достъп. Иначе няма как периода да е 8 битов а импулса да е 10 битов. Просто си играй само с 8те бита MSB. Не се вкарвай във филми сам. Младшите 2 бита ги забравяш. Сетваш ги еднократно в 0 и си имаш един прекрасен 8бит ШИМ. На практика става така, че имаш 2 мл. бита и в таймера и в регистъра за съвпадение. Но не те интересуват. Те си се въртят, но ти чакаш съвпадение в старшите 8бита а младшите когато станат. И понеже си задал някаква стойност еднократно, съвпадение се получава винаги на една и съща стойност. Таймера го сетвай, когато си искаш. Той ще възприеме новата стойност, когато се извърти поредния цикъл. За това са турили 2 регистъра - господар и роб. Всъщност Таймера се сетва еднократно, освен ако не искаш да местиш и честотата на ШИМа. Тъй че турни го на 255 в началото и после само си ръчкай по CCPR1L. За да нямаш грижа да следиш дали периода ти е по къс от импулса.
Загледай в ПДФа има едни таблици и обяснения как се конфигурира. Верно е объркващо малко..
Ако не ти се вярва, МПЛАБ си има чудесен симулатор цъкаш си стъпка по стъпка гледаш си регистрите и ще видиш че става с едно сетване само на MSB.

Автор:  741 [ Пон Юли 02, 2012 6:43 pm ]
Заглавие:  Re: PWM при PIC16F819

Това предполагам го е съобразил. Само че му обясняваш как да смъкне честотата 4 пъти и да сложи 4 пъти по-голяма бобина, за да спести няколко инструкции в кода. Няма смисъл. Ъпдейт на двата регистъра в прекъсването на таймера е ОК.

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