Arama butonu
Bu konudaki kullanıcılar: 1 misafir
4
Cevap
1794
Tıklama
0
Öne Çıkarma
Arduino PWM Frekansı arttırma (Buck boost converter) için
F
5 yıl
Yüzbaşı
Konu Sahibi

Kod bu şekilde. frekans 16 kHz'de sabit. duty cycle'ı istediğim gibi değiştirebiliyorum.
Sorunum şu frekans devre için yetersiz kalıyor.
Frekansı 32kHz yada 64 kHz'e arttırmam gerekiyor. nasıl yapabilirim ?


quote:



//MK


const int pot_pin = A0;
const int feedback = A1;
int pot = 0;
int cikti = 0;
int vout = 0;
int vpot = 0;
int duty = 1;
int bosluk = 510;
int i=0;

void setup() {
cli(); // stop interrupts
TCCR1A = 0xF2 ; // phase correct (mode 1010, ICR1 controls period)
TCCR1B = 0x01 ; // prescale by 1, change to 0x12 for prescale by 8
TIMSK1 = 0x01 ; // overflow interrupt
ICR1 = 500 ; // 31.25us cycle time, 32kHz PWM but 64kHz drive pulses (differential)
OCR1A = 125-100 ; // example U drive
OCR1B = 125 ;
GTCCR = 0x83 ; // clear and halt prescalers
TCNT1 = 0xFFFF ; // synchronize counters exactly.
GTCCR = 0x00 ; // allow prescalers to fly
sei(); // allow interrupts
pinMode(pot_pin, INPUT);
pinMode(feedback, INPUT);
pinMode(9, OUTPUT);
pinMode(10, OUTPUT);
Serial.begin(9600);

}

ISR(TIMER1_OVF_vect){

OCR1A=bosluk; //dutyi buradan ayarla
OCR1B=511-bosluk;
}



void loop(){

oku(); //potansiyometreden istenen gerilim ve cikistan alinan gerilimi okutuyoruz

/*while(i==0){//yumusak baslama icin fonksiyon

for(i=1;i<4;i=i++){
duty=i*100;
bosluk=511-duty;
delay(20);
}
}*/
oku();

if(vout < vpot){//istenen gerilim cikis geriliminden buyuk ise calistirir

while(vout<vpot){
duty=duty+4;
dutybelirleme();
delay(50);
oku();
}
}
else if(vout > vpot){//istenen gerilim cikis geriliminden kucuk ise calisir

while(vout>vpot){
duty=duty-32;
dutybelirleme();
delay(20);
oku();
}
}

//delay(10);

}

void dutybelirleme(){

if(duty>490){
duty=490;
}
else if(duty<10){
duty=10;
}
bosluk=511-duty;
}

void oku(){
pot = analogRead(pot_pin);
//vpot= map ( pot , 0, 1023 , 0 , 1023);
vpot=pot;
//499=5.0 V

cikti = analogRead(feedback );
//vout= map ( cikti , 0, 1023 , 0 , 1023);
vout=cikti;
//399=40.0 V

if(vpot>820){
vpot=820;

}
delay(10);
}



E
5 yıl
Onbaşı

ICR1 = 500;
Bu değeri değiştirerek yapabilirsin. Formül şu: 16000000 / (2 * ICR1)

Kod amatörce yazılmış. O kesme fonksiyonuna hiç gerek yok, duty cycle değerleri loop() içinde güncellense daha iyi olur.


Bu mesaja 1 cevap geldi.
F
5 yıl
Yüzbaşı
Konu Sahibi

quote:

Orijinalden alıntı: elektro_gadget_

ICR1 = 500;
Bu değeri değiştirerek yapabilirsin. Formül şu: 16000000 / (2 * ICR1)

Kod amatörce yazılmış. O kesme fonksiyonuna hiç gerek yok, duty cycle değerleri loop() içinde güncellense daha iyi olur.
ICR1=500 değerini değiştiriyorum fakat frekans değişmiyor



E
5 yıl
Onbaşı

Kod hatalı olduğu için kafamı karıştırdı. Oradaki register tanımlamalarını komple silip şöyle yapalım.

ICR1 = 249;
TCCR1A = 0xA2;
TCCR1B = 0x19;

Başka bişey lazım değil. Bu değerler ile 64 khz pwm alırsın. OCR1A ve OCR1B duty cycle'ı ayarlar. loop() içinde güncelle, kesmeyi sil gitsin. Maksimum duty cycle ICR1 kadar olabilir, ondan fazlası sürekli %100 doluluk demektir. Diğer bir deyişle frekansın artması pwm çözünürlüğünün düşmesi demek. Son olarak senin kodda çıkışlar invert edilmişti. Ben normal olarak ayarladım.
0xA2 -> Normal
0xF2 -> Terslenmiş


Bu mesaja 1 cevap geldi.
F
5 yıl
Yüzbaşı
Konu Sahibi

quote:

Orijinalden alıntı: elektro_gadget_

Kod hatalı olduğu için kafamı karıştırdı. Oradaki register tanımlamalarını komple silip şöyle yapalım.

ICR1 = 249;
TCCR1A = 0xA2;
TCCR1B = 0x19;

Başka bişey lazım değil. Bu değerler ile 64 khz pwm alırsın. OCR1A ve OCR1B duty cycle'ı ayarlar. loop() içinde güncelle, kesmeyi sil gitsin. Maksimum duty cycle ICR1 kadar olabilir, ondan fazlası sürekli %100 doluluk demektir. Diğer bir deyişle frekansın artması pwm çözünürlüğünün düşmesi demek. Son olarak senin kodda çıkışlar invert edilmişti. Ben normal olarak ayarladım.
0xA2 -> Normal
0xF2 -> Terslenmiş
Çok teşekkür ederim hocam. Benim Register kontrolü hakkında bilgim yoktu. O yüzden bu şekilde sordum. Ben duty de çok çözünürlük istemiyorum aslında baktığınızda. 100 bile olsa yeterli



< Bu ileti mobil sürüm kullanılarak atıldı >

DH Mobil uygulaması ile devam edin. Mobil tarayıcınız ile mümkün olanların yanı sıra, birçok yeni ve faydalı özelliğe erişin. Gizle ve güncelleme çıkana kadar tekrar gösterme.