12f675 de 2 kanal pwm olurmu olur

Başlatan Tarik konca, 26 Ağustos 2023, 14:08:26

Tarik konca

12f675 de 2 kanal pwm olurmu olur

12f675 pwm meselesi

yazinin sonunda bitmis proje var fakat vaktiniz varsa yazinin hepsini okuyun adim adim anlattim

ilerki projelerinizde aklinizda degisik dusunceler olusmasina yardimci olur

projem icin 2 tane analog input 2 tane pwm unitesi lazim oldu yer sikintisi var

elimdeki malzemelere baktim en uygunu 16f877 40 ayak dip kilif aradigim ozellikler var fakat hem cok buyuk

hemde yapacagim ise gore cok fazla ozellikleri var yani yazik olur internetten baksam bir seyler bulunur

eminim hem para harcamak olur hemde gerek yok elimdeki malzemeleri degerlendirmek istiyorum 12f675 de adc input var

fakat pwm unitesi yok yoksa yaparim dedim dusunmeye basladim pwm icin farkli metodlar var bastan baslayalim

sadece dongu kullanarak yapmak:

mevzu basit analog inputtan oku okudugun deger kadar ilgili pini high da beklet high suresini toplam degerden

cik ve low suresi olutur low suresi kadar ilgili pini low da beklet bunu sureklilik haline getir oldu bitti iyi guzelde

12f675 dahili 4 mhz osilator kullanacagim proteusda bir deneyim dedim pwm frekansi bir kanal kullandigim

halde 48 hz cikti yani benim proje icin dusuk deger siz isinize yararsa kullanabilirsiniz sorun yok

adc okuma isini interrupt rutininde yaptirdim sadece

ayni duzeni 2 kanal olarak duzenlerseniz frekans dahada dusecektir birde arada baska isler yapamayacaksiniz

manuel pwm program:

program pwm
dim degerbir as word
dim sayac as word
dim pwmdeger as word

sub procedure interrupt
pir1.6=0
lo(degerbir)=adresl
hi(degerbir)=adresh
adcon0.1=1
end sub

main:
cmcon=7        'comparator bit
adcon0.adfm=1  'saga sola yasla
adcon0.vcfg=0  'referans bit
adcon0.chs0=0  'kanal sec kanal sifir
adcon0.chs1=0  'kanal sec kanal sifir
'adcon0.1  adc start bit  1 olursa baslar  0 olduysa bitmis
adcon0.adon=1  'adc modul baslat

ansel.4=1
ansel.5=1
ansel.6=0

ansel.0=1
ansel.1=0
ansel.2=0
ansel.3=0

trisio.0=1
trisio.1=0
gpio.1=0
intcon=%11000000
pie1=%01000000
adcon0.1=1

basla:

pwmdeger=degerbir

for sayac=0 to pwmdeger step 1
gpio.1=1
next sayac

for sayac=pwmdeger to 1023 step 1
gpio.1=0
next sayac

goto basla

end.



konusmasi kolay atip tutuyordum soyle program yazarim boyle program yazarim diye al sana is dedim

12f675 de iki tane timer unitesi var timer0 ve timer1 pwm olusturmada sayma islemini bunlara yaptirirsam

pwm frekansini yukseltirim hesaplarini yaptim kafamda bu is de pic basic ve proton basic e hic bulasmadim

sonradan basim agrimasin diye direk mikro basic le basladim interrupt islerinde daha az sorun cikariyor

ugrassam pic basicle veya proton basicle bir seyler yaparim fakat onceki tecrubelerimden basimi fazla agritmayim

dedim en guzel cozum fazla bas agritmayan gereksinimlerin tamamini karsilayan en ekonomik cozum olmali

ilk once timer0 denemeler yaptim oldu pottan okunan degere gore pwm degerini set ediyor pwm isi timer0 ile

interrupt olusturularak yapiliyor yani siz baska isler yapabilirsiniz o kendi halinde calisiyor sizinle bir ilgisi

yok belki programda kullandiginiz delay surelerini biraz sasirtir o kadar

timer0 ile 1 kanal pwm program:


program Timer0_Interrupt
dim deger as byte

sub procedure interrupt() iv 0x0004 ics ICS_AUTO
intcon.7=0
intcon.5=0
INTCON.TMR0IF = 0 '; // clear the flag

if gpio.1=1 then
gpio.1=0
tmr0=deger
goto cik
end if

gpio.1=1
tmr0=255-deger
' gpio.1= not  gpio.1
cik:
intcon.7=1
intcon.5=1
end sub

main:
trisio = %00000001
ansel.0=1
ansel.1=0
ansel.2=0
ansel.3=0
gpio=0
cmcon=7
adcon0=%00000011
option_reg=%10001000
intcon=%10100000
gpio.1=1

 while (TRUE)
  while (adcon0.1=1)
  wend
  deger=adresh
  adcon0.1=1

  wend
end.




bu tamam simdi timer1 ile yapiyim dedim buda tamam sorun yok


timer1 ile 1 kanal pwm program:

program Timer0_Interrupt
dim deger as byte
dim deger2 as word

sub procedure interrupt() iv 0x0004 ics ICS_AUTO
intcon.7=0
intcon.6=0
PIR1.TMR1IF = 0            ' clear TMR1IF
T1CON = %00000000

if gpio.1=1 then
gpio.1=0
tmr1l=deger
goto cik
end if

gpio.1=1
tmr1l=255-deger

cik:
tmr1h=255
intcon.7=1
intcon.6=1
T1CON = %00000001
end sub

main:
trisio = %00000001
ansel.0=1
ansel.1=0
ansel.2=0
ansel.3=0
gpio=0
cmcon=7
adcon0=%00000011
'option_reg=%10001000
'intcon=%10100000
intcon.7=1
intcon.6=1
T1CON = %00000001
PIR1.TMR1IF = 0            ' clear TMR1IF                  ' Timer1 settings
PIE1.TMR1IE  = 1           ' enable Timer1 interrupt
gpio.1=1
'INTCON = 0xC0              ' Set GIE, PEIE
 while (TRUE)
  while (adcon0.1=1)
  wend
  deger=adresh
  'deger2=deger*4
  adcon0.1=1

  wend
end.




ikisini bir araya getirmek lazim buda tamam


timer0 ve timer1 ile 2 kanal pwm program:


program Timer0_Interrupt
dim pwm0_duty ,pwm1_duty ,pwm2_duty ,tmr0_duty,tmr0_tmp ,tmr1_duty,tmr1_tmp ,tmr2_duty ,tmr2_tmp,adc_sec,adc_sayac as byte

sub procedure interrupt() iv 0x0004 ics ICS_AUTO
 if  intcon.Tmr0IF=1 then
  intcon.TMR0IF=0
  intcon.tmr0ie=0
   if gpio.1=1 then
     tmr0_tmp=tmr0_duty
   end if
   if gpio.1=0 then
     tmr0_tmp=255-tmr0_duty
     tmr0_duty=pwm0_duty
   end if
   gpio.1=not gpio.1
   tmr0=tmr0_tmp
    intcon.tmr0ie=1
end if

 if  PIR1.TMR1IF =1 then
     PIR1.TMR1IF = 0
     pie1.tmr1ie=0
   if gpio.2=1 then
     tmr1_tmp=tmr1_duty
   end if
   if gpio.2=0 then
     tmr1_tmp=255-tmr1_duty
     tmr1_duty=pwm1_duty
   end if
   gpio.2=not gpio.2
   tmr1h=255
   tmr1l=tmr1_tmp
   pie1.tmr1ie=1
end if

end sub

main:
trisio = %00010001
ansel.0=1
ansel.1=0
ansel.2=0
ansel.3=1
gpio=0
cmcon=7
adcon0=%00000011
option_reg=%00001000
intcon=%11100000
T1CON = %00000001
PIR1.TMR1IF = 0
PIE1.TMR1IE  = 1
gpio.1=1
gpio.2=1
adc_sec=0

while (adcon0.1=1)
wend

 while (TRUE)
 if adc_sec=0 then
   tmr0_duty=adresh
  adcon0.2=1
  adcon0.3=1
  end if
  
 if adc_sec=1 then
   tmr1_duty=adresh
  adcon0.2=0
  adcon0.3=0
  end if
  
adc_sec=adc_sec+1
 
 if adc_sec=2 then
 adc_sec=0
 end if
 
while (adcon0.1=1)
wend
adcon0.1=1

wend
end.



pwm dergerleri tam hesaplamadim fakat yuzde 5 ile yuzde 95 arasinda set ediliyor galiba interrupt daki islemler

sirasinda olusan gecikmeden dolayi benim icin sorun yok fakat sizin isinizi bozarsa minimum yuzde 5 icin

pottan okunan deger su de degerden azsa pwmi kapat yapabilirsiniz

iki tane analog input ve iki tane pwm cikisi gereksinimi oldugu icin dahili 4 mhz osilator kullandim

bu yuzden pwm frekanslari su sekilde olustu siz daha yuksek pwm frekansi isterseniz 20 mhz kristal

kullanin fakat bu sefer iki tane pin kaybedeceksiniz sizin tercihinize kalmis

pwm ferekanslari:

manuel pwm 4mhz dahili osilator programi icin 48 hz

manuel pwm 20mhz harici osilator programi icin 240 hz

timer0 ile 1 kanal pwm 4mhz dahili osilator programi icin  3350 hz

timer0 ile 1 kanal pwm 20mhz harici osilator programi icin  16750 hz

timer1 ile 1 kanal pwm 4mhz dahili osilator programi icin  3200 hz

timer1 ile 1 kanal pwm 20mhz harici osilator programi icin  16000 hz

timer0 ve timer1 ile 2 kanal 4mhz dahili osilator pwm programi icin  2900 hz

timer0 ve timer1 ile 2 kanal 20mhz harici osilator pwm programi icin bir deger yazmadim cunku

12f675 de 2 tane pini kristale gidince hem 2 kanal adc hem de 2 kanal pwm kullanma imkani kalmiyor

sanki zor birsey yapmis ve ilk defa bir bulus yapmis gibi cok konustum o kadar olur eminim ki internette konu ile

ilgili degisik bir suru calisma vardir bir tane de benden olsun

dosyalar ekde mikrobasic proteus dosyalari :


Tek Care Format C:

mehmet

#1
12F1822 ile donanımsal pwm kullanılabilir.

Tek timer kesmesi içinde halledilebilir aslında.
Çok kritik bir iş değilse pwm çözünürlüğü 5-bite
kadar düşürülebilir. Böylece frekans yükselir.

PIC12F675 ile öyle bir şey de yapılabilir:
https://youtu.be/xKvefCC6CXY
Olan olmuştur,
olacak olan da olmuştur.
Olacak bir şey yoktur.
http://www.mehmetbilgi.net.tr

ete

BAM ve onun devamı olan MIBAM teknolojisini belki duydunu belki duymadınız.
Bilmeyenler için kısaca anlatayım.
BAM=Bit Angle Modulation şeklinde açıklaması olan teknolojide 0-255 arasındaki sayıların bit değerlerine ve bitlerin 2 li sistemdeki yerine bağlı olarak PWM çıkışının aktif pasif yapılmasına dayanan bir teknolojidir. Örnek vermek gerekir ise;
%10011 şeklindeki 5 bitlik bir sayıyı esas alırsak ve PWM frekansını 100 Hz kabul edersek;
sağdan sola doğru bitlerin durumlarına bağlı PWM sinyali şu şekilde oluşturulur.
öncelikle
0 nolu bit=1 olduğundan 1 x 39us süre ile çıkış ON yapılır
1 nolu bit=1 olduğundan 2 x 39us=78us süre ile çıkış ON (HIGH) yapılır.
2 nolu bit=0 olduğundan 4 x 39us=156us süre ile çıkış OFF (LOW) yapılır.
3 nolu bit=0 olduğundan 8 x 39us=312us süre ile çıkış OFF yapılır
4 nolu bit=1 olduğundan 16 x 39us=624us süre ile çıkış ON yapılır.
Bu BAM teknolojisinin temelini teşkil ediyor. Bu sistem iyi çalışmasına rağmen gözün algılayabileceği titremelere sebep olduğu söylenmektedir. Bunun üzerine ilgili sayı ters çevrilerek ilk sayıya eklenerek (ayna görüntüsü alınmış oluyor bu nedenle MIRROR IMAGE deniliyor) ve bu sisteme göre çıkış ayarlandığında titreşim falan kalmıyor.
Sonuçta %10011-11001 şeklinde bir çıkış düzenlemesi yapılıyor.

Mibam ın avantajı 100 Hz lik sinyal üzerinden açıklamak gerekir ise PWM sinyali oluşturmak için 1 sn yede 25600 kesme üretilmesi gerekir iken MIBAM da bu sayı yanlızca 800 olmaktadır. Bu nedenle çok kaliteli bir sinyal oluşturulması mümkün olmaktadır.
Dahada önemlisi çok sayıda çıkışa bu sistemi aynı anda uygulamak mümkün olabilmektedir.

Konuya 12F675 açısından bakacak olursak 8 bacaktan 2 si besleme ve biriside MCLR bacağı olmak üzere 3 bacağı kullanamayız ama geriye kalan bütün bacaklardan istenilen şekilde bir PWM sinyali alınması mümkün olmaktadır. Tireşimsiz kaliteli, bir PWM sinyali.
Bir çok projede kullandım bu teknolojiyi. Elbette her zaman donanımsal PWM sinyalini tercih ederim Kullanılması kolay olduğu ve frekans konusunda geniş imkanlar sunduğu için. Ama çok sayıda PWM sinyali gerektiğinde MIBAM'ı mutlaka kullanırım.
C dilinde çalışan BAM örnekleri bulabilirsiniz araştırın. Ama MIBAM konusunda bir uygulama bulabilirmisiniz bilemiyorum. Darrel Taylor'un bir eseridir ve ne yazıkki kendisi rahmetli oldu. Gerekli linkleri aşağıda veriyorum merak edenler araştırabilir.
https://www.picbasic.co.uk/forum/showthread.php/10564-MIBAM-(Mirror-Imaged-Bit-Angle-Modulation)
http://www.artisticlicence.com/app%20notes/appnote011.pdf<!-- BitAngleModulation.pdf

Ete


elektro77

Alıntı yapılan: ete - 27 Ağustos 2023, 21:26:04BAM ve onun devamı olan MIBAM teknolojisini belki duydunu belki duymadınız.
Bilmeyenler için kısaca anlatayım.
BAM=Bit Angle Modulation şeklinde açıklaması olan teknolojide 0-255 arasındaki sayıların bit değerlerine ve bitlerin 2 li sistemdeki yerine bağlı olarak PWM çıkışının aktif pasif yapılmasına dayanan bir teknolojidir. Örnek vermek gerekir ise;
%10011 şeklindeki 5 bitlik bir sayıyı esas alırsak ve PWM frekansını 100 Hz kabul edersek;
sağdan sola doğru bitlerin durumlarına bağlı PWM sinyali şu şekilde oluşturulur.
öncelikle
0 nolu bit=1 olduğundan 1 x 39us süre ile çıkış ON yapılır
1 nolu bit=1 olduğundan 2 x 39us=78us süre ile çıkış ON (HIGH) yapılır.
2 nolu bit=0 olduğundan 4 x 39us=156us süre ile çıkış OFF (LOW) yapılır.
3 nolu bit=0 olduğundan 8 x 39us=312us süre ile çıkış OFF yapılır
4 nolu bit=1 olduğundan 16 x 39us=624us süre ile çıkış ON yapılır.
Bu BAM teknolojisinin temelini teşkil ediyor. Bu sistem iyi çalışmasına rağmen gözün algılayabileceği titremelere sebep olduğu söylenmektedir. Bunun üzerine ilgili sayı ters çevrilerek ilk sayıya eklenerek (ayna görüntüsü alınmış oluyor bu nedenle MIRROR IMAGE deniliyor) ve bu sisteme göre çıkış ayarlandığında titreşim falan kalmıyor.
Sonuçta %10011-11001 şeklinde bir çıkış düzenlemesi yapılıyor.

Mibam ın avantajı 100 Hz lik sinyal üzerinden açıklamak gerekir ise PWM sinyali oluşturmak için 1 sn yede 25600 kesme üretilmesi gerekir iken MIBAM da bu sayı yanlızca 800 olmaktadır. Bu nedenle çok kaliteli bir sinyal oluşturulması mümkün olmaktadır.
Dahada önemlisi çok sayıda çıkışa bu sistemi aynı anda uygulamak mümkün olabilmektedir.

Konuya 12F675 açısından bakacak olursak 8 bacaktan 2 si besleme ve biriside MCLR bacağı olmak üzere 3 bacağı kullanamayız ama geriye kalan bütün bacaklardan istenilen şekilde bir PWM sinyali alınması mümkün olmaktadır. Tireşimsiz kaliteli, bir PWM sinyali.
Bir çok projede kullandım bu teknolojiyi. Elbette her zaman donanımsal PWM sinyalini tercih ederim Kullanılması kolay olduğu ve frekans konusunda geniş imkanlar sunduğu için. Ama çok sayıda PWM sinyali gerektiğinde MIBAM'ı mutlaka kullanırım.
C dilinde çalışan BAM örnekleri bulabilirsiniz araştırın. Ama MIBAM konusunda bir uygulama bulabilirmisiniz bilemiyorum. Darrel Taylor'un bir eseridir ve ne yazıkki kendisi rahmetli oldu. Gerekli linkleri aşağıda veriyorum merak edenler araştırabilir.
https://www.picbasic.co.uk/forum/showthread.php/10564-MIBAM-(Mirror-Imaged-Bit-Angle-Modulation)
http://www.artisticlicence.com/app%20notes/appnote011.pdf<!-- BitAngleModulation.pdf

Ete


Türkiye'nin Darrel Taylor'ı da sizsiniz Hocam. Bir mibam örneği verir misiniz?
"Eğer bir konuyu öğrenmek istiyorsan o konunun öğretmeni ol; daha iyi öğrenmek istiyorsan o konuda bir kitap yaz; daha da iyi öğrenmek istiyorsan yazdığın kitabi oku"

ete

Mibam ile kullanılacak PWM çıkış pini adedi işlemci frekansı ile doğru orantılıdır.
4 Mhz frekans da 4 adet çıkış kullanabilirsiniz. Fazlası için frekansı artırmak gerekiyor.
20 Mhz de 20 adet pin kullanılabiliyor.
İlişikte bir Mibam örneği verdim.
12F675 işlemcide 4 adet çıkış pinine Mibam özelliği vererek PWM uyguladım.
Bu örnekte her pine aynı döngü içinde değer verdiğim için hepsi aynı sinyali çıkartıyor.
Ama her pin bağımsız değer alabilir. Birisi 0 dan 255 e doğru giderken diğeri 255 den sıfıra doğru gidebilir. Yada bir diğeri farklı bir değerden başlayabilir.
Unutmayın programda MIBAM include file olrak programın başında yer almaktadır. Bu nedenle derlerken MIBAM isimli dosyanın aynı klasörde yer almasına özen gösterin.
Kullanımı basit ;
EN başta işlemciye has özel sistem değişkenleri tanımlanıyor. Bunu standart tanımlamanız gerekiyor.
genel standart aşağıdaki şekilde. 18F serisi için bu tanımlama gerekmiyor kullanırsanız hata verir derleme esnasında.
;____[ For 12F/16F only - Interrupt Context save locations]_________________
wsave       var byte    $20     SYSTEM  ' location for W if in bank0
;wsave       var byte    $70     SYSTEM  ' Alternate save location for W 
                                        ' if using $70, comment out wsave1-3
' --- IF any of these next three lines cause an error ?? -------------------
'       Comment them out to fix the problem ----
' -- The chip being used determines which variables are needed -------------
wsave1      VAR BYTE    $A0     SYSTEM      ' location for W if in bank1
wsave2      VAR BYTE    $120    SYSTEM      ' location for W if in bank2
wsave3      VAR BYTE    $1A0    SYSTEM      ' location for W if in bank3
'---DO NOT change these-----------------------------------------------------
ssave       VAR BYTE    BANK0   SYSTEM      ' location for STATUS register
psave       VAR BYTE    BANK0   SYSTEM      ' location for PCLATH register
Şayet derleme esnasında herhangi biri hata verir ise o satırı çıkartın.


BAM_COUNT CON 4  isimli değişken ile kaç adet BAM pini kullanılacak onu belirliyorsunuz. Ben 4 adet kullandığım için buradaki değer 4 oldu.

Diğer önemli tanımlama aşağıdaki şekilde yapılıyor,
ASM
BAM_LIST  macro                     ; Define PIN's to use for BAM
   BAM_PIN (GPIO,0, LED0)
   BAM_PIN (GPIO,1, LED1)
   BAM_PIN (GPIO,2, LED2) 
   BAM_PIN (GPIO,4, LED3)  
  endm
  BAM_INIT  BAM_LIST                ; Initialize the Pins
ENDASM
Burada Bam_pini olarak tanımlanan pinlerin önce hangi port pini olduğunu (örnek PORTA,0 gibi) daha sonrada o pine ne isim verildiğini belirliyorsunuz. Burada dikkat edilecek şey kaç tane pin tanımlamış iseniz hepsi burada yer almalı ne eksik ne fazla. ayırmalar virgül ile yapılıyor bunada dikkat edin.

Bu aşamdan sonrası son derece basit pin adını vererek ona 0-255 aralığında bir değer vermeniz yeterli. İster döngü ile bunu yavaş yavaş yapın ister birden verin farketmiyor. Verdiğiniz şekle göre oda size sonuç verir.

Ete

Powered by EzPortal