Haberler:

Eposta uyarılarını yanıtlamayınız ( ! ) https://bit.ly/2J7yi0d

Ana Menü

PWM Başlangıcı

Başlatan felix_eray, 09 Ocak 2017, 23:38:59

felix_eray

Merhaba arkadaşlar. 3 faz bir invertör tasarımı yapmaya çalışıyorum fakat kafamda bazı sorulara cevap bulamadım.
3 kanal pwm veren bir mikroçipe mikroc ile pwm oluşturuyorum (H köprü için 6 çıkış alıyorum). spwm falan hepsi tamam ama şu soruya cevap bulamadım.
Bu 3 kanalın pwm in frekansı da aynı o tamam. Aşağıda gösterdiğim her 0 haliyle sıfır, her 1 de %10 duty olsun. 1. sıra 1.pwm, 2. 2 ve 3. de 3. ve 3 lü h köprü üzerinden mos çıkışları için polaritesi de sonlarında belirttiğim gibi.

1111111100 +
1111100000 -
0000011100 -

burda 100 volt giriş olduğunu düşünürsek 1. çıkıştan %80 duty ile 80 volt, 2. çıkıştan 80 voltun 50 voltunu karşılayacak hareket ve asıl mesele 3. çıkıştan kalan 30 voltun geçişi.
burada şekilden de anlaşılacağı üzere 3. pwm in başlama noktasını değiştirebilmem gerekiyor. böyle birşey mümkünmüdür?

Eğer 3. pwm i de normal verirsek istediğimizi alamıyoruz.

Örneğin

1111111100 +
1111100000 -
1110000000 -

Burada 1. pwm %80 veriyor fakat negatif karşılık olarak en uzun nokta olan 2. pwm de ki % 50 lik kısım oluyor. Haliyle pwm oranı %80 değil %50 oluyor ve istediğimizi alamıyoruz.

Yani yıldız bağlantıda 1. kablodan 80 volt geçecek, 2. kablodan 50, 3. den 30 volt çıkacak. Tasarım yapmaya çalışan arkadalar açısından da çözülmesi elzem bir sorun sanırım.

felix_eray

Yokmu bu konuyla ufak bi fikri olan arkadaş?

OG

#2
MCU nun böyle bir kabiliyeti varsa olur, datalara dalmak gerek, yapanı hiç duymadım.

microchip pwm phase shift
diye arayınca,

http://ww1.microchip.com/downloads/en/DeviceDoc/70270C.pdf
FORUMU İLGİLENDİREN KONULARA ÖM İLE CEVAP VERİLMEZ.

Zoroaster

#3
PWM sinyallerini faz farklı hale getirip kullanma ihtiyacı nadiren doğar.

Bu da ancak özel donanım yoksa, her bir pwm sinyalini aynı frekansta koşan farklı timerlarla üretmeyi gerektirir.
Bu durumda timerlara aynı zamanda değil farklı zamanlarda start verilir.

Siz muhtemelen 50Hz gibi bir sinyal üreteceksiniz.

Eğer öyle ise pwm frekansını atıyorum 10..40 Khz seçip bunlara sinyal modüle edeceksiniz. Modüle eden sinyalin fazını kaydırdığınızda  3 fazlı pwm sinyallerin neden olacağı sinyalin de fazı kaymış olur.

3 fazlı sinyallerle uğraşacaksanız center align pwm + space vektor modulasyonu konusunu araştırın.
Seytan deliginden kacti.

apsis

#4
Ben fırçasız motorlar için 18F2431 kullandım ve önerebilirim. PWM ayarlarını yaptıkta sonra faz farkını OVDCON registersi ile ayarlayabilirsin. Bunun için kullanacağın frekansa göre bir timer kurup OVDCON ile uyartımları değiştirebilirsin bence. Bu söylediklerim güç katını tasarlıdığınızı varsayarak söylüyorum ve sadece basit bir şekilde 3 fazlı çıkış üretmek için fikir verdim sadece. Aşağıdaki link 3 fazlı AC indüksiyon  motoru için ugulama notları ve ASM de kodlar mevcut. Sizin yapacağınız da benzer mantıkta. Ama siz sabit genlik ve frekans kullanacağınız için( böyle olduğunu varsayarak) dökümandaki bu kısımlar ile aklınız kurcalamanıza gerek yoktur.
http://www.microchip.com/wwwAppNotes/AppNotes.aspx?appnote=en020394
"Makineye Beyin" MEKATRONİK

felix_eray

Arkadaşlar yorumlarınız için teşekkürler. center align pwm ve space vektor pwm i araştırdım ve araştırmaya devam ediyorum. Bu işlerde yeniyim ama hedefim büyük. Mikroişlemci ve c işine gireli anca 1 ay olmuştur ama istediğim pwm şeklini alabiliyorum bunda sıkıntı yok. Tek faz inverter için çok kaliteli spwm üretme noktasını geçtim. 3 fazlı sistemlerde 3 faz sinüs eğrisinde U fazı pozitif maksimumda iken diğer iki faz negatif ve max ı karşılayan oranda oluyor. 380 v için 440v dc den pwm almak için 255 çözünürlüğe göre 380x255/440 tan yaklaşık 220 yapar, yani % 86 pwm yapar. Bu  U+ için. Buna negatif %86 karşılık olmalı ki 380 alabilelim. Bu da W için %43, V için %43 olmalı. Yani U kanalından 380 pozitif geçerken W kanalından 190v, V kanalından 190V geçer.
Normal pwm için desen şu şekilde;
1111111100 +
1111000000 -
1111000000 - . Şekilden de görüldüğü gibi ilk fazda %80 pwm olmasına rağmen %40 karşılık gördüğünden esas olarak %40 pwm olur.

Center alligin için;
011111110 +
000111100 -
000111100 - gibi bir desen oluşacak ve yine %40 pwm oluşacak.

İstediğim desen;
1111111100 +
1111000000 -
0000111100 -. Görüldüğü üzere %80 karşılık olduğundan tam randımanlı çalışacak. Diğerleri de çalışır fakat randımanı düşer.

Bahsettiğim sistemi aslında kafamda kuruyorum fakat hem uygulamaya aktarma noktasında eksiğim var hemde çok yüksek frekanslı bir sistem oluyor. Geçişler kesmeler falan muazzam hızlı oluyor. Birde komiktir variable bir sistem kurmak istiyorum. Komik dememin sebebi ise yorum yapan arkadaşların variableye ihtimal vermemişler.
Esasen bir elektrikli araç için (asenkron motor) inverter tasarlamak istiyorum, öğrendiklerimi ve öğreneceklerimi de paylaşıp konuyla ilgilenen arkadaşlara yol gösterici olmak istiyorum. Ticari bir amacım yok, zaten ziraat mühendisiyim ve kamuda sivasta görev yapıyorum. Hatta burdan arkadaşlar varsa tanışıp bilgi edinmek te isterim.

Bu arada apsis aşağıdaki link demişsin fakat link yok maalesef.

Z80

3 faz spwm üretmek için 120 derece faz farkı bulunan 3 tablo yapmalısınız. Tablodan ürettiğinizi varsayarak söylüyorum.
   
const	int16	PHASE1[64]={128,141,153,165,177,188,199,209,219,227,234,241,246,250,254,
255,256,255,254,250,246,241,234,227,219,209,199,188,177,165,153,141,128,115,103,91,79,68,57,47,37,29,22,15,
10,6,2,1,0,1,2,6,10,15,22,29,37,47,57,68,79,91,103,115};

const	int16	PHASE2[64]={17,11,7,3,1,0,0,2,4,8,13,19,26,35,44,53,64,75,87,99,111,124,136,149,161,173,185,196,
206,215,224,232,239,245,249,253,255,256,256,254,252,248,243,237,230,221,212,203,192,
181,169,157,145,132,120,107,95,83,71,60,50,41,32,24};

const	int16	PHASE3[64]={239,232,224,215,206,196,185,173,161,149,136,124,111,99,87,75,64,53,44,35,26,19,13,8,
4,2,0,0,1,3,7,11,17,24,32,41,50,60,71,83,95,107,120,132,145,157,169,181,192,203,212,
221,230,237,243,248,252,254,256,256,255,253,249,245};

timer interrupt ruitini buna benzer:
PWM1=PHASE1[INDEX];
set_pwm1_duty(PWM1);
			
PWM2=PHASE2[INDEX];
set_pwm2_duty(PWM2);
		
PWM3=PHASE3[INDEX];
set_pwm3_duty(PWM3);

if (INDEX == 63) INDEX=0;
else  INDEX++;

int cikis


Timer interrupt kurarak bu tablolardan okuyup her pwm kanalına aynı anda yazdıracaksınız.
Frekansı Timer'ın süresiyle değiştireceksiniz.

Genliği değiştirmek için ya bir sürü değişik genlikte tablo kullanacaksınız, ya da her peryod için hesap yapacaksnız, bu da güçlü bir işlemci gerektirir. 

3 fazlı sistemde fazlar U,V,W değil R,S,T olarak adlandılır. UVW XYZ motor vs bağlantı adlarıdır. 

felix_eray

#7
Evet R.S.T. olarak geçer doğrudur. Kızım üstümde yuvarlanırken yazıyordum, o kadar hata da olsun. Vermiş olduğunuz kodlar karşılık bulmuyor mesele de orda zaten. Şimdi index=1(0). Kesmede iken phase1 128 pwm verecek. phase2 17, phase3 ise 239 verecek. Bunu 3 faz sinüs dalgasına göre endekslersek phase1 in ve phase2 nin pozitif olduğunu düşünelim. Phase3 239 verirken karşılığı phase1 için 128 ve 2 için 17 olacak. Bu haliyle max duty phase3 kadar değil karşılığı kadar olur yani phase1 in 128 i. Ayrıca phase2 devredeyken akım bölünecek o da ayrı bir etmen. Bu tablo rakamsal olarak istediğimiz voltaj değişimini söylüyor ama yapamıyor. Meselenin aslı burda. Bu tablo ve nicelerini kurdum fakat sadece olayı anlamama yardımcı oldular. Daha doğrusu hatayı. Zaten kesmeler de yok tabloda. Yani timer sayıyor, sona gelince atıyor , o arada index süresince, index=1 de kaç adet atacağı da belirsiz. Pwm frekansına göre kesme ayarlanmalı. Bu tablo monofaz inverter için olur tabi kesmeleri frekansa göre ayarlamak koşuluyla, yoksa arada saçma pwm darbeleri çıkar karışır.
Ayrıca bahsettiğim
1111111100 - phase1
1111000000 - phase2
0000111100 - phase3
Şeklindeki tablo da vermiş olduğunuz tabloya göre, index değişkeninin sadece 1 adet değeridir.

Zoroaster

#8
Alıntı yapılan: felix_eray - 11 Ocak 2017, 23:53:22
Evet R.S.T. olarak geçer doğrudur. Kızım üstümde yuvarlanırken yazıyordum, o kadar hata da olsun. Vermiş olduğunuz kodlar karşılık bulmuyor mesele de orda zaten. Şimdi index=1(0). Kesmede iken phase1 128 pwm verecek. phase2 17, phase3 ise 239 verecek. Bunu 3 faz sinüs dalgasına göre endekslersek phase1 in ve phase2 nin pozitif olduğunu düşünelim. Phase3 239 verirken karşılığı phase1 için 128 ve 2 için 17 olacak. Bu haliyle max duty phase3 kadar değil karşılığı kadar olur yani phase1 in 128 i. Ayrıca phase2 devredeyken akım bölünecek o da ayrı bir etmen. Bu tablo rakamsal olarak istediğimiz voltaj değişimini söylüyor ama yapamıyor. Meselenin aslı burda. Bu tablo ve nicelerini kurdum fakat sadece olayı anlamama yardımcı oldular. Daha doğrusu hatayı. Zaten kesmeler de yok tabloda. Yani timer sayıyor, sona gelince atıyor , o arada index süresince, index=1 de kaç adet atacağı da belirsiz. Pwm frekansına göre kesme ayarlanmalı. Bu tablo monofaz inverter için olur tabi kesmeleri frekansa göre ayarlamak koşuluyla, yoksa arada saçma pwm darbeleri çıkar karışır.
Ayrıca bahsettiğim
1111111100 - phase1
1111000000 - phase2
0000111100 - phase3
Şeklindeki tablo da vermiş olduğunuz tabloya göre, index değişkeninin sadece 1 adet değeridir.

RST vs den bahsettiğine göre 50 Hz sinyal üreteceksin ve mesajlarında pwm fazlarını ayarlamaktan bahsediyorsun ve PWM frekansını da 50Hz tutmak istiyorsun. (Böyle anlaşılıyor)

Yanlışın burada. Daha önce de dediğim gibi özel uygulamalar haricinde PWM sinyalin fazı ile oynanmaz.
Şu anda kullandığın teknik 80 li yılların CMOS/TTL çipleriyle yapılan motor sürücülerine ait.

Senin yapacağın şey pwm frekansını atıyorum 16Khz yapıp bununla 50Hz AC gerilim üretmek.

Mesajlarında takıldığın yerlere bakınca yanlış yolda olduğun görülüyor.


Seytan deliginden kacti.

felix_eray

Galiba anlatamıyorum. Bahsettiğim olay çok daha farklı aslında. Bildiğiniz vfd inverter de diyebiliriz. 440v doğru akımı alıp sinüsoidal pwm ile frekansı ayarlanabilen bir asenkron motor için invertör tasarlamaya çalışıyorum. Yani frekans ile motor devrini ayarlamak. Neyse çözümü buldum. Denemelerimi yapıp kodları buradan paylaşacam. Paylaşımdan sonra ne demek istediğim çok net anlaşılacaktır. İlgilenen arkadaşlara teşekkür ederim.

felix_eray

Merhaba arkadaşlar. Uğraşlarım sonucu istediğim sonuca ulaşabildim.



Burada 3 faz sinüs grafiğinde görülen 1 kısım, proteus osiloskopunda belirttiğim yere gelmekte.
Osiloskopta ki, Mavi R-High Side, Kırmızı S-Low Side ve Sarı T-High Side kanallarından alınan sinyal verilerini göstermekte.
Sinüs eğrisinde 1 e karşılık gelen kısımda, S negatif ve karşılığı olarak R ve T pozitif. Osiloskopta S %80 gibi bir orana sahipken R %8 ve T ise %72 gibi bir oranı karşılamakta. Yani %80 negatife karşılık %8+%72=%80 tam oranda karşılık alır.

1 de R sinyali T sinyalinin bitiminde başlamakta, belirlenen oran sonunda ise bitmekte. Örneğin 100v güçten S %80 ile 80 volt, T %72 ile 72 volt, R %8 ile 8 volt enerji geçirmekte. R, T den sonra başladığında akımda da bölünme olmayacaktır.

2 de ise S max konumda %90 varsayalım. yani 100volt girişe 90volt geçecek. T hemen hemen %45 gibi, yani 45 volt, R de %45 ve 45volt. Yine T nin bitiminde R başlıyor ve akım bölünmesine neden olmuyor.

Burada Pwm yazılımsal olarak elde edildi ve ikinci osiloskop görüntüsünde Mavi R nin High Side çıkışı, Yeşil de R nin Low Side çıkışını belirtmekte. Osiloskopta 4 kanal girişi olduğundan tüm çıkışları gösteremiyorum fakat siz kodları uygulayıp sistemi çalıştırdığınızda daha net göreceksiniz.

felix_eray

#11
Kodlar için MikroC ve PIC18F4520 kullandım. 10Mhz ve HS PLL aktif ettim. Kristale Data Sheet ten okuyarak 15pF kondansatör bağladım . Osiloskoptaki tam sinüs frekansım 98 Hz. Yani Mavi R High ve Yeşil R Low Side toplamı 98Hz.
Kodlarda ki "deger" değişkeni değiştirilerek frekans değiştirilmekte. Kodları biraz daha geliştirdim fakat çok önemli değil. Kayda değer farklılıklar oluştukça eklemeler yapacam. Bu arada dediğim gibi bu işe başlayalı daha bir buçuk ay anca oldu o sebeple epey eksiğim mevcut. Örneğin bu 3 faz çıkışı senkron olarak aldım fakat çözünürlüğü arttırma noktasında eksik kalıyorum, frekans düşüyor. Yani çözüm önerilerinize açığım. Ayrıca "değer " değişkenini değerini bir pot ile yükseltip alçaltıp frekans ayarı yapma noktasında eksiğim var. Üzerine çalışıyorum fakat al sana kod, yerleştir diyecek varsa da eyvallah derim. Her türlü yardım, öneri, görüş eleştiri gibi düşüncelerinizi esirgemeyin lütfen.

Eğer sinyallerde sapıtma görürseniz "deger" değişkenini 0 olarak yani en düşük frekansta başlatın ve yavaş yavaş arttırarak maksimum frekansı bulun. Benim kurduğum düzenekte en fazla deger=150 oluyor, fazlasında sapıtıyor. En düşük te 0 da 30Hz gibi bir frekans veriyor.



-------------------------------------------------------------------------------------------------
unsigned char i=1; //pwm çözünürlüğümüzü belirliyor.
unsigned char m=0;
unsigned char deger=150; //Frekansımızı belirler.
unsigned char faz11[24]={13, 10, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 13, 10, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0};
unsigned char faz12[24]={19, 20, 19, 17, 19, 20, 19, 17, 14, 11, 6, 0, 19, 20, 19, 17, 19, 20, 19, 17, 14, 11, 6, 0};
unsigned char faz21[24]={0, 0, 0, 0, 0, 0, 0, 0, 13, 10, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 13, 10, 5, 0};
unsigned char faz22[24]={19, 20, 19, 17, 14, 11, 6, 0, 19, 20, 19, 17, 19, 20, 19, 17, 14, 11, 6, 0, 19, 20, 19, 17};
unsigned char faz31[24]={0, 0, 0, 0, 13, 10, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 13, 10, 5, 0, 0, 0, 0, 0};
unsigned char faz32[24]={14, 11, 6, 0, 19, 20, 19, 17, 19, 20, 19, 17, 14, 11, 6, 0, 19, 20, 19, 17, 19, 20, 19, 17};

void interrupt()//kesme alt programı
{
if (INTCON.T0IF)//Timer0 Kesme bayrağı kontrol ediliyor.
{
i++;//i değişkeni artıyor.
TMR0L=deger;//Timer0 registerına kesme oluşturacak değer yükleniyor.
INTCON.T0IF=0;// Kesme bayrağı sıfırlanıyor.
}
}
//*****************************************************************************
void main()
{
trisb=0;//PORTB çıkış
latb=0;//PORTB'nin tüm pinleri 0 seviyesinde.
trisc=0;//PORTC çıkış
latc=0;//PORTC'nin tüm pinleri 0 seviyesinde.
T0CON=0b11000000;//TMR0ON=1, T08BIT=1, T0CS=0, T0SE=0, PSA=0, T0PS2=0, T0PS1=0, T0PS0=0. Timer0 registerleri seçildi.
INTCON.GIE=1;// tüm kesmelere izin verdik.
INTCON.T0IF=0;//Kesme bayrağını her ihtimale karşı sıfırladık
TMR0L=deger;//Timer0 registerına kesme oluşturacak değer yükleniyor.
INTCON.T0IE=1;//Timer0 kesmesini aktif ettik.

while(1)// Sonsuz Döngü.
{
if(i>faz11[m]&&i<faz12[m]&&m<12){latb.f0=1,latb.f1=~latb.f0;} //Faz1 High Side
else{latb.f0=0, latb.f1=~latb.f0;}
if(i>faz11[m]&&i<faz12[m]&&11<m&&m<24){latb.f2=1,latb.f3=~latb.f2;} //Faz1 Low Side
else{latb.f2=0, latb.f3=~latb.f2;}
//******************************************************************************
if(i>faz21[m]&&i<faz22[m]&&m<20&&m>7){latb.f4=1,latb.f5=~latb.f4;} //Faz2 High Side
else{latb.f4=0, latb.f5=~latb.f4;}
if(i>faz21[m]&&i<faz22[m]&&(m<8||19<m)){latb.f6=1,latb.f7=~latb.f6;} //Faz2 Low Side
else{latb.f6=0, latb.f7=~latb.f6;}
//******************************************************************************
if(i>faz31[m]&&i<faz32[m]&&(m<4||m>15)){latc.f0=1,latc.f1=~latc.f0;} //Faz3 High Side
else{latc.f0=0, latc.f1=~latc.f0;}
if(i>faz31[m]&&i<faz32[m]&&3<m&&m<16){latc.f2=1,latc.f3=~latc.f2;} //Faz3 Low Side
else{latc.f2=0, latc.f3=~latc.f2;}
//******************************************************************************

if(i==22)i=1, m++;//i değişkeni sıfırlanıyor ve m artıyor.
if(m==24)m=0; //m değişkeni sıfırlanıyor.
}
}

felix_eray



Bu sistemi kurmanız halinde RB0 ve RB1 R Kanalın High Side çıkışı, RB2 ve RB3 R Kanal Low Side çıkış.

RB4 ve RB5 S Kanalın High Side çıkışı, RB6 ve RB7 S Kanal Low Side çıkış.

RC0 ve RC1 T Kanalın High Side çıkışı, RC2 ve RC3 T Kanal Low Side çıkış.

Dikkat ederseniz örneğin R Kanal High Side çıkış için RB0 ve RB1 çıkışları kullanılmakta. RB0 Pozitif iken yani High iken, RB1 Negatif Yani Low. Böylece mosfet ve igbt sürücülerine de uygun.

Tabi burada bazı açıklamalar yaptım, kendimce basite indirgemeye çalıştım fakat kimi arkadaşlar kodları görür görmez olayı anlayacaklardır illa ama konuya meraklı arkadaşlar açısından da düşünmek lazım.

felix_eray

Arkadaşlar merhaba. Sayın @Zoroaster hocamın dediklerini düşünüp konu üzerine de biraz yerli yabancı akademik makale araştırması ile uzay vektör konusuna derinlemesine dalış yaptım. Daha önce yazdıklarım, konuyu anlama açısından ön bilgilendirme olsun. Esas yoğunlaşmamız gereken konu Uzay vektör. Burada kullanacağımız pwm dalga çeşidi center align, yani merkez ortalamalı pwm. İlk olarak bildiğimiz pwm işaretleri ile arasında ki farkı ele alalım. Normal pwm işaretleri sola yaslıdır yani %50 duty ile" ı----ı____ " gibi , Center align de ise " __ı----ı__" şeklinde işaret oluşuyor.

Center align pwm ve uzay vektör üzerine çalışma yapmak isteyen, bilgi almak isteyen arkadaşlar olursa ona göre konu üzerinde anlatıma geçmenin daha uygun olacağını düşünüyorum. Ayrıca konu hakkında bilgiye sahip arkadaşlar unutmasınlar ki bilgi paylaştıkça çoğalır.

Şimdilik kodları paylaşıyorum. Sistem  PIC18F4431 üzerine 20MHz kristal ile kurulu. PWM frekansı 20k. Benim üzerine yoğunlaşamadığım, sağlıksız çalışan ama en azından çalışan AN0 üzerine bağlı 10k potansiyometre ile yaklaşık 8Hz ile 300Hz arasında frekans ayarlanabilen bir sistem. Sistem %77,5 duty oranı üzerine kuruldu. Yalnız sonradan ölü zaman ekledim ve onu hesaba dahil etmedim. Ayrıca hesaplanıp düzeltilebilir.

Bu arada, şu ADC işini açıklayabilecek, en azından potun düzgün çalışması için benim sistem üzerinde neleri değiştirmem gerektiğini söyleyecek bir arkadaş olursa çok memnun olurum.

Kod içinde gereksiz kısımlar olabilir. Üzerinde çalıştığım için denemeler yapıyorum, bazen siliyorum bazen kalıyor.

---------------------------------------------------------

unsigned int i = 0, j = 32, k = 33, deger=250;

unsigned int gecis[34] = {

53, 64, 75, 86, 97, 108, 119, 130, 141, 152, 163, 174, 185, 196, 207, 218, 229,
240, 251, 262, 273, 284, 295, 306, 317, 328, 339, 350, 361, 372, 383, 394, 405, 418

};

void main(void)
{
    TRISA.B0=1;
    TRISB.B0=0;
    TRISB.B1=0;
    TRISB.B2=0;
    TRISB.B3=0;
    TRISB.B4=0;
    TRISB.B5=0;

PTCON0 = 0b00000011; //PWM timer control register
PTCON1 = 0b10000000; // PWM timer control register 1 with PWM time base timer bit enabled

PWMCON0 = 0b01000000; // PWM0, PWM1, PWM2, PWM3, PWM4 and PWM5 pins are enabled for PWM output in complementary mode
PWMCON1 = 0b00000001;

DTCON = 0b00001010;           //  dead time.

OVDCOND = 0b11111111;     //  Output on PWM I/O pin is controlled by the value in the corresponding POUT bit

OVDCONS = 0b11111111;     //  Output on PWM I/O pin is inactive when the corresponding PWM output override bit is cleared

FLTCONFIG = 0x00;   //  disable fault detection feature

PTPERL = 0x7C;         //  PWM time base period register (lower 8 bits)
PTPERH = 0x00;         //  PWM time base period register (upper 4 bits)

SEVTCMPL = 0x00;
SEVTCMPH = 0x00;


T0CON=0b11000000;//TMR0ON=1, T08BIT=1, T0CS=0, T0SE=0, PSA=0, T0PS2=0, T0PS1=0, T0PS0=0. Timer0 registerleri seçildi.
INTCON.GIE=1;// tüm kesmelere izin verdik.
INTCON.T0IF=0;//Kesme bayrağını her ihtimale karşı sıfırladık
TMR0L=deger;//Timer0 registerına kesme oluşturacak değer yükleniyor.
INTCON.T0IE=1;//Timer0 kesmesini aktif ettik.


ANSEL0=0b00000011;
ADCON2=0b00110010;
ADCON3=0b01000000;
ADCHS=0b00000100;



while(1){

//PDC0L = 491;
//PDC0H = 491>>8;



if(j==0&&k==33&&i<34)i++;
if(j==33&&k==0&&i>0)i--;


if(k==0&&i==33&&j<34)j++;
if(k==33&&i==0&&j>0)j--;


if(i==0&&j==33&&k<34)k++;
if(i==33&&j==0&&k>0)k--;

}
}

void interrupt(){


if (INTCON.T0IF)//Timer0 Kesme bayrağı kontrol ediliyor.
{

PDC0L = gecis;
PDC0H = gecis>>8;

PDC1L = gecis[j];
PDC1H = gecis[j]>>8;

PDC2L = gecis[k];
PDC2H = gecis[k]>>8;

ADCON0=0b00000011;
deger=ADRESH;

TMR0L=deger;//Timer0 registerına kesme oluşturacak değer yükleniyor.
INTCON.T0IF=0;// Kesme bayrağı sıfırlanıyor.
}

}

baran123

Farklı fazlarda PWM üretmek istiyorsan bunu dsPIC30F2020 ile yapabilirsin. Frekans, Duty, Dead Time, Phase, Complement bu parametrelerin hepsiyle oynayabilirsin.
Bu işlemcide pwm fazı değiştirmeyi sağlayan özel register mevcut.