Etepic

Ana Tema => Devre Elemanları , Malzeme Bilgisi => Konuyu başlatan: Serk@n77 - 14 Ekim 2024, 15:10:55

Başlık: IR2104 Mosfet Sürücü
Gönderen: Serk@n77 - 14 Ekim 2024, 15:10:55
(https://i.ibb.co/tCzHN68/jGSGD.png) (https://ibb.co/tCzHN68)

İ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.
Başlık: Ynt: IR2104 Mosfet Sürücü
Gönderen: 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.
Başlık: Ynt: IR2104 Mosfet Sürücü
Gönderen: Serk@n77 - 14 Ekim 2024, 18:30:42
Hocam lojik 1 ile %100 duty PWM aynı şey değil midir?
Başlık: Ynt: IR2104 Mosfet Sürücü
Gönderen: Serk@n77 - 15 Ekim 2024, 13:54:21
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?
Başlık: Ynt: IR2104 Mosfet Sürücü
Gönderen: mehmet - 15 Ekim 2024, 20:25:37
Mecburuz demeliyiz. %95 civarında veya daha az olabilir. Ölçerek yapmak daha uygun olacaktır.
Başlık: Ynt: IR2104 Mosfet Sürücü
Gönderen: Serk@n77 - 16 Ekim 2024, 16:14:53
(https://i.ibb.co/MfMYN4c/IMG-20241016-141503.jpg) (https://ibb.co/MfMYN4c)

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.
Başlık: Ynt: IR2104 Mosfet Sürücü
Gönderen: Serk@n77 - 16 Ekim 2024, 16:20:00
Devreyi denedikten sonra da sonuçları sizlerle paylaşacağım. Umarım bir sorunla karşılaşmam.  :)
Başlık: Ynt: IR2104 Mosfet Sürücü
Gönderen: mehmet - 16 Ekim 2024, 19:03:58
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()
Başlık: Ynt: IR2104 Mosfet Sürücü
Gönderen: Serk@n77 - 16 Ekim 2024, 22:38:42
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.
Başlık: Ynt: IR2104 Mosfet Sürücü
Gönderen: mehmet - 17 Ekim 2024, 16:46:18
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ı...
(https://i.ibb.co/M6Dc8J2/resim.png) (https://ibb.co/xHS1mrC)
Başlık: Ynt: IR2104 Mosfet Sürücü
Gönderen: Serk@n77 - 17 Ekim 2024, 18:39:50
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.

(https://i.ibb.co/CWgGB5r/resim.png) (https://ibb.co/kMjCKgd)

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ışı.
Başlık: Ynt: IR2104 Mosfet Sürücü
Gönderen: mehmet - 17 Ekim 2024, 19:26:06
Mosfetleri ayrı ayrı kontrol edebilmek için IR2103 kullanabilirsiniz.
Başlık: Ynt: IR2104 Mosfet Sürücü
Gönderen: Serk@n77 - 17 Ekim 2024, 22:19:20
Tamam şimdi oldu.

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