Pembangkitan Sinyal PWM Resolusi Tinggi untuk RC Servos Dengan Perangkat STM32: 3 Langkah
Pembangkitan Sinyal PWM Resolusi Tinggi untuk RC Servos Dengan Perangkat STM32: 3 Langkah
Anonim
Pembangkitan Sinyal PWM Resolusi Tinggi untuk RC Servos Dengan Perangkat STM32
Pembangkitan Sinyal PWM Resolusi Tinggi untuk RC Servos Dengan Perangkat STM32
Pembangkitan Sinyal PWM Resolusi Tinggi untuk RC Servos Dengan Perangkat STM32
Pembangkitan Sinyal PWM Resolusi Tinggi untuk RC Servos Dengan Perangkat STM32
Pembangkitan Sinyal PWM Resolusi Tinggi untuk RC Servos Dengan Perangkat STM32
Pembangkitan Sinyal PWM Resolusi Tinggi untuk RC Servos Dengan Perangkat STM32

Saat ini, saya sedang membangun pemancar/penerima RC berdasarkan chip RF SX1280. Salah satu tujuan proyek ini adalah saya ingin resolusi servo 12 bit dari semua tongkat hingga ke servo. Sebagian karena servo digital modern memiliki resolusi 12 bit, kedua, pemancar kelas atas tetap menggunakan 12 bit. Saya sedang menyelidiki bagaimana saya dapat menghasilkan sinyal PWM resolusi tinggi pada perangkat STM32. Saya menggunakan pil hitam (STM32F103C8T8) saat ini untuk prototipe.

Langkah 1: Daftar Bagian

Perangkat keras

  • Setiap papan pengembangan STM32F103 (pil biru, pil hitam, dll.)
  • Bank daya USB sebagai catu daya
  • Programmer STM32 (Segger j-link, ST-LINK/V2, atau hanya klon st-link)

Perangkat lunak

  • STM32CubeMX
  • TrueSTUDIO Atol untuk STM32
  • Sumber proyek dari github

Langkah 2: Solusi Jelas

Solusi Jelas
Solusi Jelas
Solusi Jelas
Solusi Jelas
Solusi Jelas
Solusi Jelas

Mungkin solusi termudah adalah dengan menggunakan salah satu timer yang dapat menghasilkan sinyal PWM, seperti TIM1-3 pada STM32F103. Untuk servo digital modern, kecepatan bingkai bisa turun hingga 5 ms atau lebih, tetapi untuk servo analog lama harus 20 ms atau 50 Hz. Jadi, sebagai skenario terburuk, mari kita buat itu. Dengan clock 72 MHz dan resolusi counter timer 16 bit, kita perlu mengatur prescaler timer ke minimum 23 untuk menutupi frame rate 20 ms. Saya memilih 24 karena untuk 20 ms saya perlu mengatur penghitung tepat ke 60000. Anda dapat melihat pengaturan CubeMX dan sinyal PWM 1 dan 1,5 ms yang dihasilkan di tangkapan layar. Sayangnya, untuk 1 ms penghitung waktu harus disetel ke 3000, yang akan memberi kita resolusi hanya 11 bit. Tidak buruk, tetapi tujuannya adalah 12 bit, jadi mari kita coba yang lain.

Tentu saja Jika saya akan memilih pengontrol mikro dengan penghitung waktu 32 bit, seperti STM32L476 resolusi ini bisa jauh lebih tinggi dan masalahnya akan terpecahkan.

Tapi di sini, saya ingin mengusulkan solusi alternatif yang akan lebih meningkatkan resolusi bahkan pada STM32F103.

Langkah 3: Pengatur Waktu Berjenjang untuk Resolusi Lebih Tinggi

Pengatur Waktu Cascading untuk Resolusi Lebih Tinggi
Pengatur Waktu Cascading untuk Resolusi Lebih Tinggi
Pengatur Waktu Cascading untuk Resolusi Lebih Tinggi
Pengatur Waktu Cascading untuk Resolusi Lebih Tinggi
Pengatur Waktu Cascading untuk Resolusi Lebih Tinggi
Pengatur Waktu Cascading untuk Resolusi Lebih Tinggi

Masalah utama dengan solusi sebelumnya adalah bahwa frame rate (20 ms) relatif tinggi dibandingkan dengan sinyal PWM yang dihasilkan sebenarnya (antara 1 dan 2 ms), jadi kami membuang beberapa bit berharga untuk sisa 18 ms saat kami menunggu bingkai berikutnya. Ini dapat diselesaikan dengan cascading timer menggunakan fitur link timer untuk sinkronisasi.

Idenya adalah bahwa saya akan menggunakan TIM1 sebagai master untuk menghasilkan frame rate (20 ms) dan TIM2, TIM3 untuk mengatasi sinyal PWM sebagai budak. Ketika master memicu budak mereka hanya menghasilkan sinyal PWM dalam satu mode pulsa. Oleh karena itu saya hanya perlu mengcover 2 ms pada timer tersebut. Untungnya Anda dapat mengalirkan pengatur waktu tersebut di perangkat keras sehingga sinkronisasi ini tidak memerlukan intervensi apa pun dari prosesor dan ini juga sangat tepat, jitter berada di wilayah ps. Anda dapat melihat pengaturan CubeMX pada tangkapan layar.

Seperti yang Anda lihat saya memilih 3 sebagai prescalar jadi untuk 2 ms saya perlu mengatur 48000 di penghitung timer. Ini memberi kita 24000 untuk 1 ms yang sebenarnya lebih dari yang kita butuhkan untuk resolusi 14 bit. Tadaaaa…

Silakan lihat screenshot osiloskop di intro untuk hasil akhir. Saluran 3 (ungu) adalah interupsi master timer yang akan memicu salep untuk menghasilkan satu pulsa. Saluran 1 dan 4 (sinar kuning dan hijau) adalah sinyal PWM aktual yang dihasilkan oleh pengatur waktu yang berbeda. Perhatikan bahwa mereka sinkron tetapi mereka disinkronkan di tepi trailing, itu karena mode PWM 2. Ini bukan masalah, karena tingkat PWM untuk servo tertentu masih benar.

Manfaat lain dari solusi ini adalah bahwa mengubah frame rate berarti mengubah periode di TIM1 saja. Untuk servo digital modern, Anda dapat menurunkan bahkan hingga 200-300 Hz, tetapi silakan baca manual servo jika Anda ingin menyempurnakannya.