İçindekiler:

STM32 Cihazlarla RC Servolar için Yüksek Çözünürlüklü PWM Sinyal Üretimi: 3 Adım
STM32 Cihazlarla RC Servolar için Yüksek Çözünürlüklü PWM Sinyal Üretimi: 3 Adım

Video: STM32 Cihazlarla RC Servolar için Yüksek Çözünürlüklü PWM Sinyal Üretimi: 3 Adım

Video: STM32 Cihazlarla RC Servolar için Yüksek Çözünürlüklü PWM Sinyal Üretimi: 3 Adım
Video: AP Hafta 4 - Arduino Giriş 2024, Kasım
Anonim
STM32 Cihazlarla RC Servolar için Yüksek Çözünürlüklü PWM Sinyal Üretimi
STM32 Cihazlarla RC Servolar için Yüksek Çözünürlüklü PWM Sinyal Üretimi
STM32 Cihazlarla RC Servolar için Yüksek Çözünürlüklü PWM Sinyal Üretimi
STM32 Cihazlarla RC Servolar için Yüksek Çözünürlüklü PWM Sinyal Üretimi
STM32 Cihazlarla RC Servolar için Yüksek Çözünürlüklü PWM Sinyal Üretimi
STM32 Cihazlarla RC Servolar için Yüksek Çözünürlüklü PWM Sinyal Üretimi

Şu anda, SX1280 RF çipine dayalı bir RC verici/alıcı yapıyorum. Projenin amaçlarından biri, çubuklardan servolara kadar 12 bitlik servo çözünürlük istiyorum. Kısmen modern dijital servolar 12 bit çözünürlüğe sahip olduğundan, ikinci olarak üst düzey bir verici zaten 12 bit kullanıyor. STM32 cihazlarda yüksek çözünürlüklü PWM sinyallerini nasıl üretebileceğimi araştırıyordum. Prototip için şu anda siyah hap (STM32F103C8T8) kullanıyorum.

Adım 1: Parça Listesi

Donanım

  • Herhangi bir STM32F103 geliştirme kartı (mavi hap, siyah hap vb.)
  • Güç kaynağı olarak bir USB güç bankası
  • STM32 programcısı (Segger j-links, ST-LINK/V2 veya sadece bir st-link klonu)

Yazılım

  • STM32CubeMX
  • STM32 için Atollik TrueSTUDIO
  • github'dan proje kaynağı

2. Adım: Açık Çözüm

Açık Çözüm
Açık Çözüm
Açık Çözüm
Açık Çözüm
Açık Çözüm
Açık Çözüm

Muhtemelen en kolay çözüm, bir STM32F103'te TIM1-3 gibi PWM sinyalleri üretebilen zamanlayıcılardan birini kullanmaktır. Modern bir dijital servo için kare hızı 5 ms'ye kadar düşebilir, ancak eski bir analog servo için 20 ms veya 50 Hz olmalıdır. Yani, en kötü durum senaryosu olarak bunu üretelim. 72 MHz saat ve 16 bit zamanlayıcı sayaç çözünürlüğü ile 20 ms kare hızını karşılamak için zamanlayıcının ön ölçekleyicisini minimum 23'e ayarlamamız gerekiyor. 24'ü seçtim çünkü 20 ms için sayacı tam olarak 60000'e ayarlamam gerekiyor. CubeMX kurulumunu ve oluşturulan 1 ve 1.5 ms PWM sinyallerini ekran görüntülerinde görebilirsiniz. Ne yazık ki, 1ms için zamanlayıcının sayacı 3000'e ayarlanmalıdır, bu bize sadece 11 bit çözünürlük verir. Fena değil ama hedef 12 bitti, o yüzden başka bir şey deneyelim.

Tabii ki STM32L476 gibi 32 bit timer sayıcılı bir mikro denetleyici seçseydim bu çözünürlük çok daha yüksek olabilir ve sorun çözülebilirdi.

Ancak burada STM32F103'te bile çözünürlüğü daha da artıracak alternatif bir çözüm önermek istiyorum.

3. Adım: Daha Yüksek Çözünürlük için Basamaklı Zamanlayıcılar

Daha Yüksek Çözünürlük için Basamaklı Zamanlayıcılar
Daha Yüksek Çözünürlük için Basamaklı Zamanlayıcılar
Daha Yüksek Çözünürlük için Basamaklı Zamanlayıcılar
Daha Yüksek Çözünürlük için Basamaklı Zamanlayıcılar
Daha Yüksek Çözünürlük için Basamaklı Zamanlayıcılar
Daha Yüksek Çözünürlük için Basamaklı Zamanlayıcılar

Önceki çözümdeki ana sorun, kare hızının (20 ms) gerçekte oluşturulan PWM sinyaline (1 ile 2 ms arasında) kıyasla nispeten yüksek olmasıdır, bu nedenle beklediğimizde kalan 18 ms için bazı değerli bitleri boşa harcıyoruz. sonraki kare. Bu, senkronizasyon için zamanlayıcı bağlantı özelliğini kullanarak zamanlayıcıları basamaklandırarak çözülebilir.

Buradaki fikir, çerçeve hızını (20 ms) oluşturmak için ana olarak TIM1'i ve PWM sinyalleriyle bağımlı olarak başa çıkmak için TIM2, TIM3'ü kullanacağım. Master, slave'leri tetiklediğinde, sadece bir darbe modunda bir PWM sinyali üretirler. Bu nedenle, bu zamanlayıcılarda sadece 2 ms'yi kapsamam gerekiyor. Neyse ki bu zamanlayıcıları donanımda kademelendirebilirsiniz, böylece bu senkronizasyon işlemciden herhangi bir müdahaleye ihtiyaç duymaz ve çok hassastır, jitter ps bölgesindedir. CubeMX kurulumunu ekran görüntülerinde görebilirsiniz.

Gördüğünüz gibi 3'ü preskalar olarak seçtim, bu yüzden 2 ms için zamanlayıcının sayacında 48000 ayarlamam gerekiyor. Bu bize 1 ms için 24000 verir ki bu aslında 14 bit çözünürlük için ihtiyacımız olandan daha fazlasıdır. Tadaaaa…

Nihai sonuç için lütfen girişteki osiloskop ekran görüntülerine bakın. Kanal 3 (mor), bir darbe üretmek için salveleri tetikleyecek olan ana zamanlayıcının kesintisidir. Kanal 1 ve 4 (sarı ve yeşil ışın), farklı zamanlayıcılar tarafından üretilen gerçek PWM sinyalleridir. Senkronize olduklarını, ancak arka kenarlarda senkronize olduklarını unutmayın, bunun nedeni PWM modu 2'dir. Bu bir sorun değildir, çünkü belirli servo için PWM oranı hala doğrudur.

Bu çözümün diğer faydası, kare hızını değiştirmenin yalnızca TIM1'deki süreyi değiştirmek anlamına gelmesidir. Modern dijital servolar için 200-300 Hz'e bile inebilirsiniz, ancak ince ayar yapmak istiyorsanız lütfen servo kılavuzuna bakın.

Önerilen: