Şimdi Ara

Arduino PWM Frekansı arttırma (Buck boost converter) için

Daha Fazla
Bu Konudaki Kullanıcılar: Daha Az
2 Misafir - 2 Masaüstü
5 sn
6
Cevap
0
Favori
1.771
Tıklama
Daha Fazla
İstatistik
  • Konu İstatistikleri Yükleniyor
0 oy
Öne Çıkar
Sayfa: 1
Giriş
Mesaj
  • 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);
    }



  • 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.
  • 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
  • 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ş
  • 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
  • 
Sayfa: 1
- x
Bildirim
mesajınız kopyalandı (ctrl+v) yapıştırmak istediğiniz yere yapıştırabilirsiniz.