PWM ve TİTREŞİM

Başlatan bymrz, 01 Mart 2008, 22:43:04

bymrz

arkadaşlar pic ile led grubunu pwm ile sürerken frekans değeri 100 e yakında olsa hafiften gözü rahatsız edecek şekilde titreşimler oluyo..
Bu titreşimleri ledin tepkime hızını ve o andaki pwm parlaklığını etkilemeyecek şekilde nasıl bi çözüm bulabiliriz..(kondansatör, vs)  ???

Yardımlarınız için şimdiden teşekkürler

Erol YILMAZ

En basitinden  PWM frekansını artırabilirsiniz.

bymrz

hocam onu yapabilsem zaten sorun çözülecekte, işlemci birden çok iş yaptığı için yani aynı anda birden çok pwm işiyle meşgul oldugundan, frekansı daha fazla artıramıyorum. çıkabileceği maksimum seviyede çalışıyo zaten(osc=20Mhz zaten)..


????

bymrz

bi çözüm bulabilecek var mı arkadaşlar acaba    ;)

:)

osmanpasali

pwm modülünü kullanabilirsin...
Yumuşak huylu isem kim demiş uysal koyunum; kesilir belki ama çekmeye gelmez boynum. M.Akif ERSOY

bymrz

hocam bahsettiğim gibi pwm lerin sayısı 2 veya 3 değil. Toplam 12 tane... Sorun bu yani..O yüzden pwm modülüde yeterli olmuyor...

buiba

timer kesmesini de kurup istediginiz kadar pwm modulu olusturabilirsiniz.

bymrz

timer kesmesiyle de şu an yaptığımdan daha hızlı olamaz zaten.
Çünkü başka hiç bir işlem yaptırmadan 0-255 çözünürlüklü pwm oluşturuyorum ve bu 12 kanal.. yani 1 saykıl için 12x255 tane if then komutu kullanılıyo.

Yani işlemci frekansını artıramadan pwm frekansınıda artıramam şu an.sanırım 16f628de de 20 mhzden fazla kullanamıyoruz. Bu yüzden titreşimi önlemenin daha farklı bi yolu olabilir mi, onu öğrenmek istiyorum...

transistörün beyzine rc gibi bişeyler ekleyerek mesela???

tyildizak

Çözümü bulmuşsunuz, rc filtre olur fakat r ve c değerlerini frekansa göre doğru hesaplamak gerekir.

Kondansatör şarj süresi = 4 * R(KΩ)* C(µF)

Edit :süre = ms

picusta

Bu sefer de transistör isinmaz mi?
timer kesmesini 100*255 Hz'e kuracaksin. Kontrolü interrupt rutininde yapacaksin. 4MIPS/25,5KHz  = 156,xx
Interrupt rutinin 150 assembly komutunu geçmemesi lazim. bu sürede 12 kanal rahatlikla kontrol edilir.
Titresim interrupt kullanmadigindan da kaynaklanabilir, programinda baska neler yapiyorsun?
100Hz yüksek bir frekans, gözün görmemesi gerekir.

bymrz

hocam ben pic basic le yazıyorum o yüzden benim yazdığım kodlar zaten timer kesmesindeki süreye sığmıyor..

Asmde de çok iyi değilim, onda da yazdım fakat o da 250 komutu geçiyor gibi...

yani basicte bir kanal için basicte şöyle yapıyorum...

for softpwm=0 to 255

   if kanalpwm=<softpwm then
   low kanal1
   else
   high kanal2
   endif
.
.
.
.
.
.
.
next

Bu şekilde 12 tane kanalda pwm kontrolü yapıyorum. yani bu döngü içinde yukarıda ki if then komutundan 12 tane oluyor...

Bu arada bu komutu asmde en kısa nasıl yapabiliriz. Ben bu şekilde yapmıştım fakat fazla iyi olmadığımdan uzun olmuş olabilir


main
   bcf   PORTA,0
   movlw    h'00'
   movwf    sayac1
softpwm
   incf    sayac1,f

;///////////////////BİRİNCİ KANAL///////////////////////////////////////////   
   ;kanal1 pwm ayarlaması
   movf    sayac1,w
   subwf    kanal1,w
   btfsc   STATUS,0
   goto    $+2
   bcf       PORTB,3;eğer sayac1 redpwmden küçükse red:1
   movf    sayac1,w
   subwf    kanal1,w
   btfss   STATUS,0
   goto    $+2
   bsf          PORTB,3;eğer sayac1 redpwmden büyükeşitse red=0


   movlw   h'FF'
   subwf   sayac1,w
   btfss   STATUS,2
   goto    softpwm
   goto    main



asmde yaptığım da bu şekilde idi..

Fakat daha kısa şekilde yapılabiliyorsa yardımcı olursanız sevinirim...

bymrz

Alıntı yapılan: "tyildizak"Çözümü bulmuşsunuz, rc filtre olur fakat r ve c değerlerini frekansa göre doğru hesaplamak gerekir.

Kondansatör şarj süresi = 4 * R(KΩ)* C(µF)

Edit :süre = ms

hocam sizin olayıda bi deneyeyim..

picusta

ASM'de ben de iyi değilimdir.
Fakat kodunda  fazlalik oldugu kesin, testi iki kere yapiyorsun:
movf sayac1,w
subwf kanal1,w
btfsc STATUS,0
goto $+2
Duty basinda bütün portlari 1 yap, sonra test sonucu positif olunca söndürürsün.
Zamanlama için for döngüsünü kullanma, timer interrupt kullan.

buiba

subwf komutu yerine xorwf komutunu kulllanin pic her subwf komutunda 2 cevrim harcar.bir de kanal 1 ayarini programda goremedim.1 de kalma ve 0'da kalma sureleri esit değildir herhalde

bymrz

Alıntı yapılan: "picusta"ASM'de ben de iyi değilimdir.
Fakat kodunda  fazlalik oldugu kesin, testi iki kere yapiyorsun:
movf sayac1,w
subwf kanal1,w
btfsc STATUS,0
goto $+2
Duty basinda bütün portlari 1 yap, sonra test sonucu positif olunca söndürürsün.
Zamanlama için for döngüsünü kullanma, timer interrupt kullan.

hocam dediğin doğru, yani hepsini en başta 0 yada bir yapıp daha sora tek durumu kontrol etmek yani...o zaman baya kısalacak sanırım...
hemen bi deneyeyim :)