STM32, PWM ve H-Bridge

en önemli ve meşakkatli kısımlardan birisi de akım okuma. nerede ve nasıl okuyacağın çokomelli. sensör mü kullanmayı planlıyorsun, şönt direnç mi?
 
en önemli ve meşakkatli kısımlardan birisi de akım okuma. nerede ve nasıl okuyacağın çokomelli. sensör mü kullanmayı planlıyorsun, şönt direnç mi?
Motorun anma akımı 0.8A o yüzden INA226 ile i2c üzerinden 2 akım hattını okuyayım diyorum ama ileride şönt direnci ile okumayı da deneyebilirim. Şönt direnci konusunda tek sıkıntım akımın negatif okunması gerektiği durumlarda bunu nasıl yapacağımı anlamamış olmam. Sanırım en pratik yöntem op-amp+ offsetli adc ama pratik olsun diye şu anlık INA226'ya gideceğim gibi duruyor. Okuma işini de motorun girişinden yapmayı planlıyorum.[math]IC = -(IA+IB)[/math] şeklinde okuyarak da üçüncü akımı bulacağım.
 
Bu bana biraz sakat bir yöntem gibi geldi sonuçta PWM sinyal ve 20kHz gibi seviyelerde çalışacak. Bunun yerine eğer tersliyorsa PWMN ile PWM'i ters düşünürek çalıştırmak daha az yorar gibi ama kaçırdığım bir nokta varsa açıklarsan sevinirim.
Yukarıdaki mesajda @clc açıklamış, benzer cümleler ile bende katkıda bulunayım.
Yazılım ile pwm sinyalinin tersini alabilirsinz burada sorun yok, fakat mcu nun çalışmadığı durumlarda, (mcu açılış sonrası ve pwm donanım ayarlarının yapılıncaya kadar geçen süre, geliştirme devam ederken güç hattı enerji altında iken yeni yazılım yükleme sırası... vb.) HIN ve LIN high olduğunda mosfet sürcüde bir koruma yoksa, Q1 ve Q2 üzerinden besleme hattı kısa devre olur.

İlla ilk yapıdaki gibi bağlantı yapmak istiyorsanız IL2101 yerine IL2102 kullanın.

Öneri: IL21XX vcc si olarak+12V kullanıyorsanız opto kollektöründe kullandığınız +5V u da +12V yapın.
 
Yukarıdaki mesajda @clc açıklamış, benzer cümleler ile bende katkıda bulunayım.
Yazılım ile pwm sinyalinin tersini alabilirsinz burada sorun yok, fakat mcu nun çalışmadığı durumlarda, (mcu açılış sonrası ve pwm donanım ayarlarının yapılıncaya kadar geçen süre, geliştirme devam ederken güç hattı enerji altında iken yeni yazılım yükleme sırası... vb.) HIN ve LIN high olduğunda mosfet sürcüde bir koruma yoksa, Q1 ve Q2 üzerinden besleme hattı kısa devre olur.

İlla ilk yapıdaki gibi bağlantı yapmak istiyorsanız IL2101 yerine IL2102 kullanın.

Öneri: IL21XX vcc si olarak+12V kullanıyorsanız opto kollektöründe kullandığınız +5V u da +12V yapın.

tavsiyeye uyarak optoyu 6N137 olarak değiştirdim. Bu yüzden 12V kullanamıyorum. Devre aşağıdaki hale geldi.


H Bridge 3.JPG

InputEnableOutput
LHH
HHL
LLH
HLH

6N137'nin yukarıdaki gibi bir doğruluk tablosu var. Bu yüzden burada çıkış yazılımsal olarak mecbur ters ayarlanacak.

Uygun bir dead time koyacağım, G-S aralarına TVS diyot atarak da mosfetleri ekstra korumaya alabilirim. Direkt olarak HIN ve LIN'ı aynı anda kısa devre durumundan korumak için yazılımsal ayarların dışında donanımsal olarak yapabileceğim ekstra bir şey var mı?
 
Son düzenleme:
Motorun anma akımı 0.8A o yüzden INA226 ile i2c üzerinden 2 akım hattını okuyayım diyorum ama ileride şönt direnci ile okumayı da deneyebilirim. Şönt direnci konusunda tek sıkıntım akımın negatif okunması gerektiği durumlarda bunu nasıl yapacağımı anlamamış olmam. Sanırım en pratik yöntem op-amp+ offsetli adc ama pratik olsun diye şu anlık INA226'ya gideceğim gibi duruyor. Okuma işini de motorun girişinden yapmayı planlıyorum.[math]IC = -(IA+IB)[/math] şeklinde okuyarak da üçüncü akımı bulacağım.
Akım değeri hangi sıklıkla alınacak? I2C üzerinden 16 bit read mesajı START + SLA+R + ACK + HBYTE + ACK + LBYTE + NACK + STOP = 29 scl kadar zaman alır. 400KHz SCL için >>> 1000/(400/29) =72.5 usec. Bunun dışında datasheet'de Frequency Response grafiği 200 Hz den sonra ciddi düşüş olduğunu söylüyor. Bu da sıkıntılara yol açabilir.
STM32 üzerinde 1Msmp/sec hıza kadar çalışan ADCler var (gerçe o hızlarda hassasiyetle iligili sorunlar çıkıyor diye şikayetler duydum). Lakin ek entegre kullanmaktansa işlemcinin olanakları ile idare etmek daha mantıklı gibi duruyor.
 
Akım değeri hangi sıklıkla alınacak? I2C üzerinden 16 bit read mesajı START + SLA+R + ACK + HBYTE + ACK + LBYTE + NACK + STOP = 29 scl kadar zaman alır. 400KHz SCL için >>> 1000/(400/29) =72.5 usec. Bunun dışında datasheet'de Frequency Response grafiği 200 Hz den sonra ciddi düşüş olduğunu söylüyor. Bu da sıkıntılara yol açabilir.
STM32 üzerinde 1Msmp/sec hıza kadar çalışan ADCler var (gerçe o hızlarda hassasiyetle iligili sorunlar çıkıyor diye şikayetler duydum). Lakin ek entegre kullanmaktansa işlemcinin olanakları ile idare etmek daha mantıklı gibi duruyor.
Vallahi çok güzel yaklaşım ama dediğim gibi işin acemisiyim şu anda. Normalde her bir while döngüsü (artık ne kadar sürerse + 1ms) ile okumayı planlıyordum. Akımları projenin ilerleyen zamanlarında ADC ile okumayı planlıyorum. Şu anda ilk amacım şu motoru H-Bridge ile çalıştırmak ve hızını ayarlayabilmek. Daha profesyonel yaklaşıma bir süre sonra geçeceğim. Söylediklerinizi not aldım.
 
Bu gerilim seviyeleri için izolasyon gerçekten gerekli mi emin değilim? Ben olsam hazır paketli IPM kullanırdım bu arada. Yine de discrete yapacağım derseniz 3-Faz Half Bridge Gate Driver çipleri var onları kullanabilirsiniz, daha kompakt bir çözüm olur. İzolasyonsuz 74HC244 ile güçlendirip gönderin gitsin, hatta direk MCU push pull çıkışlarını bile bağlayabilirsiniz. İzolasyon olsun derseniz TLP2745 kullanabilirsiniz. Optoları yine 74HC244 ile sürebilirsiniz.
 
Akım okuma için faz akımı okunacaksa ACS712 türevi bir ürün yeterli olacaktır. Eğer DC Bus akımı okunacaksa Shunt + Opamp yükselteç yapısı kurgulanabilir. Benim tercihim işleri kolaylaştırmak adına faz akımı ölçmek yönünde olacaktır.
 
Bu gerilim seviyeleri için izolasyon gerçekten gerekli mi emin değilim? Ben olsam hazır paketli IPM kullanırdım bu arada. Yine de discrete yapacağım derseniz 3-Faz Half Bridge Gate Driver çipleri var onları kullanabilirsiniz, daha kompakt bir çözüm olur. İzolasyonsuz 74HC244 ile güçlendirip gönderin gitsin, hatta direk MCU push pull çıkışlarını bile bağlayabilirsiniz. İzolasyon olsun derseniz TLP2745 kullanabilirsiniz. Optoları yine 74HC244 ile sürebilirsiniz.
IKCM30F60GA gibi hazır paket IGBT düşündüm ama sonradan fikir değiştirdim. Yani aslında kabaca H-Bridge tarafını bu şekilde bitirmeyi planlıyorum. ACS712'ye gelecek olursak o da bir alternatif aslında o aklımdan çıkmış yoksa fikir olarak onu da düşünüyordum. Bu fikirleri gelecekteki olası değişimler için not alıyorum. Daha sonrasında daha büyük voltajlarla çalışabilmek için aslında optoyu tercih ediyorum.
 
Son düzenleme:
Biraz daha açıklar mısın?
Eklediğiniz devre bootstrap tekniği ile çalışır. Üst mosfetin iletime geçebilmesi için C1 kondansatörünün D1 ve alt mosfet ile şarj edilmesi gerekiyor o yüzden hiç bir zaman %100 duty cycle ile çalışmaz %90-%95 duty cycle ile çalıştırılır ve bu sayede alt mosfet belirli aralıklarla iletime geçerek C1 kondansatörü şarj olur.

Ben zamanında bu video ile anlamıştım belki daha açıklayıcı olur.
 
Toplamda en az 3 + 1 + 1 izole çıkışlı bir güç kaynağı da tasarlamak zorunda kalacağınızı unutmayın...

3 Kanal-> U,V,W High Side FLoating kaynak (15V)
+1 Kanal-> U,V,W Low Side kaynak (15V)
+1 Kanal-> Kontrol kartı beslemesi (muhtemelen 24V, veya duruma göre 12V, 5V vb)

Bootstrap dezavantajları olsa da uygulaması basit ve yaygın kullanılan bir teknik, özellikle bu güç seviyelerinde hem maliyet optimize hem de çok büyük oranda ihtiyaçları eksiksiz karşılıyor.
 
Bootstrap evet ucuzcu devrelerin çoğunda kullanılıyor. Ama pat pat patlamaya başladığında arkadaş devresine odaklanmaktansa bootstrap sürücü ile uğraşmak durumunda kalacak. Bunu ancak yaşayanlar bilir. O zaman özellikle deneysel yapılarda 10-15 dolar fazla vereydim de başım ağrımasaydı dersiniz.

Ayrıca ezberden gidilmediğinde verdiğim devre öyle esnek ki. Anlatayım.

1) Üst ve alta ayrı ayrı izole beslemeler kullanarak kafa rahatlığı ile %100'e kadar açarsın mosfetlerini. Sorun olmaz. Özellikle FOC yapacaksan ve sınırlarda çalışacaksan çok önemli. Millet VBUS etkisini, faraday dedenin mirasından dolayı, artırmak için alan zayıflatmalar, 3. harmonik enjekte etmeler kullanıyor. Dediğim gibi her bir duty'nin altın değeri olacak. Space Vector PWM ürettiğinde anlayacak arkadaş dediğimi. Dead time bile çok önemli olacak.

2) Ucuzculuk mu istiyorsunuz, alttaki devreyi kurarsın. Yeşil kısma dikkat. 12V'u ana devreden ayırarak izole verirsen, 3 driver için 1 izole 12V üretmek yeter böylelikle, süper olur yine ucuzcu yöntemle bootstrap fan tayfasının beğendiğini yapmış olursun.

3) Daha da mı ucuzculuk istiyorsun, kırmızı ile çizdiğim GND'yi devrene bağlar, 12V'tunu da ana devrenden verirsin, yukarıdaki devrenin aynını yaparsın. Birazcık PCB çizimine dikkat ettin mi tamam.

Bootstrapçi fan tayfa da, neden yukarıdaki üst kattaki driver'ın izole olmasının faydalı olduğunu bizlere anlatsın.

Ayrıca bu devre ile alt ve üst mosfete aynı anda sinyal verdiğinde devrenin patlamasını önlemiş olursun. Ayrıca minimum dead time da ayarlayarak yine mosfetlerin patlamasının önüne geçersin.

Hemen izole driver görünce ezberden 86 tane izole besleme koymaya gerek yok. Bazen elektriksel sinyallerin kaliteli olmasını istediğimiz için de izolasyonu kırarak izolasyonlu yapılar kullanabiliriz.

İki kuruş kar getirecek diye, şu dandik IR2101'i kullanmayın artık. Yemin etsem başım ağrımaz, bu salak entegre yüzünden patlayan mosfetlerin ücretlerini toplasak ülkeye sıfırdan mosfet üretim fabrikası kurardık. Erol Evgin'in gençlik zamanında çıktı entegre, adam yaşlandı gitti, bizim süper zeka mühendis tayfa hala bu entegreyi kullanıyor...

1737574259086.png
 
Bootstrap mükemmel değil, iyi tanırsanız ve uygulayabilirseniz sorunsuz, bunu söyleyebiliyorum çünkü sahada çalışan on binlerce cihaz (ismini ezbere bildiğimiz birçok büyük markanın endüstriyel tip motor hız kontrol cihazı ürünleri de dahil) bu tekniği kullanıyor. Hem de çok şaşırtıcı belki ama bu ürünler aynı zamanda Vektör Kontrol (namı diğer FOC) özelliğine sahip.

Yeşil ile çizdiğiniz kısım Bootstrap. İzole gate driver alacağım, önce onunla bootstrap yapacağım, sonra bir de işlemci ve geri kalan devreleri aynı beslemeden vereceğim. Yani hem pahalısını alacağım, hem de pahalı olmasına sebep olan imkanları kullanmayacağım, bunu neden önerdiğinizi anlamadım doğrusu?

Her neyse, amaca yönelik doğru teknik ve ürün seçimi yapmak hepimizin her gün karşılaştığı zorluklardan sadece ikisi, bunu gerçekleştirebilmek için de piyasada kullanılan kendini ispatlamış tüm tekniklere ve ürünlere hakim olmak gerekiyor, seçenek çok, tercih yapmak da tasarımcı arkadaşın sorumluluğunda, paşa gönlü nasıl istiyorsa öyle yapsın :)
 
IR2101 tasarımın son noktasında kullanılacak olan sistem değil. Başlangıç hiç FOC bilmediğim için hızlı şekilde kullan at, "3 PWM böyle çalışıyormuş vay be, demek ki şunu şöyle yapmalıyım" diyebileceğim bir entegre olduğundan kullanmak istiyorum. Yoksa asıl temelde (yine bootstrap kullanan) L6398 temelli bir devre kurmak için yola çıktım fakat bunu bulmak zor ve FOC öğrenmek için pratik malzemelere gitmek gerekiyor. Hatta ilk düşündüğüm entegre daha öncede belirttiğim gibi hazır IGBT olan IKCM30F60GA idi. Dediğiniz endişeleri anlıyorum, temelde bu konuyu da bu yüzden açtım.

NCD57252 entegresinden haberim yoktu. Zaten forumu kullanma amacımız da başka bir şeyler öğrenmek ya da öğretmek bu yüzden bir sonraki test aşamasında bununla da bir devre kuracağım. @Cemre. nin de bahsettiği gibi bunu öğrenmeden önce donanım olarak 5 farklı motor sürücüye baktım. Hepsi de (IR2101 kullanmıyorlardı) bootstrap ile çalışıyordu. Yani çok yaygın bir yöntem olduğu için bu yönde gitmek çok yanlış bir durum değil açıkçası.

Konuya şöyle özet getireyim. Bu FOC işini öğrenmek için biraz zamanım var ve kullan at şeklinde görece "çöp" entegreleri kullanarak öğrenmekte herhangi bir sorun görmüyorum.
 
Konuyu dağıtmamak adına yine buradan devam ediyorum.

Şimdi yukarıdaki tartışmalardan anladığımız kadarıyla bu devreyi üretmenin birden fazla yolu var. Fakat her birisinde aynı sorun ortaya çıkıyor. Akım ne zaman okunacak, FOC ve SVPWM ne zaman üretilecek?

Gariban H-Bridge devreme (IR2101 ile kurdum kızma kral @Taçsız Kral Pele) 12Vluk 3er led bağladım ve CA modunda frekansı 1Hz'e getirdim ki ledlerin hareketlerini gözlemleyebileyim. Bu gözlem sırasın şunu farkettim donanım olarak elimizdeki H-Bridge daima aynı vektör içerisinde 7 kez lokal olarak vektör (duty cycle değeri %0 veya %100 olmadığı sürece) değiştiriyor (7-Segment olarak geçiyor).

Bu durumda aklıma şu geldi, tüm ledlerin aynı anda 1 olduğu durumda akımı okursam sanırım en pürüzsüz akım bilgisini elde etmiş olurum. Sonra biraz araştırdım ve evet bu yöntem zaten en çok kullanılan yöntemmiş. Bu durumda benim tüm işlemleri aslında 1 PWM döngüsü içerisine sıkıştırmam gerektiği sonucu ortaya çıkıyor. Çünkü PWM dalgayı IT ya da DMA ile çağırdığım zaman PeriodElapsedCallback çağırılıyor ve benim burada bunu güncelleme yapmam gerekli ayrıca bu fonksiyon periyot tamamlandığında çalışıyor.

Şimdi detay olan soruma geleyim tüm hepsinin "1" olduğu durumda bu akım okumayı nasıl yapabilirim? Örneğin A = %85 DC, B = %45 DC, C = %15 DC olsun (verileri salladım araları 120 derece olmayabilir), tüm hepsinin "1" olduğu, toplam periyot süresinin %15'i kadar bir bölüm var. Tam olarak bu bölümde akımı okumak için ne yapmalıyım? Aklıma boş bir PWM kanalı açıp en düşük DC değerine ayarlayıp o tetiklendiği zaman akımı okumak gibi bir fikir geldi ama alternatif var mı merak ediyorum?

Yapay zeka 2 adet daha yöntem söyledi:

1-) En düşük duty cycle'a gelinceye kadar delay ekle ve öyle okuma yap
2-)ADC'nin Timer Triggered Mode özelliğini kullanarak PWM timerının belirli bir noktasında ADC dönüşümü başlatmak.

Not: DC'den kastım Duty Cycle
 
Son düzenleme:
Duty oluştururken up down counter denen PWM timer metodunu kullanacaksın. Datasheette görürsün, sayıcı yukarı kadar çıkıyor, sonra aynı şekilde aşağı kadar iniyor. STM'de buna up down counter deniyordu sanırım. O metotla duty üreteceksin bu cepte.

Sonrasında PWM timer'ın 0 ya da max olduğu noktada ADC'ye tetikleme atıcaksın. ADC'de bu noktada örnekleri toplayıp sana kesme ile iletecek al kardeşim okudum sonuçların bunlar dicek.

Hah işte tam o kesmenin içinde kontrol döngünü koşacaksın. Zaten motorları 10-20khz de kontrol etsek kafi. 50-100us'ler bir denetleyici için gayet uzun süreler. FOC hesaplaması bu kadar sürede biter. Alan zayıflatma da yapsan gayet yeterli olur.

Up down timer şeklini çizip, farklı farklı dutyler çiz kağıda. Göreceksin ki örnek aldığın tüm noktalar duty'nin tam ortasına denk gelecek. Bu da motor bobin akımının tam orta noktasına yakın olacak. Gürültüden uzak olacaksın dolayısı ile sorun yok.

Kısacası bu iş duty'den bağımsız, PWM ADC senkronunu yap yeterli. Yapay Zekanın 2. maddesine benziyor dediğim sanırım.
 

Forum istatistikleri

Konular
7,285
Mesajlar
123,159
Üyeler
2,939
Son üye
Cano

Son kaynaklar

Son profil mesajları

Freemont2.0 herbokolog Freemont2.0 wrote on herbokolog's profile.
nick iniz yakıyor
:D
Freemont2.0 posta Freemont2.0 wrote on posta's profile.
Merhabalar :)
az bilgili çok meraklı
Prooffy semih_s Prooffy wrote on semih_s's profile.
Merhaba, sizden DSO2C10 hakkında bilgi rica ettim. Yanıtlarsanız sevinirim...
Unal taydin Unal wrote on taydin's profile.
Timur Bey, Arduino kontrollü bir akü şarj cihazı yapmaya çalışıyorum. Aklımdaki fikri basit bir çizim olarak konu açmıştım. Özellikle sizin fikirlerinizi çok önemsiyorum.
Back
Top