İçindekiler:
- Adım 1: Parça Listesi
- 2. Adım: Açık Çözüm
- 3. Adım: Daha Yüksek Çözünürlük için Basamaklı Zamanlayıcılar
Video: STM32 Cihazlarla RC Servolar için Yüksek Çözünürlüklü PWM Sinyal Üretimi: 3 Adım
2024 Yazar: John Day | [email protected]. Son düzenleme: 2024-01-30 13:18
Ş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
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
Ö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:
Yüksek Çözünürlüklü Frekans Sayacı: 5 Adım (Resimli)
Yüksek Çözünürlüklü Frekans Sayacı: Bu talimat, frekansları hızlı ve makul bir hassasiyetle ölçebilen karşılıklı bir frekans sayacını gösterir. Standart bileşenlerle yapılmıştır ve bir hafta sonu yapılabilir (biraz daha uzun sürdü :-)) DÜZENLEME: Kod şimdi mevcut
555 Zamanlayıcı Atmega328'i Kesintiye Uğratmak İçin Sinyal Yaymak İçin: 7 Adım
555 Zamanlayıcı Sinyali Kesinti Vermek İçin Atmega328: Bu devrenin temel amacı enerji tasarrufu yapmaktır. Bu yüzden, arduino hakkında konuşmayacağım çünkü kartın kendisinin nihai bir ürün için gereksiz güç yükü var. Gelişim için harikadır. Ancak, batt üzerinde çalışan nihai projeler için pek iyi değil
Yüksek Çözünürlüklü Web Kamerası: 9 Adım (Resimlerle)
Yüksek Çözünürlüklü Web Kamerası: Birkaç yıl boyunca RPi tabanlı bir web kamerası (PiCam modülü ile) kullandım. Üretilen görüntüler iyiydi ama sonra kaliteden artık memnun olmadığım bir an oldu. Yüksek çözünürlüklü bir Web kamerası yapmaya karar verdim. Aşağıdaki parçalar
OpenLogger: Yüksek Çözünürlüklü, Wi-Fi Etkin, Açık Kaynak, Taşınabilir Veri Kaydedici: 7 Adım
OpenLogger: Yüksek Çözünürlüklü, Wi-Fi Etkin, Açık Kaynaklı, Taşınabilir Veri Kaydedici: OpenLogger, pahalı yazılım veya yazma yazılımı gerektirmeden yüksek kaliteli ölçümler sağlamak üzere tasarlanmış taşınabilir, açık kaynaklı, düşük maliyetli, yüksek çözünürlüklü bir veri kaydedicidir. sıfırdan. Eğer bir mühendis, bilim insanı veya meraklıysanız
Talimatlardan Yüksek Çözünürlüklü Görüntüler Nasıl Elde Edilir: 4 Adım
Talimatlardan Yüksek Çözünürlüklü Görüntüler Nasıl Elde Edilir: Bu öğretilebilir resimden gerçekten keyif aldınız mı ve yüksek çözünürlüklü bir kopyasını kaydetmek mi istiyorsunuz? Bu harika küçük özellik kolayca gözden kaçabilir