BLDC motor faz akımı ölçümü ve RMS değer hesaplama

Başlatan sedronjames, 17 Mayıs 2022, 16:08:43

sedronjames

Merhabalar


BLDC motorda faz akımlarını ölçmek istiyorum. STM32G431 mikro denetleyici kullanıyorum.
Şönt direnç üzerinden geçen akım opamp ile kuvvetlendirilerek ADC kanalına geliyor.
Motor sürme PWM frekansım yaklaşık 18 kHz.

ST, TI, Microchip gibi birkaç tane firmanın dökümanlarından okuduğum kadarıyla motora uygulanan PWM sinyalinin tam ortasında ADC ölçümü alınması gerektiği yazıyordu.
Mantığını anladım ancak uygulayabilmek için devamını getirmedim.

Böyle bir uygulamada ADC örneklemelerini ne zaman nasıl bir sırayla almak gerekir kestiremedim. DMA ile mi kurgulamak gerekir, yoksa her çevrim için ADCyi açıp kapamak mı gerekir? Kafam çok karışıyor. Bilgi sahibi arkadaşlar yardımcı olabilir mi lütfen?



Bunun yanında Akımı anlık olarak okuduktan sonra RMS değerini de bulmam gerekiyor. Bunun için nasıl bir algoritma kurabilirim? Motor hızı arttıkça akımın da frekansı değişecek. Dolayısıyla periyodum da değişecek. Periyodu elde etmek için motorun frekansını mı kullanmalıyım? Hali hazırda Hall Sensörleri ile Motor hızı ölçüyorum zaten.


İyi forumlar dilerim.


frat

Çok hassas olmayacaksa devamlı ölçüm de yapabilirsiniz, Akım sensörü çıkışındaki RC filtre zaten çıkan sinyali yumuşatmaktadır. Anlık akım ölçümünde işlemci tepe noktaları da yakalayabilir, motor sürücüde çok istemediğimiz bir durum.

Kendi fırçasız motor sürücü tasarımımızda PSOC kullandık, PWM HIGH çıkışlarında ADC'yi aktif ederek (PSoc'da devre şeması yapar gibi ADC ve PWM blok çıkış ve tetiklerini birbirine bağlayabiliyoruz) sadece High side aktifken ölçüm yapmasını sağladık. Yalnız bu iş 24V 50A'lik bir sistem kontrolü içindi, sizdeki değerler için gerekmeyedebilir. Belirttiğim gibi hem motorun indüktif yükü hem Akım sensörlerinin RC filtreleri faz akımları çıkışını yumuşatıyor, düşükte de yüksekte de benzer sonuçlar alabilirsiniz.
DataCNC ve Robotus Mühendislik Kurucusu // https://www.robotus.net & https://www.datacnc.com

ex_machina

#3
Kullandığın MCU'da 2 adet bağımsız ADC, 4 adet dahili analog comparator ve 3 adet dahili op-amp varmış. İstediğini yaparsın bununla.

Diğer taraftan bu sorunun ucu çok açık. Kontrol topolojisi nedir? Kaç tane fazdan akım ölçülüyor? Akım ne için ölçülecek? vs...
Her neyse. Kontrol topolojisi olarak klasik six-step, akım ölçmek için ise 3 faza ortak bağlanmış şönt kullandığını varsayıyorum.

Motorlarda akım kontorlü genelde ikiye ayrılıyor:

-Katastropik durum: Burda amaç akımı hassas bir şekilde ölçmekten ziyade, kısa devre, rotorun kitlenmesi, aşırı yüklenme gibi uç durumlarda olabilecek en az gecikmeyle
tüm çıkışları kapatıp sürücünün yanmasını engellemektir. Bunun için dahili komparatörü kullanabilirsin. Komparatörün bir ucuna şönt gerilimini diğer ucuna referans gerilimi girersin(referans gerilimi senin maksimum akım sınırını belirler. MCU'nun DAC çıkışını doğrudan dahili comparatöre içerden bağlayarak bu sınırı dinamik bir şekilde istediğin gibi ayarlayabilirsin.)

-Kontrol ölçümü: Tork kontrolü veya telemetri verisi olarak akım ölçmeye diyebiliriz. Telemetri verisi olarak akım ölçeceksen eğer şönt gerilimi-> dahili op-amp->dijital low-pass filtre sırasını takip ederek minimum devre elemanı ile akımı hassas bir şekilde ölçebilirsin.
Tahmin edeceğin gibi bu şekilde bir ölçüm dinamik tork kontrolu için çok yavaş kalır. Hızlı ve etkili tork kontrolü için ortalama yöntemiyle akım ölçmek daha mantıklı.

İşte şimdi senin bahsettiğin pwm'min tam ortasında akım ölçme konusunua geldik. Bir bobine kare dalga uyguladığımızda akım lineer bir çizgi şeklinde yükseliyor. Çizginin tam ortasında ölçüm yaptığımızda ortalama akımı almış oluruz. MCU ile bunu yapmanın çok farklı yöntemleri var. En kolayı şöyle oluyor:

Şimdi senin MCU'da dahili op-opamp çıkışları içerden ve doğrudan ADC'ye bağlanabiliyor. Önce şönt gerilimini 1.65V bias ile dahili op-amplardan birine gir.
Op-amp yükseltme kazancını öyle bir ayarlamalısın ki şöntün üzerinden maksimum akım geçtiğinde op-amp çıkışı +-1.65 voltu geçmesin.

-ADC'nin regular kanallarını, kulanıcı potansiyometre girişi, NTC vs. gibi hız gerektirmeyen ölçümler için scan ve regular conversion modunda, belirli periyotlarda yazılım tarafından tetiklenecek şekilde kullan.
Aynı ADC'nin 4 adet injected kanalı var. Bu kanallardan birinine şönt gerilimini yükseltmek için kullandığın op-ampın çıkışını içerden bağla ve trigger olarak "timer1 trigger output" ayarını kullan. Aynı zamanda DMA'yı da injected kanallarla senkron çalışacak şekilde ayarla.

-Daha sonra Timer1'i "center-aligned pwm mod-1" olacak şekilde ayarla.(Bu modda çıkış frekansın yarıya düşecek, o yüzden ARR değeri ve dolayısıyla PWM çözünürlüğün de yarıya düşecek)

-"Repetetion counter" bölümüne 1 değerini gir.

-Timer1 trigger çıkışını "update event" olacak şekilde ayarla. Böylece timer1 counter her overflow ve underflow olduğunda bir "update event" oluşacak.
Ancak biz "overflow update event" olduğunda ADC çalışsın istemiyoruz. Çünkü burası PWM'in low level olduğu nokta. Bu yüzden Repetetion counter'a 1 girdik.

Timer1 trigger output'u "update event" olarak ayarladığımız için, her update event'te donanımsal olarak ADC'ye bir start sinyali gidecek ve ADC center-aligned PWM'in tam orta noktasında örnek alacak ve sonuç DMA aracılığıyla doğrudan pointer ile gösterilen değişkene aktarılcak.
Tüm bu süreç büyük oranda donanımsal olduğu için ez az zaman kaybıyla gerçekleşecek. Böylece iki PWM periyodu arasında kalan zaman, akım kontrol algoritmalarını
sürmek için fazlasıyla yetecek.





sedronjames

@ex_machina  muhteşem bir anlatım. Tam olarak dediğinizi yapıyorum. six step sürüş ile bldc motor sürmeye çalışıyorum. akım ölçümünü de faz akımlarının rms değerlerini bulmak için yapıyorum.
Bir smart gate driver kullanığım için içerisinde 3 adet low side shunt amplifier var. Akım analog bilgisini oradan alıyorum. ADC'leri de dediğinize yakın bir biçimde low side PWM'lerin orta noktasında okuma yapacak şekilde ayarladım. Motor sürme frekansım 18 kHz ve 18kHz'de akım örneklemesi yapıyorum. Daha sonra RMS değeri elde ediyorum.
Ancak şöyle bir sorun var hocam. akım ölçümü low side'da yapabildiğim için PWM duty cycle oranı artınca akımların low sidedaki dalga formu sapıtıyor. şöyle örnek vereyim: PWM %95 olsun, Low side tarafındaki pwm de haliyle %5 oluyor. bu %5'lik kısımda akımın iniş çıkış hızı cok fazla. yani low side anahtarı iletime geçiyor, akım tam yerine oturamadan low side anahtarı kesime geçiyor. birkaç opamp datasheeti inceledim. opampların da yerleşme zamanı varmış. sanırım oradaki anahtarlama süresi bu yerleşme zamanının altında kaldığı için akım tam yerine oturamadan tekrar sıfır noktasına düşüyor.

İşte bu aralıklarda ölçümlerimde ciddi hatalar oluşuyor. Yine buna bağlı olarak Pwm Duty cycle oranını %100 yaptığımda ise low sidedan o anahtarlama sekansı boyunca hiç akım geçmediği için, motor faz akımının (tam hatırlamıyorum ama) eksi alternansı adc tarafında hiç görünmüyor bile. Bu sorunu nasıl çözebilirim üzerinde çalışıyorum.

Bu arada six-stepten sonra foc sürüşe geçmek istediğim için akım okuma benim için oldukça önemli. Aynı zamanda güç elektroniğine de ilgim var. O taraflarda da işime yarayacaktır mutlaka böyle düşük bütçeli akım okuma algoritmaları.

Verdiğiniz cevap için ayrıca teşekkür ederim. Sorun yaşayan arkadaşlar için muhteşem bir kaynak olacaktır. 

ex_machina

Şöntleri nasıl bağladın?


ve PWM uygulama mantığı nedir?


Resimlere bakarak söyleyebilir misin?

(resimleri aldığım dökümanlar: tık, tık)

sedronjames

3 fazın da low side'ında şöntler bağlı yani üstteki resimde figür 5 'te olduğu gibi.

ben anahtarlama için smart gate driver kullanıyorum. yaklaşık 18 kHz pwm'i referans olarak veriyorum. Smart gate driver complementry pwm uyguluyor mosfetlere.

ex_machina

#7
Eğer motoru sinus-PWM ya da space-vector-PWM ile sürseydin, evet gate-driver'in tek PWM sinyalinden bir çift complementary PWM oluşturma özelliğini kullanabilirdin.
Ama sen complementaty PWM ile six-step sürüyorsun. Six-step sürüşte her sektörde sadece iki mosfet aktif. Çakışma olmaması için Figure-9 ile gösterildiği gibi bir mantıkla complementary PWM uygulaman gerekiyor.
İşte bu şekilde bir PWM uygulayabilmek için mecburen 6 kanal PWM sinyalini ayrı ayrı gate-driver'a girmen gerekecek.

Akım konusuna gelince;
Daha önce dediğim gibi, center-aligned-pwm mode1 ve Repetition Counter = 1 ayarlarını kullanırsan sadece high-side PWM'in ortasında örnek alır. PWM'in low olduğu kısmı pas geçer. Ayrıca örnekleme periyodun hep sabit kalır. (PWM periyodunla aynı olur) Bu şekilde ortalama akımı ölçebilirsin(RMS değil!)
PWM duty cycle çok az olduğundaki gürültüden etkilenmemek için low-pass filtre kullan.




Doğru bir şekilde RMS ölçümü için akımın sıfıra indiği yerleri de örnekleme kümesine katmak lazım. İkinci ADC'yi bu iş için kullanabilirsin mesela.
Fazlardan birinin şönt yükseltecini kesim frekansı çok düşük olan bir low-pass filtreden geçirip ADC2 ye girebilirsin.
Ya da VESC sürücülerdeki gibi istendiği zaman, bir analog switch yardımıyla kesim frekansı dinamik olarak değiştirilebilen low-pass filtre koyabilirsin.



Tim1 ile senkron ama TIM1'in frekansından çok daha yüksek frekansta(mesela 100Khz) çalışan ikinci bir timer ile tetikleyerek 10ms boyunca örnek toplarsın(1000 örnek yapar). Her 10 milisaniyede topladığın bu örneklerin RMS değerini bulup bias voltajını çıkarırsan faz akımını RMS olarak bulabilirsin.  Örnek sayısı arttıkça hassasiyet artar ama buna karşılık lag da artar.





sedronjames

Alıntı yapılan: ex_machina - 08 Haziran 2022, 22:44:57Akım konusuna gelince;
Daha önce dediğim gibi, center-aligned-pwm mode1 ve Repetition Counter = 1 ayarlarını kullanırsan sadece high-side PWM'in ortasında örnek alır. PWM'in low olduğu kısmı pas geçer. Ayrıca örnekleme periyodun hep sabit kalır. (PWM periyodunla aynı olur) Bu şekilde ortalama akımı ölçebilirsin(RMS değil!)
PWM duty cycle çok az olduğundaki gürültüden etkilenmemek için low-pass filtre kullan.


Bu aklımda hocam. bir sonraki tasarımda timer1 kullanacağım. şu an timer3 kullanıyorum ve timer3te repitation counter yok. bu yüzden hem overflowda hem underflowda tetik üretip adc tetikliyor. ben de bunun önüne geçebilmek için yine timer3te başka bir kanaldan pwm oluşturdum low sideların orta noktasına denk gelecek şekilde.


bununla beraber adc girişinde low pass filter var ancak değerleri değiştireceğim şimdi.

ancak %100 duty cycle uyguladıgımda ne yapacağıma dair fikrim yok su an.

setupı tekrar kurduğumda osiloskop görüntüleri de paylaşacağım.

yardımınız için minnettarım.

iyi forumlar dilerim.

ex_machina

Alıntı yapılan: sadogaffari - 09 Haziran 2022, 08:39:12ancak %100 duty cycle uyguladıgımda ne yapacağıma dair fikrim yok su an.

Duty cycle %100 olsa bile Timer update trigger her underflow event'i meydana geldiğinde, periyodik bir şekilde ADC'yi tetiklemeye devam eder.

sedronjames

evet hocam ADC'yi tetikliyorum onda sıkıntı yok. Benim sorunun %100 pwm verdiğimde adc'ye sinyal gelmiyordu artı alternanstayken. Ancak bunun nedenini de öğrendim. Çok temel bir kuralmış aslında. örnek olarak A fazında PWM ve C fazının da low side'ı iletimde olsun. A fazının PWM on time'ı boyunca Vbus'tan çıkan akım A fazının high side'ından başlayarak sırasıyla A bobini -> C bobini -> C low side'ından geçerek gnd'ye ulaşır ve  devreyi tamamlar. PWM off time'ında ise endüktif yük olduğundan dolayı akım ani olarak kesilemeyeceği için A fazının low Side body diyotundan geçerek devreyi tamamlar. işte bu PWM off durumunda iken oluşan akım %100 pwmde oluşamayacağı için adc'de bu akımı göremiyordum.  şimdi tüm akımları hangi hall statelerde oluşuyorsa orada okumaya çalışcağım.