Picproje Elektronik Sitesi

MİKRODENETLEYİCİLER => ARM => Cortex ARM => Konuyu başlatan: ex_machina - 26 Mayıs 2022, 22:29:50

Başlık: CMSIS-DSP fonksiyonları Cortex-M0 üzerinde çalışyor mu?
Gönderen: ex_machina - 26 Mayıs 2022, 22:29:50
Cortex-M0 tabanlı mikrodenetleyicilerde hem DSP hem de FPU bulunmuyor. Bu durumda emülatörsüz float kullanamıyoruz burası tamam.
Peki q-data format tabanlı fonksiyonları kullanmak için DSP şart mıdır?

Mesela CMSIS-DSP kütüphanesindeki q15_t arm_sin_q15( q15_t x ) sinüs fonsiyonunu STM32F0xx serisi MCU'larda kullanabiliyor muyuz?
Başlık: Ynt: CMSIS-DSP fonksiyonları Cortex-M0 üzerinde çalışyor mu?
Gönderen: Tagli - 27 Mayıs 2022, 00:39:19
Evet, kullanılabilir. Hatta bildiğim kadarıyla CMSIS-DSP'nin tamamı (ya da büyük bir bölümü) M0'da da kullanılabilir. Ancak tabi özellikle float içeren fonksiyonların performansı olumsuz etkilenecektir.
Başlık: Ynt: CMSIS-DSP fonksiyonları Cortex-M0 üzerinde çalışyor mu?
Gönderen: ex_machina - 27 Mayıs 2022, 09:12:55
Alıntı yapılan: Tagli - 27 Mayıs 2022, 00:39:19Evet, kullanılabilir. Hatta bildiğim kadarıyla CMSIS-DSP'nin tamamı (ya da büyük bir bölümü) M0'da da kullanılabilir.
Aradığım cevap buydu. Teşekkürler.

Dokümanını tekrar inceledim, evet cortex-m0'da da çalışıyor. Gözden kaçırmışım.
M0 ile M4 arasında çok fiyat farkı var. O yüzden floattan vazgeçtim. Öyle aman aman hassas işler yapmadığım için fix-point ile sin, cos vb. trigonometrik fonksiyonları çözmeye çalışacam artık.
Başlık: Ynt: CMSIS-DSP fonksiyonları Cortex-M0 üzerinde çalışyor mu?
Gönderen: Cemre. - 27 Mayıs 2022, 12:38:53
Belki bir look-up table bile iş görebilir?
Başlık: Ynt: CMSIS-DSP fonksiyonları Cortex-M0 üzerinde çalışyor mu?
Gönderen: magnetron - 27 Mayıs 2022, 13:13:37
merhaba,

CubeIDE de kod yazarken sqrt() veya sin() fonksiyonlarını çağırınca FPU olmasa da zaten yazılımsal float işlemler yapmıyor mu

ayrıca DSP kütüphanesini kullanmak veya belirtmek neden gerekli - bilmediğimden soruyorum
Başlık: Ynt: CMSIS-DSP fonksiyonları Cortex-M0 üzerinde çalışyor mu?
Gönderen: Tagli - 27 Mayıs 2022, 14:02:04
Uygulamaya göre float da kullanılabilir. Tamamen işlem yoğunluğuna bağlı. Zamanında dandik bir dsPIC30f2010 (16 bit, float desteği yok) üzerinde float kullanarak PID kontrolör çalıştırmıştım. İç içe konum ve hız kontrolörü vardı. 5 ms zaman, çevrim için rahat rahat yetiyordu.
Başlık: Ynt: CMSIS-DSP fonksiyonları Cortex-M0 üzerinde çalışyor mu?
Gönderen: ex_machina - 27 Mayıs 2022, 16:29:52
STM32F030C8 ile basit bir deneme yaptım(clock 48Mhz).

Float ile fix-point arasında yaklaşık 9 kat hız farkı var.
Signed Q0.31 data format kullanılsa bile bir sinüs hesaplama çevrimi yaklaşık 4us sürüyor.
@cemre'nin dediği look-up table yöntemi çok daha hızlı.
Çözünürlük ve tablo boyutu kurtarırsa ordan yürürüm artık.

while(1)
{
  GPIOB->BSRR = 1U;
  output_angle_float = arm_sin_f32(input_angle_float);
  GPIOB->BRR = 1U;

  GPIOB->BSRR = 2U;
  output_angle_fix = arm_sin_q31(input_angle_fix);
  GPIOB->BRR = 2U;
}

(https://i.ibb.co/RhQnXR5/Untitled.png) (https://ibb.co/RhQnXR5)
Başlık: Ynt: CMSIS-DSP fonksiyonları Cortex-M0 üzerinde çalışyor mu?
Gönderen: ex_machina - 27 Mayıs 2022, 16:43:52
Alıntı yapılan: magnetron - 27 Mayıs 2022, 13:13:37merhaba,

CubeIDE de kod yazarken sqrt() veya sin() fonksiyonlarını çağırınca FPU olmasa da zaten yazılımsal float işlemler yapmıyor mu

ayrıca DSP kütüphanesini kullanmak veya belirtmek neden gerekli - bilmediğimden soruyorum

Yazılımsal FPU çok fazla kaynak ve zaman harcıyor. Float veri tipinde hata miktarı değişken olduğu ve özel donanım gerektirdiği için bazı durumlarda - mesela hız, düşük maliyet veya sabit hata istenenen durumlarda Fixed-point(bildiğimiz integer) veri tipleri kullanılıyor.

Ancak işin içine, seri gerektiren karmaşık matematik işlemleri girdiğinde bu da tam çare olmuyor. İşte böyle durumlarda integer tabanlı sayılar ve düşük maliyetli donanım ile hızlı işlem yapmak için kendine özgü komut seti olan DSP modülü devreye giriyor.
Başlık: Ynt: CMSIS-DSP fonksiyonları Cortex-M0 üzerinde çalışyor mu?
Gönderen: foseydon - 27 Mayıs 2022, 18:22:39
Alıntı yapılan: Tagli - 27 Mayıs 2022, 14:02:04Uygulamaya göre float da kullanılabilir. Tamamen işlem yoğunluğuna bağlı. Zamanında dandik bir dsPIC30f2010 (16 bit, float desteği yok) üzerinde float kullanarak PID kontrolör çalıştırmıştım. İç içe konum ve hız kontrolörü vardı. 5 ms zaman, çevrim için rahat rahat yetiyordu.

hocam dspic'lerde icerde float islerini hizlandiran kutuphaneler var. psuedo float diyebiliriz. ayrica yine dspic'in asm ile yazilmis pid kutuphaneleri var. bunlari da kullandiysan baya zaman farkeder. isin ozu islemciden islemciye fark eder. donanimsal ve yazilimsal destege gore yapilacak islem sureleri farklilik gosterecektir. deneyip bakmaniz lazim.
Başlık: Ynt: CMSIS-DSP fonksiyonları Cortex-M0 üzerinde çalışyor mu?
Gönderen: Tagli - 27 Mayıs 2022, 20:21:59
@foseydon , ben dümdüz float yazıp geçmiştim, herhangi bir kütüphane çağırmadım. Kendisi arka planda ne yaptı bilmiyorum.

Bu arada, CMSIS-DSP sinus hesabı gibi trigonometrik işlemleri arka planda tablo kullanarak yapıyor zaten. Fonksiyon dokümanında belirtmişler. Map dosyasında da tablonun eklendiğini görmek mümkün.
Başlık: Ynt: CMSIS-DSP fonksiyonları Cortex-M0 üzerinde çalışyor mu?
Gönderen: ex_machina - 27 Mayıs 2022, 22:29:02
Alıntı yapılan: Tagli - 27 Mayıs 2022, 20:21:59@foseydon , ben dümdüz float yazıp geçmiştim, herhangi bir kütüphane çağırmadım. Kendisi arka planda ne yaptı bilmiyorum.

Bu arada, CMSIS-DSP sinus hesabı gibi trigonometrik işlemleri arka planda tablo kullanarak yapıyor zaten. Fonksiyon dokümanında belirtmişler. Map dosyasında da tablonun eklendiğini görmek mümkün.
Anladığım kadarıyla en yakın değeri tablodan bulduktan sonra ara değeri interpolasyon ile buluyor.

Bu arada ben de yıllar önce dspic33 ve microchip smps-lib kullanarak 100kHz 2kW buck converter yapmıştım. Microchip'in smps kütüphanesinde hem donanımsal hem de yazılımsal 2kutup-2sıfır, 3kutup-3sıfır ve pid olmak üzere üç farklı dijital kompensatör bulunuyordu.

Ben akım ve gerilim için iki ayrı pid fonksiyonu kullanmıştım ve tuning işlemi beklediğimden kolay olmuştu. Ayrıca kütüphane doğrudan assembly tabanlı yazıldığından çok hızlı çalışıyordu.

Şimdi düşündüm de dspic serisi aslında çok kullanışlıymış. Ne fazla karmaşık ne de fazla basit, sıradan kullanımlar için tam ayarında. Niye kullanmaktan vazgeçtim ben de hatırlamıyorum:)
Hatırlarsam sebebini yazarım buraya.