Microchip 16Bit PWM Modülü Çalışması

Başlatan Mucit23, 05 Aralık 2023, 17:18:57

Mucit23

Hayatımda bu kadar karmaşık bir PWM donanımı görmedim. Datasheet'te sabahtan beri bi yukarı bi aşağı donanımın çalışmasını anlamaya çalışıyorum.

Pic12LF1571 MCU ile bir kanalda PWM üretmeye çalışıyorum. Başaramadım.

Şu blok diyagramı açıklayabilecek olan varmı?



Burada Preload, Phase, Offset ve DutyCycle Değerleri var bu değerlere göre PWM değerleri güncelleniyor ama çıkamadım işin içinden

Benim MCU 1Mhz ile çalışıyor. Bu Blok Diyagramda Clock Seçim ve Prescaller değerlerini yaptım aşağıdaki satırlarla.

    PWM2CONbits.PWM2EN = 1;  //PWM2 Enable Output    
    PWM2CONbits.PWM2OE = 1;  //PWM2 Turn on 
    PWM2CLKCON = 0x00;       //Set FOSC clock, no prescaler.
    PWM2PH=0;                //Set Phase Count Register as 0
    PWMENbits.PWM2EN_A=1;    //PWM2 Module Enabled   

Fakat belirlemiş olduğum frekans değerine göre Preload ve DutyCycle Değerlerini nasıl belirleyeceğimi çözemedim. Datasheet te bir formül var ama formüle göre hesap yaptığımda bulduğum değerlerle çalıştıramadım. PWM çıkışı aktif olmuyor.

1MHz FOSC için 1Khz örnek ayarlamaları nasıl yapabilirim?


mehmet

#1
Bölüm 22.2, sayfa 205...

Kod: C
PWM2CLKCONbits.CS = 0b00; //FOSC = 1_000_000Hz.
PWM2CLKCONbits.PS = 0b111;
PWM2PRH = 0x00;
PWM2PRL = 0x07;// ~976HZ, 0x06->1116Hz
Olan olmuştur,
olacak olan da olmuştur.
Olacak bir şey yoktur.
---------------------------------------------
http://www.mehmetbilgi.net.tr
https://creativecommons.org/licenses/by/4.0/deed.tr "CC BY"

JOKERAS

Clockİnternalmi?Yoksa Haricimi?

PWM için kullandığınız portun APF(Alternate Pin Funtion) özelliği var.PWM çalışmıştır belki
ama siz Başka pine bakıyorsunuzdur.

APFCONbits.P2SEL = ?;

1 = PWM2 function is on RA4
0 = PWM2 function is on RA0



Okan AKÇA

Kullanmadım ama Microchipin stmcube gibi programı olması Lazım unit yaptırabilirsiniz.

Mucit23

Alıntı yapılan: mehmet - 05 Aralık 2023, 17:39:29Bölüm 22.2, sayfa 205...

Kod: C
PWM2CLKCONbits.CS = 0b00; //FOSC = 1_000_000Hz.
PWM2CLKCONbits.PS = 0b111;
PWM2PRH = 0x00;
PWM2PRL = 0x07;// ~976HZ, 0x06->1116Hz

Hocam Tekrar bakıyorum. Benim mantığım STM32 ye gidiyor. Stm32 de ARR değeri pwm Counterinin çalışma aralığını belirtiyor. Birde compare registeri var ki bu değer de doğrudan aslında duty cycle değerini belirliyor.

Pic de bunun karşılığı nasıl oluyor? Bu arada Alternate pinleri ayarladım. Şuan çıkış almaya başladım.


mehmet

Duty formülüne bakın, hangi kaydediciler
kullanılmış.
Olan olmuştur,
olacak olan da olmuştur.
Olacak bir şey yoktur.
---------------------------------------------
http://www.mehmetbilgi.net.tr
https://creativecommons.org/licenses/by/4.0/deed.tr "CC BY"

JOKERAS

Bence önce Osiltörü ayarlayın.Çünkü bu taban ve merkez sinyal.

Pdfi incelediğim kadarıyla Multi Fonksiyonel PWM bloğu olduğu için kafa karıştırıyor.
STM lerle aynı görünüyor,aynı mantık.

Önce PWM Bloğunu besleyecek Cloğu seçin.Ön bölücü PreScaller ile istediğiniz değere bölün yada bölmeyin.
Çünkü düşük PWM frekansı istiyorsunuz.PWM 16-Bit olduğu için Çalışma alanı geniş.Frekansı
PWM2PR ile de değiştirebilirsiniz.

PWM2PR PWM Peryodunu-Frekansını belirliyor.
PWM2DC Duty Cycle değerini belirliyor.

Ama burada dikkat edilmesi gereken Register Load Registeri.
Duty Registerinin güncellenmesi için PWM2LD_A registeri her güncellemeden sonra
1 olmalı.

OSCCONBits.SCS = 0x02; //İnternal Osc blok.
OSCCONbits.IRCF = 0x0B //1Mhz No PLL.

TRISAbits.LATA0 = 0; //APF ye göre PWM çıkışı
TRISAbits.LATA4 = 0; //APF ye göre PWM çıkışı
APFCONbits.P2SEL = 1; //Hangi PWM portu olduğuna göre Pin seçme



PWM2EN = 1;
PWM2OE = 1;
PWM2PR = 1024 - 1; //PWM Bloğunun Clock ve Ön Bölücü PS'ye  PWM Frekans değeri.



while(1) {

PWM12DC = AdcVal;// Mesela Okunan ADC değerinin PWM de görünmesi.
PWMLDbits.PWM2LDA_A = 1;  //Update Duty

}

Pdf ten incelediğim duruma göre böyle çalışır sanırım.











Mucit23

#7
Şimdi Anladım. Eski PWM donanımı ile karıştırmamak gerekiyormuş. Niye böyle kafam karıştı anlamadım. Aslında PWM donanımı STM32'deki yapıya daha çok benziyor.

@mehmet hocam sizdeki hesap da yanlış. 1Khz için T=1Ms olduğundan PWM2PR=999 olması gerekiyor.(FOSC=1000000)


Dolayısıyla PWM2DC değeri de aynı şekilde 0-1000 arası ayarlanarak Duty 0-%100 arası ayarlanmış oluyor. Bu şekilde çalıştırdım.

@JOKERAS Teşekkürler.

JOKERAS

Rica ederim Mucit23.

PWM modulünü çok komplike yapmışlar.Modülü her türlü PWM sinyali üretmek için Kullanılabiliyor.
Phase,Center,Slave,One,Pulse vs.Ayrıca her durum için İnterrupt koymuşlar.
Ayrıca Load Registerini yazılımsal olarak tetiklemenin haricinde başka donanımlarla Auto Trigger olarak tetiklenebiliyor olmasıda çok güzel.

Pdf te dikkatimi çeken başka nokta ise CWG(Complementary Wave Generetör) Bu modülle her türlü
iş yapılabilir.İşlemci küçük ama Donanımları gayet güzel görünüyor.

PWM portu için bence PWM 1'i kullanın,çünkü en makul Pin bu görünüyor.

Sizin kullandığınız PWM2'nin APF RA0 Pin7, "AN0 & DACOUT & CIN1+" özelliği var.
PWM2'nin APF Pin RA4 Pin3, "AN3 & CIN1-" özelliği var.

Bence en uygun PWM1 APF RA5 Pin2 oluyor diye düşünüyorum.


mehmet

#9
Precaler 128 bendekinde...
Kod: C
PWM2CLKCONbits.PS = 0b111;
Olan olmuştur,
olacak olan da olmuştur.
Olacak bir şey yoktur.
---------------------------------------------
http://www.mehmetbilgi.net.tr
https://creativecommons.org/licenses/by/4.0/deed.tr "CC BY"