PWM ile DC Motor Kontrolünde Kademeli Geçiş Yapmak

Merhaba, bir Dc motorun hızını bir kaç anahtar ile kademeli olarak artırmak istiyorum(PWM değerleri ile). Sorumu sormadan önce uyguladığım kodu yazayım: void setup() { pinMode(3,OUTPUT); pinMode(8,OUTPUT); pinMode(7,OUTPUT); } void loop() { digitalRead(8); digitalRead(7); if (digitalRead(7)==HIGH) { if (digitalRead(8)==HIGH) { analogWrite(3, 255); } if (digitalRead(8)==LOW) { analogWrite(3,127); } } else { digitalWrite(3,LOW); } } Kodda da görüldüğü üzere 7.pine bağlı anahtar kapalı olduğunda(HIGH ise); 8. pin de eğer kapalıysa (HIGH ise) tam duty cycle(255), açıkise yarım duty cycle(127) ile motoru besliyorum (7 nolu pin bir nevi motor aç/kapa yapıyor). Soruma gelecek olursam, ben 8. pine bağlı anahtarı kapattığımda motor hızı son hızına geliyor. Fakat bu geçiş bir anda gerçekleşiyor. Benim amacım LOW olan 8. pini HIGH yaptığımda bu geçiş süresini kademelendirmek. Yani hız yarım duty cycle’dan tam duty cycle’a birden gelmesin de, kademeli bir şekilde gelsin. İleride bir kaç tane daha anahtar ekleyip 0-255 skalasını o şekilde kontrol etmek istiyorum. Yani 0-50 için bir anahtar 50-100 için,…,200-255 için bir anahtar gibi. Fakat sorunum aralardaki kısa geçişler. Bu geçişleri belli sürelerde yapmayı planlıyorum. For döngüsünde çok denedim, hatta kademeli sürüşü de gerçekleştirdim, fakat bu sefer de for döngüsü ile kontrol edilen motoru, tüm kodlara rağmen bir türlü anahtar ile kontrol edemedim ve son hızdan sonra hız sıfırlanıp tekrar tekrar başa döndü. Son çareyi yukarıdaki kod bloğunu yazarak elde ettim fakat dediğim gibi bu sefer de geçiş kademesi diye bir olay söz konusu olmuyor bu kodla. “Direk” 255 deki hıza geçiveriyor. Yardımınız için şimdiden teşekkür ederim.

analogwrite değerini hemen verme güncel değerden hedef değere doğru +5 arttırarak ilerle bunu da bir for dongusunde yap hedefe ulaşınca for dan çıkar işte…

Yorumunuz için teşekkür ederim. For döngüsünü kullandım fakat son hıza geldikten sonra motor durup baştan çalışmaya başlıyor. Yani birinci anahtarı açtığımda yarı hıza geldikten sonra (127 değerinde) orada kilitlemek istiyorum ki, diğer anahtarı açtığımda son hıza gelsin ve o hızda devam etsin. While(1) kullanarak son değerini muhafaza etmek istedim fakat hız tekrar başa döndü. İsteğim for döngüsünü kilitleyip son hızı ne ise o değerde çalışması. Değiştirdiğim kod şu şekilde: void setup() { Serial.begin(9600); pinMode(5, OUTPUT); pinMode(2,INPUT); pinMode(4,INPUT); } void loop() { digitalRead(2); digitalRead(4); for(int a=0;a<=255;a+=5) { if (digitalRead(2) == HIGH) { for(int a=50;a<=125;a+=5) { analogWrite(5,a); delay(500); } if (digitalRead(2) == HIGH && digitalRead(4) == HIGH) { for(int a=126;a<=255;a+=5) { analogWrite(5,a); delay(500); } } if (digitalRead(2) == LOW && digitalRead(4) == LOW) { digitalWrite(5,LOW); } else { digitalWrite(5,LOW); } } } }

Kodunu fazla inceleyemedim ama dikkatimi çeken şu oldu: for için hep a değişkenini kullanmışsın. Bunu yapmamalısın bence. Ayrıca durması için a değerinin (ya da hangi değişken pwm frequency’sini kontrol ediyorsa) kontrol edilmesi lazım sanki. Yani “a== 127 olduğu zaman pwm değiştirme” gibi. Dediğim gibi çok inceleyemedim ama bunları fark ettim şimdilik. Geniş zamanda bakarsam tekrar dönerim.