STM32'de çoklu puls üretimi

Mucit23

Üye
Katılım
7 Ekim 2022
Mesajlar
85
Selamlar

STM32G4 serisi ile denemeler yapıyorum. Step motorlarla uğraşırken birden fazla step motoru sürme aşamasında hızlanma ve yavaşlama eğrilerinde değişken frekanslı puls üreteçlerine ihtiyacımız oluyor. Kullandığımız mcularda bir sürü Timer ve DMA donanımı var. Timer'lerde one puls modları vs zibilyon tane özellik var.

Birden fazla Step motor sürerken en az cpu yükü ve en fazla donanım desteğiyle step motor için nasıl puls ve dir sinyalleri üretilir? Yöntem ne olabilir? Örneğin Senkron bir şekilde 4 adet veya daha fazla step motor için hızlanma eğrileri ni hesaplayıp puls üretimi illa yazılım ağırlıklı mı olur?
 
3 step motorlu bir kontrol sistemi kullanıyorum. motorlar PID ile sürüldüğü için çok yavaş hızlardan yüksek ivmelere çıkıp iniyor. standart bir timer kullanarak pulse üretiyorum. step motor sürücüleri genelde step girişinde 40-50 us gibi pulse istiyor. saniyedeki pulse sayısı da hızını ayarlıyor. açıkçası timer'ın hangi değişkeni ile oynayarak kontrol ettiğimi hatırlamıyorum ama bakarım. işlemciye neredeyse hiç yük oluşturmuyor. timer interrupt içinde basit bir bölme hesabı ve step değişkenlerini kontrol ederek çalışıyor.

suradaki kütüphaneyi kendi projeme uyarlamıştım:


 
Marlin Firmware kullanmak gerekiyor sanırım. Bu kütüphanenin nasıl çalıştığına baktım. Ortalama 10-50Khz artık MCU frekansına göre bir interrupt rutininde bütün motorların hesapları paralel bir şekilde yapılıp puls üretiliyormuş. Marlin Kütüphanesini biraz incelemem lazım.
 
paralel değil tüm motor pulseleri bağımsız timerlar ile üretiliyor ve step sayıyor. yani kütüphanenin mantığı belli bir akselerasyon ve yavaşlama profili ile bir yöne belli step sayısı kadar gitmek.

Stepper_SetupPeripherals('X', &htim1, TIM_CHANNEL_3, GPIOB, GPIO_PIN_4);
Stepper_SetupPeripherals('Y', &htim2, TIM_CHANNEL_2, GPIOB, GPIO_PIN_10);
Stepper_SetupPeripherals('Z', &htim3, TIM_CHANNEL_2, GPIOA, GPIO_PIN_8);
 
Ben daha önce AccelStepper kütüphanesini kullandım. Bu kütüphanenin mantığı her interrupt rutininde MCU bir sonraki adım için timer preload ARR değerini hesaplar, Puls üretir ve timeri tekrar başlatır. Buradaki sorun Her motor için diyelim bir timer kullanılması. Motor her puls için interrupt rutininde ilgili motora ait hesaplamaları yapıp puls üretiyorsa bu problemli olabilir. Çünkü benim hedefimde 6 Adet step motor var. Bu kadar motor için ayrı ayrı kesmesi oluşuyorsa program sürekli ordan buraya dallanır. Sizin vermiş olduğunuz kütüphaneyi tam olarak inceleyemedim ama sanırım böyle çalışmıyor.
 

Forum istatistikleri

Konular
8,895
Mesajlar
144,585
Üyeler
3,576
Son üye
HsynDgn

Son kaynaklar

Back
Top