Yazılımsal PWM
  • Arkadaşlar merhaba. Ben arduino mega ile AA kıyıcı yapmak istiyorum. Anahtarlama için IGBT ve sürücüsünü kullanacağım o kısımda sorun yok. Benim sıkıntım iki tane birbirini tamamlayan kare dalga oluşturmak istiyorum. Şöyle anlatacak olursam; eğer bir kare dalganın %100 duty cycle durumunda görev süresi 255 ms olduğunu varsayarsak loop döngüsünde yapılmasını istediğim işler;
    - potansiyometre ile değer okuması yap ve bunu 0 ila 255 arası haritala ve potansiyometreden okunan değerin dumuna göre tetikleme sinyali üret.

    Bunun için yazdığım kod;

    int kPWM_pin1 = 11;
    int kPWM_pin2 = 12;
    int kPot = A3;
    int PWM_cycle1;
    int PWM_cycle2;

    void setup (){
    pinMode ( kPot, INPUT );
    pinMode ( kPWM_pin1, OUTPUT );
    pinMode ( kPWM_pin2, OUTPUT );
    }

    void loop (){

    PWM_cycle1 = map ( analogRead (kPot), 0, 1023, 0, 255);
    PWM_cycle2 = ( 225 - PWM_cycle1 );

    if ( PWM_cycle1 == 0)
    {
    digitalWrite ( kPWM_pin1, LOW );
    digitalWrite ( kPWM_pin2, HIGH );
    }

    else if ( PWM_cycle1 >= 225 & PWM_cycle1 < 255 )
    {
    digitalWrite ( kPWM_pin1, HIGH );
    digitalWrite ( kPWM_pin2, LOW );
    delayMicroseconds(PWM_cycle1);
    digitalWrite ( kPWM_pin1, LOW );
    delayMicroseconds(256 - PWM_cycle1);
    }

    else if ( PWM_cycle1 == 255)
    {
    digitalWrite ( kPWM_pin1, HIGH );
    digitalWrite ( kPWM_pin2, LOW );
    }

    else if (PWM_cycle1 > 0 & PWM_cycle1 < 225)
    {
    digitalWrite ( kPWM_pin1, HIGH );
    digitalWrite ( kPWM_pin2, LOW );
    delayMicroseconds(PWM_cycle1);
    digitalWrite ( kPWM_pin1, LOW );
    delayMicroseconds(15);
    digitalWrite ( kPWM_pin2, HIGH );
    delayMicroseconds(PWM_cycle2);
    digitalWrite ( kPWM_pin2, LOW );
    delayMicroseconds(15);
    }

    }

    şeklindedir. 11 ve 12 numaralı pin çıkışlarını osiloskoptan ölçtüğümde loop fonksiyonu ilk çevrimi tamamladıktan sonra anlamadığım bir şekilde sonraki çevrimlere başlamadan hep yaklaşık 2 milisaniye kadar bir gecikme meydana getiriyor.

    Arduinonun kendi donanımsal pwmini kullandığım zaman iki timerlar set edildikten sonra birinci kare dalga ile ikinici arasına istediğim geçikmeyi veremiyorum, delay komutunu kullanıyorum ama pwmin timerlari set edildikten sonra hiç bir şekilde delay etki etmiyor.

    Bu sorunla ilgili görüş ve önerilerinizi bekliyorum.



  • Oluşan gecikmeyi daha iyi anlatabilmek için osiloskop görüntüsü: http://c1303.hizliresim.com/17/h/l2yf6.jpg

    Kodun nasıl işlemesini beklediğimi gösteren osiloskop görüntüsü;
    http://c1303.hizliresim.com/17/h/l2yjc.jpg
  • analogread ve map gecikmeye neden olabilir ayrıca bu kadar if else iç içe olması da geciktiriyor sanırım, kodu daha basitleştir. analog read kısmını ölü zaman kısmının içine alırsan gecikmeyi avantaja dönüştürebilirsin. şurada http://arduinoturkiye.com/bardagin-yarisi-dolu-yada-pwm/ soft pwm örneği yazmıştım dolu ve boş zamanları ayrı ayrı delaylarla yönetmiştim, belki fikir verir
  • Aslında kod daha da detaylı loop döngüsü motor encoderinden gelen kare dalgayı okuyup devir sayısını hesaplamakla başlıyor, sonra bu devir sayısı input, potansiyometre girişi setpoint olmak üzere PID koduna giriyor. PID çıkışındaki hata değerine göre genişlikleri değişken kare dalgalar üretmem gerekiyor

Howdy, Stranger!

It looks like you're new here. If you want to get involved, click one of these buttons!

Login with Facebook

Tagged

Açık kaynak kültürü gereği, çözdüğünüz problemlerin çözümlerini paylaşmayı lütfen unutmayın.