IR2104 Mosfet Sürücü

Başlatan Serk@n77, 14 Ekim 2024, 15:10:55

Serk@n77



İyi günler,

Daha önce forumda sadece mosfetlerden oluşan bir H-Köprü hakkında fikirlerinizi almıştım. Bu devre en ufak bir yazılım hatasını kabul etmeyeceğini ve forumdaki tavsiyeleri göz önünde bulundurarak IR2104 entegresini inceledim.

Datasheet ve mevcut kurulu devreleri inceleyerek şu kanaate ulaştım. Motorun yön ve hız kontrolü için bu entegreden iki adet kullanılıyor. Entegrede IN ve SD pinleri mevcut. Entegrenin IN pinlerine 0,1 veya 1,0 vererek yön kontrolü yapılıyor. Bu esnada da SD pininin lojik 1 'de olması gerekiyor. Herhangi bir aşırı akım tespit edersem her iki entegrenin ortak SD pinini lojik 0 yaparak mosfetlerin enerjilerini kesmem gerekiyor.

Sorularım şunlar:
---Öncelikle anladığım şey doğru mu?
---SD pinlerini sürekli lojik 1 'de tutarak ve IN pininden verdiğim PWM'i keserek yani tamamen lojik 0 yaparak da aşırı akım korumam sağlıklı olur mu? Pin tasarrufu açısından.
---Yapmayı düşündüğüm devre şeması hakkında bir yorumunuz olur mu? Zira bu yorumlar benim için çok kıymetli.

mehmet

İn pinleri için; hangi taraf çalışacak ise o taraftan pwm vermeniz gerekecek, 1/0 olmaz. Yoksa C2 veya C3 şarj olmaz ve kuzeydeki ilgili mosfet açılmaz.
Doğruluk tablosuna bakarak çıkış işlemlerini yaparsınız.
Olan olmuştur,
olacak olan da olmuştur.
Olacak bir şey yoktur.
http://www.mehmetbilgi.net.tr
CC BY

Serk@n77

#2
Hocam lojik 1 ile %100 duty PWM aynı şey değil midir?

Serk@n77

#3
Alıntı yapılan: mehmet - 14 Ekim 2024, 18:19:47İn pinleri için; hangi taraf çalışacak ise o taraftan pwm vermeniz gerekecek, 1/0 olmaz. Yoksa C2 veya C3 şarj olmaz ve kuzeydeki ilgili mosfet açılmaz.
Doğruluk tablosuna bakarak çıkış işlemlerini yaparsınız.

Hocam yani pwm.i de %100 duty kullanmamak da fayda var diyebilir miyiz?

mehmet

Mecburuz demeliyiz. %95 civarında veya daha az olabilir. Ölçerek yapmak daha uygun olacaktır.
Olan olmuştur,
olacak olan da olmuştur.
Olacak bir şey yoktur.
http://www.mehmetbilgi.net.tr
CC BY

Serk@n77

#5


Entegrenin simülasyonuna baktım. IN1 ve IN2 pinlerine PWM uygulanarak motora yön ve hız veriliyor. İki IN pini lojik aynı ise motor duruyor. SD pini ise IN pinlerinin durumuna bakmaksızın lojik 0'da mosfetlerden enerjiyi kesiyor. Tekrar lojik 1 olduğunda sistem eski haline geliyor.

Fakat simülasyon kaynaklı bir sorun sanırım, mosfet gate dirençlerini kaldırdım ve PWM frekansını  50 Hz.'e kadar düşürdüm. Aksi halde simülasyon sürekli hata verdi.

Acs712'yi de denedim. Simülasyon, sinyal PWM olduğu için  değerleri değişken veriyor. Belki gerçekte de öyle olacak. Ama belli sayıda ölçümün ortalaması sanırım çekilen akım konusunda sağlıklı bir sonuç verecektir diye düşünüyorum.

Serk@n77

Devreyi denedikten sonra da sonuçları sizlerle paylaşacağım. Umarım bir sorunla karşılaşmam.  :)

mehmet

#7
SD'leri ayrı sürün.

ESP8266 ile yapmışım...
#!/usr/bin/env python3
# -*- coding: utf-8 -*-

import time
import machine

class DC_MOTOR:
    def __init__(self, in1_pin, in2_pin, sd1_pin, sd2_pin, frekans = 1000, duty = 1023):
        self.in1 = in1_pin
        self.in2 = in2_pin
        self.sd1 = sd1_pin
        self.sd2 = sd2_pin
        self.frekans = frekans
        self.duty = duty
        self.MAX_DUTY = int(1023 / 100 * 99.8)#Bost kondansatörünün dolu kalması için gerekli
        self.pwm1 = machine.PWM(self.in1)
        self.pwm1.freq(self.frekans)
        self.pwm1.duty(self.MAX_DUTY)
        self.pwm2 = machine.PWM(self.in2)
        self.pwm2.freq(self.frekans)
        self.pwm2.duty(self.MAX_DUTY)
        
    def deinit(self):
        #pwm vs iptal etmek için
        self.pwm1.duty(self.MAX_DUTY)    
        self.pwm2.duty(self.MAX_DUTY)
        self.pwm1.deinit()
        self.pwm2.deinit()
        
    def sola(self, dalga_orani):
        self.duty = dalga_orani
        self.pwm2.duty(self.MAX_DUTY)        
        self.pwm1.duty(self.MAX_DUTY - self.duty)
        self.sd1.value(0)
        self.sd2.value(1)        
        
    def saga(self, dalga_orani):
        self.duty = dalga_orani
        self.pwm1.duty(self.MAX_DUTY)
        self.pwm2.duty(self.MAX_DUTY - self.duty)
        self.sd1.value(1)
        self.sd2.value(0)
        
    def fren(self, fren_zamani):#ms cinsinden
        self.zaman = fren_zamani
        #fren kodlari
        self.sd1.value(1)
        self.sd2.value(1)
        self.pwm1.duty(1023)
        self.pwm2.duty(1023)
        time.sleep_ms(self.zaman)
        #fren bırakma kodları
        self.sd1.value(0)
        self.sd2.value(0)
        self.pwm1.duty(self.MAX_DUTY)
        self.pwm2.duty(self.MAX_DUTY)
        
    def durdur(self):
        #durdurma kodları
        self.pwm1.duty(self.MAX_DUTY)    
        self.pwm2.duty(self.MAX_DUTY)
        
def main():        
    btn1 = machine.Pin(14, machine.Pin.IN, machine.Pin.PULL_UP)
    btn2 = machine.Pin(12, machine.Pin.IN, machine.Pin.PULL_UP)

    sd1 = machine.Pin(16, machine.Pin.OUT, value = 1)
    sd2 = machine.Pin(5, machine.Pin.OUT, value = 1)

    in1 = machine.Pin(4, machine.Pin.OUT, value = 1)
    in2 = machine.Pin(0, machine.Pin.OUT, value = 1)

    #frekans = 1000#En fazla 1KHz esp8266 için

    motor1 = DC_MOTOR(in1, in2, sd1, sd2)

    print("Motor sola...")
    motor1.sola(900)
    time.sleep_ms(3000)

    print("Motor durdu...")
    #motor1.durdur()
    #time.sleep_ms(300)
    motor1.fren(10)

    print("Motor sağa...")
    motor1.saga(900)
    time.sleep_ms(3000)

    #motor1.fren(100)

    print("Motor durdu ve pwm deinit...\n")
    motor1.durdur()
    motor1.deinit()

if __name__ == "__main__":
    main()
Olan olmuştur,
olacak olan da olmuştur.
Olacak bir şey yoktur.
http://www.mehmetbilgi.net.tr
CC BY

Serk@n77

#8
Alıntı yapılan: mehmet - 16 Ekim 2024, 19:03:58SD'leri ayrı sürün.

ESP8266 ile yapmışım...
#!/usr/bin/env python3
# -*- coding: utf-8 -*-

import time
import machine

class DC_MOTOR:
    def __init__(self, in1_pin, in2_pin, sd1_pin, sd2_pin, frekans = 1000, duty = 1023):
        self.in1 = in1_pin
        self.in2 = in2_pin
        self.sd1 = sd1_pin
        self.sd2 = sd2_pin
        self.frekans = frekans
        self.duty = duty
        self.MAX_DUTY = int(1023 / 100 * 99.8)#Bost kondansatörünün dolu kalması için gerekli
        self.pwm1 = machine.PWM(self.in1)
        self.pwm1.freq(self.frekans)
        self.pwm1.duty(self.MAX_DUTY)
        self.pwm2 = machine.PWM(self.in2)
        self.pwm2.freq(self.frekans)
        self.pwm2.duty(self.MAX_DUTY)
        
    def deinit(self):
        #pwm vs iptal etmek için
        self.pwm1.duty(self.MAX_DUTY)    
        self.pwm2.duty(self.MAX_DUTY)
        self.pwm1.deinit()
        self.pwm2.deinit()
        
    def sola(self, dalga_orani):
        self.duty = dalga_orani
        self.pwm2.duty(self.MAX_DUTY)        
        self.pwm1.duty(self.MAX_DUTY - self.duty)
        self.sd1.value(0)
        self.sd2.value(1)        
        
    def saga(self, dalga_orani):
        self.duty = dalga_orani
        self.pwm1.duty(self.MAX_DUTY)
        self.pwm2.duty(self.MAX_DUTY - self.duty)
        self.sd1.value(1)
        self.sd2.value(0)
        
    def fren(self, fren_zamani):#ms cinsinden
        self.zaman = fren_zamani
        #fren kodlari
        self.sd1.value(1)
        self.sd2.value(1)
        self.pwm1.duty(1023)
        self.pwm2.duty(1023)
        time.sleep_ms(self.zaman)
        #fren bırakma kodları
        self.sd1.value(0)
        self.sd2.value(0)
        self.pwm1.duty(self.MAX_DUTY)
        self.pwm2.duty(self.MAX_DUTY)
        
    def durdur(self):
        #durdurma kodları
        self.pwm1.duty(self.MAX_DUTY)    
        self.pwm2.duty(self.MAX_DUTY)
        
def main():        
    btn1 = machine.Pin(14, machine.Pin.IN, machine.Pin.PULL_UP)
    btn2 = machine.Pin(12, machine.Pin.IN, machine.Pin.PULL_UP)

    sd1 = machine.Pin(16, machine.Pin.OUT, value = 1)
    sd2 = machine.Pin(5, machine.Pin.OUT, value = 1)

    in1 = machine.Pin(4, machine.Pin.OUT, value = 1)
    in2 = machine.Pin(0, machine.Pin.OUT, value = 1)

    #frekans = 1000#En fazla 1KHz esp8266 için

    motor1 = DC_MOTOR(in1, in2, sd1, sd2)

    print("Motor sola...")
    motor1.sola(900)
    time.sleep_ms(3000)

    print("Motor durdu...")
    #motor1.durdur()
    #time.sleep_ms(300)
    motor1.fren(10)

    print("Motor sağa...")
    motor1.saga(900)
    time.sleep_ms(3000)

    #motor1.fren(100)

    print("Motor durdu ve pwm deinit...\n")
    motor1.durdur()
    motor1.deinit()

if __name__ == "__main__":
    main()

Elbette ayırırım, çok teşekkür ederim. Fakat ayrı sürmenin mantığı ile ilgili beni bilgilendirebilir misiniz Mehmet Bey. Ben motorda aşırı akım gördüğümde pinlerin ikisini birden kapatmak, sorun yoksa ikisini birden lojik 1 yapmak için kullanacaktım. Yani birinin lojik 1 iken diğerinin 0 olması veya tam tersi, böyle bir senaryom normalde yok. Bu nedenle ikisini ayırmamıştım.

Yani SD pininin işlevinde bir PWM ile çalışma diye bir şey yok benim anladığım kadarıyla.

Ama ayrı ayrı sürmem gerekirse yapacağım tek iş şu: İkisini de normalde lojik 1'de tutmak. Aşırı akım gördüğümde ise ikisini de sırayla lojik 0 yapmak.

mehmet

#9
Alttaki şemayı uygulayamaz mısınız? Neden ACS'ye gerek duyuyorsunuz anlamadım.
Kodları inceleyiniz, Yön değişimi ve fren kısmında SD ayrı sürülmesi gerekiyor. Sadece IN pinlerinde PWM bulunmakta. 1023 değeri verilenleri bilerek bu şekilde yaptım; High(1) değerini pwm kanalından verebilmek için.
Donanımlar sizin senaryonuzu bilmez; onların kendi senaryoları, üreticisi tarafından belirtilmiştir.

Bir önceki resimde değerler yoktu ve bir kaç hata vardı...
Olan olmuştur,
olacak olan da olmuştur.
Olacak bir şey yoktur.
http://www.mehmetbilgi.net.tr
CC BY

Serk@n77

Alıntı yapılan: mehmet - 17 Ekim 2024, 16:46:18Alttaki şemayı uygulayamaz mısınız? Neden ACS'ye gerek duyuyorsunuz anlamadım.
Kodları inceleyiniz, Yön değişimi ve fren kısmında SD ayrı sürülmesi gerekiyor. Sadece IN pinlerinde PWM bulunmakta. 1023 değeri verilenleri bilerek bu şekilde yaptım; High(1) değerini pwm kanalından verebilmek için.
Donanımlar sizin senaryonuzu bilmez; onların kendi senaryoları, üreticisi tarafından belirtilmiştir.



Hocam neticede siz bu kodları deneyip sonuca ulaşmışsınız. Bu bilgi benim için kıymetli.

Fakat şaşırdığım konu ir2104 entegresinin datasheet'ini incelediğimde SD pininin motora yön verme işlevini göremiyorum. Shut down yani entegreyi kapat. Yani Hout, Lout 0. Mosfetler devredışı.

mehmet

Mosfetleri ayrı ayrı kontrol edebilmek için IR2103 kullanabilirsiniz.
Olan olmuştur,
olacak olan da olmuştur.
Olacak bir şey yoktur.
http://www.mehmetbilgi.net.tr
CC BY

Serk@n77

#12
Tamam şimdi oldu.

Resim güncellemesi için de çok sağolun.

Powered by EzPortal