Отговори на тема  [ 25 мнения ]  Отиди на страница 1, 2  Следваща
PWM при PIC16F819 
Автор Съобщение
Ранг: Почетен член
Ранг: Почетен член

Регистриран на: Пет Яну 22, 2010 5:46 pm
Мнения: 680
Мнение 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

_________________
PIC SPBRG values calculator


Нед Юли 01, 2012 5:06 pm
Профил WWW
Ранг: Новодошъл
Ранг: Новодошъл

Регистриран на: Пон Апр 16, 2012 9:05 pm
Мнения: 182
Мнение Re: PWM при PIC16F819
За една зареждачка 10бит ШИМ не е ли излишен разкош??
Ако ще зареждаш с токове до 10А при 250нива са едни нищожни 40мА. 100Ач батерия няма и да усети разликата. А ти ще си улесниш живота.


Нед Юли 01, 2012 5:58 pm
Профил
Ранг: Форумен бог
Ранг: Форумен бог
Аватар

Регистриран на: Нед Юни 10, 2007 2:22 pm
Мнения: 6492
Местоположение: София
Мнение Re: PWM при PIC16F819
А бе той за улесняване ще намери начин да си улесни живота ама човекът пита
може ли като с истински процесор да напише 16 бита променлива наведнъж (или нещо
от рода) :D .

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

_________________
-------------------
www.tgi-sci.com
-------------------
http://www.flickr.com/photos/didi_tgi/


Нед Юли 01, 2012 6:24 pm
Профил WWW
Ранг: Новодошъл
Ранг: Новодошъл

Регистриран на: Пон Апр 16, 2012 9:05 pm
Мнения: 182
Мнение 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та мл бита после другите и си свиркай


Нед Юли 01, 2012 7:26 pm
Профил
Ранг: Форумен бог
Ранг: Форумен бог
Аватар

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


Нед Юли 01, 2012 7:36 pm
Профил ICQ
Ранг: Форумен бог
Ранг: Форумен бог
Аватар

Регистриран на: Нед Юни 10, 2007 2:22 pm
Мнения: 6492
Местоположение: София
Мнение Re: PWM при PIC16F819
Бе и 6840 беше таймер (дизайн 70-те) с 8 битова жица ама имаше как човек
да прочете/напише 16 бита без да му се превърти междувременно :D .

_________________
-------------------
www.tgi-sci.com
-------------------
http://www.flickr.com/photos/didi_tgi/


Нед Юли 01, 2012 7:51 pm
Профил WWW
Ранг: Форумен бог
Ранг: Форумен бог
Аватар

Регистриран на: Сря Апр 20, 2005 12:02 pm
Мнения: 9119
Местоположение: Разград
Мнение Re: PWM при PIC16F819
На таймерите има (на някой пик-ове). На разните по-така пвм-и също. Просто тоя пвм така е направен, че за да му се зададе запълването не става само с една инструкция. Той е 10 битов като 8 те старши бита се сравняват с таймера (който е 8 битов) а двата младши или с прескалер или ако няма с quarter clock на ядрото. И за да е пълен фън, двата младши са натикани в контрол регистъра на пвм-а. Сигурно са имали някаква причина да го направят толкова изчанчено.


Нед Юли 01, 2012 9:02 pm
Профил ICQ
Ранг: Форумен бог
Ранг: Форумен бог
Аватар

Регистриран на: Чет Фев 10, 2005 3:25 pm
Мнения: 5677
Местоположение: София
Мнение 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



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


Нед Юли 01, 2012 9:13 pm
Профил
Ранг: Форумен бог
Ранг: Форумен бог
Аватар

Регистриран на: Нед Юни 10, 2007 2:22 pm
Мнения: 6492
Местоположение: София
Мнение Re: PWM при PIC16F819
Cekins написа:
На таймерите има (на някой пик-ове). На разните по-така пвм-и също. Просто тоя пвм така е направен, че за да му се зададе запълването не става само с една инструкция. Той е 10 битов като 8 те старши бита се сравняват с таймера (който е 8 битов) а двата младши или с прескалер или ако няма с quarter clock на ядрото. И за да е пълен фън, двата младши са натикани в контрол регистъра на пвм-а. Сигурно са имали някаква причина да го направят толкова изчанчено.


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

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

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

_________________
-------------------
www.tgi-sci.com
-------------------
http://www.flickr.com/photos/didi_tgi/


Нед Юли 01, 2012 9:30 pm
Профил WWW
Ранг: Форумен бог
Ранг: Форумен бог
Аватар

Регистриран на: Сря Апр 20, 2005 12:02 pm
Мнения: 9119
Местоположение: Разград
Мнение Re: PWM при PIC16F819
Ами точно тоя пвм нито е кой знае колко бърз, нито с кой знае каква резолюция, още по-малко е предвиден да му се сменя запълването на всеки период. Въоще става само за по-простички неща на по-ниски честоти. Ако искаш "мега як, мега бърз, мега фин" пвм - това не е твоя чип.


Нед Юли 01, 2012 9:38 pm
Профил ICQ
Ранг: Новодошъл
Ранг: Новодошъл

Регистриран на: Пон Апр 16, 2012 9:05 pm
Мнения: 182
Мнение Re: PWM при PIC16F819
Cekins написа:
... Сигурно са имали някаква причина да го направят толкова изчанчено.

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


Нед Юли 01, 2012 11:28 pm
Профил
Ранг: Почетен член
Ранг: Почетен член

Регистриран на: Пет Яну 22, 2010 5:46 pm
Мнения: 680
Мнение 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.

_________________
PIC SPBRG values calculator


Пон Юли 02, 2012 2:58 pm
Профил WWW
Ранг: Форумен бог
Ранг: Форумен бог
Аватар

Регистриран на: Нед Юни 10, 2007 2:22 pm
Мнения: 6492
Местоположение: София
Мнение Re: PWM при PIC16F819
npelov написа:
... Варианта е както посочи Пушека да го сетвам в прекъсването на Timer 2. Това означава че корекцията винаги ще е с един цял период закъснение в повече - около 13 us ... май не е много за импулсно захранване/зарядно.
...


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

_________________
-------------------
www.tgi-sci.com
-------------------
http://www.flickr.com/photos/didi_tgi/


Пон Юли 02, 2012 3:53 pm
Профил WWW
Ранг: Новодошъл
Ранг: Новодошъл

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


Пон Юли 02, 2012 5:40 pm
Профил
Ранг: Форумен бог
Ранг: Форумен бог

Регистриран на: Вто Сеп 15, 2009 10:44 am
Мнения: 1034
Мнение Re: PWM при PIC16F819
Това предполагам го е съобразил. Само че му обясняваш как да смъкне честотата 4 пъти и да сложи 4 пъти по-голяма бобина, за да спести няколко инструкции в кода. Няма смисъл. Ъпдейт на двата регистъра в прекъсването на таймера е ОК.


Пон Юли 02, 2012 6:43 pm
Профил
Покажи мненията от миналия:  Сортирай по  
Отговори на тема   [ 25 мнения ]  Отиди на страница 1, 2  Следваща

Кой е на линия

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


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

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