K

PWM ile Dimmmer Nasıl Yapılır.

Başlatan kurtelektronik, 15 Ekim 2011, 10:41:40

Mucit23

Aynen hocam devir değişti. Sac nüveli Trafolar bu tip uygulamalarda çok ağır ve hantal kalıyor.
Bir ulusu yok etmenin En iyi yolu o ulusun dilini yok etmektir.

www.arectron.com/

KAZIMUGUR


mustafa48

PWM ile ilgili bende ETE hocama sormak isterim. PWM kullanırken genelde
T2CON =%00000101  '00=1/1 , 01=1/4  , 10=1/16 bölücü kullanıyorsunuz.
HPWM kullanmak daha kolay değilmi.

Mesala

PORTA=0:PORTB=0
trisa=0
trisb=%00010001 'IKI BUTON



@ DEVICE PIC16F628
@ DEVICE PIC16F628,WDT_ON
@ DEVICE PIC16F628,PWRT_ON
@ DEVICE PIC16F628,PROTECT_OFF
@ DEVICE PIC16F628,MCLR_ON
@ DEVICE PIC16F628,XT_OSC

DEFINE OSC 20
DEFINE CCP1_REG PORTB
DEFINE CCP1_BIT3
DEFINE HPWM1_TIMER 2
CMCON=7
'----------- DEĞİŞKENLER ----------
DUT VAR BYTE 55
SYMBOL TUSY=PORTB.0
symbol TUSA=PORTB.4

CLEAR
'------ EPROM AYARLARI------------
READ 0,DUT
IF DUT=255 THEN
DUT=1
WRITE 0,DUT
PAUSE 50
endIF
PAUSE 200
'----------------------------------------------

BASLA :

    READ 0,DUT
    GOSUB YOL
     
    IF TUSA=0 AND TUSY=0 THEN GOTO BASLA
    IF TUSA=0 THEN GOSUB AS
    IF TUSY=0 THEN GOSUB YUK

CLEARWDT
GOTO BASLA
END
 
YOL:
    HPWM 1,DUT,18000
    RETURN
YUK:
    WHILE TUSY=0
    dut=dut+1
    IF dut>254 THEN dut=254
    WRITE 0,DUT
    PAUSE 40
    GOSUB YOL
    WEND
    RETURN
AS:
    WHILE TUSA=0
    DUT=DUT-1
    IF DUT<1 THEN DUT=1
    WRITE 0,DUT
    pause 40
    GOSUB YOL
    WEND
    RETURN

Kodlar iki butonla dimmer yapar Elektrik kesintisinde son duty değerini
hafızasında saklar.Led uygulamaları için yapmıştım

ete

Cevabım çok kısa olacak. HPWM komutu 8 bitlik bir PWM imkanı sunar sana. Yani çözünürlüğün 0-255 arasındadır.
Bu şu demektir bir led in parlaklığını ancak 0-255 arasındaki değerlerde yani 256 kademede değiştirebilirsin.
Halbuki diğeri 10 bit çözünürlük sunar ve çözünürlüğün 0-1023 arasında değişir ve aynı ledi 1024 kademde sıfırdan parlak hale getirirsin. Bu göresl açıdan daha iyi bir imkan sağlar. Her zaman diğer alternatifleri bilmeyenler ellerindekinin en iyisi olduğunu düşünürler. Sende öyle yapmışsın.

Ete

mustafa48

Teşekkür ediyorum.Led uygulamalarında genelde 8 bit çözünürlük kişiye göre yetiyor ama 10 bit elbetteki daha iyi.
Hazır konu açılmışken malum 16f628 de 1 kanal PWM (CCP) var 16f737 de 3 kanal .Diyelim ki 10 kanal veya daha
fazla PWM lazım. Tek PIC ile 10 kanal PWM yapmak mümkünmüdür? YAda bunun başka yolu varmıdır.


ete

#20
Donanımsal olarak 10 adet PWM çıkışı olan pic varmıdır bilmiyorum araştırmadım. Ama yazılmla 10 adet PWM yapmak mümkün elbette. Nasıl olacağını adımlar halinde açıklayayım.
1. Öncelikle bir PWM frekansı tespit etmen gerekiyor. Diyelimki 200 Hz olsun.  Bu sinyalin peryodunu hesaplayalım 1000/200=5 ms olarak yada 5000 us olarak buluruz. Bu sayıyı 100 e bölersek %1 lik duty değerine denk gelen süreyi bulmuş oluruzki buda bizim kesme oluşturma süremiz olacaktır. Bu hesapta 5000/100=50 us olarak buluyoruz kesme süremizi.
2. Bu durumda her 50 us de bir kesme oluşturacak bir sistem kurmalıyız. TMR0 sayacını kullanarak ona bir önyükleme değeri vererek 50us sonra kesme oluşturacağız.
3. Programın ana çalışma bölümünde 10 adet çıkış pini belirledikten sonra herbiri için bir duty değişkeni ve bir ön değerde belirleyeceğiz. Duty0-Duty1...Duty9 şeklinde belirleyelim.
4. Başlangıçta bunlara 50 (%50) değerini verelim.
5. Başla satırından evvel bütün PWM çıkışlarını HIGH yapalım. Verdiğimiz değere bakılırsa 50 kesme sonunda hepsine konum değiştirmemiz gerekecektir.
6. Her bir duty değerinin birerde sayac değişkeni olmalıdır. PWM0, PWM1,...PWM9 gib. Bu %50 lik değerleri bu değişkenlere yerleştirisek sıfır oluncaya kadar onları kesme kısmında birer eksiltiriz. Böylece farklı duty değerine sahip olanlar farklı xamanlarda konum değiştirerek istediğini yakalamış olacaksın.
Örnek vermek gerekirse; Kesme oluştuğunda,
PWM0=PWM0-1
IF PWM0=0 then
   Cıkıs0=1-Cıkıs0
   PWM0=Duty0  '   LOW süresi için PWM0=100-Duty0
Endif
aynı şeyi diğer çıkışlar içinde yapman gerekir. Ancak 10 adet PWM çıkışı demek programın kesme etiketinde çok fazla oyalanması anlamına gelecektir. Bu neden bu tür program en azından 20 Mhz de çalıştırılmalıdır. Kesme süresi hesabıda ona göre yapılmalıdır.

Ete


mustafa48

Teşekkür ederim üstad. Akıllıca bir çözüm .Benim aklıma başka şeyler gelmişti.
Şöyleki bir kaç PIC kullanıp bunları seri haberleştirip bir master PIC üzerinden
Slave lere duty bilgilerini yollamak .Sanırım benim yöntem çok karışık ve pahalı olacak.

ete

Tabiiki ben tek pic kullanarak bunu yapmayı düşünmüştüm. Senin yöntemde 3 pic ile 9 sinyal elde etmek mümkün elbette.
Program açısından çok karmaşık olmaz. Usart kesmesi kullanılarak kolaylıkla halledilebilir.

Ete

mustafa48

Sağolun Hocam Kendimi bu konuda biraz daha geliştirmem lazım. Sizin dediğiniz yapıp tek PIC le çalışacağım.
Amacım işin detayını daha iyi öğrenmek. Ben timer kesmesini pek beceremem ama öğrenmek şart  oldu.

ete

TMR0 ve TMR1 kullanımı konusunda yazdığım kurs notları var. Sana yeter bu bilgi ilişiktedir.

Ete

mustafa48

Teşekkürler hocam 1 Ocak pazarı bu konuya ayırdım.

est32

Hocam diyelim ki ben televizyon kumandası ile bu şekilde çalışan bir devreyi kontrol etmek istedim, bu durumda bu kesmeler yüzünden pals kaçırma söz konusu olur mu?

İşte atmelin sevdiğim yanı burası,en basit çipinde bile en az 3 tane pwm donanımı var.Hatta 16f628 ayarındaki attiny2313'te bile 4 adet.
Kesmelerle boğuşmaya gerek kalmıyor.


ELZEMEFE

#28
Burdaki dimmer devresi ile ac motor hız kontrolü olabilirmi arkdaşlar.. fikri olan varmı ..

mustafa48


Powered by EzPortal