Isi kandungan:

Kawalan Motor Servo Dengan STM32F4 ARM MCU: 4 Langkah
Kawalan Motor Servo Dengan STM32F4 ARM MCU: 4 Langkah

Video: Kawalan Motor Servo Dengan STM32F4 ARM MCU: 4 Langkah

Video: Kawalan Motor Servo Dengan STM32F4 ARM MCU: 4 Langkah
Video: Fysetc Spider V1.1 - Servo install 2024, Julai
Anonim
Kawalan Motor Servo Dengan STM32F4 ARM MCU
Kawalan Motor Servo Dengan STM32F4 ARM MCU
Kawalan Motor Servo Dengan STM32F4 ARM MCU
Kawalan Motor Servo Dengan STM32F4 ARM MCU

Halo lagi kawan-kawan:) Oleh itu, dalam projek ini kita akan mengawal motor servo dengan STM32F4 ARM MCU. Dalam kes saya, saya akan menggunakan papan penemuan, tetapi jika anda memahami inti masalah, maka anda boleh menggunakannya untuk setiap MCU. Jadi. Mari kita mulakan:)

Langkah 1: Keperluan Perkakasan dan Perisian

Dari segi perkakasan, kami memerlukan:

  • MCU yang terdapat dalam dewan STM32f4 Discovery saya
  • Motor servo biasa, seperti SG90 atau yang lain

Dari segi perisian, kami memerlukan:

  • STM32CubeMX
  • Keil uVision

Sekiranya anda mempunyai semua ini, lompat ke langkah seterusnya:)

Langkah 2: Konfigurasi STM32CubeMX

Seperti yang anda ketahui, untuk mengawal motor servo kita memerlukan isyarat PWM. Keperluan dari segi isyarat PWM adalah seperti:

  • Tempoh PWM mestilah 20 mS
  • Tepat masa mesti antara 0.5 mS hingga 2.5 mS. Apabila tepat waktu 0,5 mS, maka servo akan berubah 0 darjah, 1,5 mS selama 90 darjah, dan 2,5 mS selama 180 darjah.

Jadi, kita perlu mengkonfigurasi PWM dan untuk tujuan itu kita akan menggunakan Timer1.

  • Pertama, pilih TIM1 dari bahagian Pemasa. Langkah ini
  • Kemudian, dari bahagian Mod

    1. Pilih Jam Dalaman Langkah ini
    2. Generasi PWM CH1 Langkah ini
  • Kemudian, dari bahagian Konfigurasi

    1. Tetapkan Prescaler ke 160 Langkah ini
    2. Tetapkan Tempoh Kaunter hingga 2000 Langkah ini
    3. Tetapkan Pulse ke 50 Langkah ini
  • Selain itu, dari Jam Konfigurasi tetapkan jam Pemasa APB1 ke 16MHz. Langkah ini

Sekarang, mari kita bincangkan sedikit mengenai langkah ini:

Kekerapan jam Pemasa APB1 kami ialah 16MHz. Jadi, ini bermaksud bahawa diperlukan 16, 000, 000 kutu untuk mendapatkan 1 saat. Walau bagaimanapun, kami menetapkan preskalaer kami ke 160. Ini bermaksud, kami membahagikan kekerapan kami dengan nombor itu dan menurunkan bilangan kutu menjadi 100, 000. Jadi, selama 1 saat, kami memerlukan 100, 000 kutu. Walau bagaimanapun, kita memerlukan 20mS tempoh PWM seperti yang kita nyatakan sebelumnya. Oleh itu, berdasarkan matematik sederhana, kita memerlukan 2000 kutu untuk 20mS. Oleh itu, dengan menetapkan Counter Period hingga 2000 kita menentukan tempoh isyarat PWM iaitu 20mS. Sekarang kita perlu menentukan nombor centang untuk mendapatkan waktu On dari 0.5mS hingga 2.5mS. Kita boleh mendapatkan persamaan ini dari matematik sederhana dan ia adalah:

On_Time = (Tandakan_Nombor / 100). Perlu diingat bahawa ini adalah on_time yang mengubah sudut motor servo. Jadi, di bawah gambar saya meringkaskan langkah ini. Sekiranya anda mempunyai sebarang pertanyaan, tulislah di komen dan saya akan menjawab secepat mungkin.

Gambar pengiraan

Setelah melakukan semua ini menghasilkan kod:)

Langkah 3: Keil UVision Coding

Oleh itu, mari kita tentukan terlebih dahulu apa yang ingin kita lakukan? Kami mahu, untuk menulis fungsi yang menerima darjah dan menuliskannya ke servo. Jadi, bagaimana kita akan melakukannya? Seperti yang telah kita katakan sebelumnya, untuk mengubah sudut kita perlu mengubah tepat pada waktunya. Sudut kami berubah antara [0, 180] dan jumlah kutu kami yang menentukan perubahan masa antara [50, 250]. Oleh itu, kita memerlukan fungsi pemetaan yang memetakan sudut yang diberikan kepada julat bilangan kutu. Sebagai contoh, untuk 0 darjah 50 kutu, untuk 180 darjah 250 kutu dan seterusnya … Oleh itu, mari tulis fungsi pemetaan kami:

peta int (int st1, int fn1, int st2, int fn2, nilai int) {return (1.0 * (nilai-st1)) / ((fn1-st1) * 1.0) * (fn2-st2) + st2; }

Ini adalah fungsi pemetaan kami. Adakah anda berminat bagaimana ia dihasilkan? Kemudian baca itu. Oleh itu, kami mengambil julat dan nilai yang ingin kami petakan.

Sekarang, mari tulis fungsi yang menerima sudut dan memetakannya ke jarak kutu:

kekosongan servo_write (sudut int) {htim1. Instance-> CCR1 = peta (0, 180, 50, 250, sudut); }

Seperti yang anda lihat, kod ini menerima sudut dan memetakannya ke julat bilangan kutu. Kemudian, bilangan kutu diberikan kepada daftar CCR1 yang mengawal sudut tepat pada masanya.

Walau bagaimanapun, agar semuanya berfungsi, kita mulakan pwm yang boleh dilakukan hanya dengan sebaris kod:

HAL_TIM_PWM_Mulakan (& htim1, TIM_CHANNEL_1);

Jadi, kita mempunyai fungsi yang menerima sudut dan menuliskannya ke servo. Mari uji dan tuliskan fungsi sapuan kami yang sangat mudah:

void servo_sweep (void) {untuk (int i = 0; i <= 180; i ++) {servo_write (i); HAL_Delay (10); } untuk (int i = 180; i> = 0; i--) {servo_write (i); HAL_Delay (10); }}

Jadi, ia hanya menghitung hingga 180 dan kemudian turun ke 0 dan tuliskan nilai-nilai ini kepada servo:) Oleh itu, mari lihat hasilnya!

Langkah 4: Hasilnya:)

Jadi, inilah akhirnya. Sekiranya anda mempunyai sebarang pertanyaan, sila tanya. Saya akan gembira untuk menjawabnya. Terima kasih banyak kerana membaca dan berharap saya dapat melihat anda dalam projek seterusnya:)

Disyorkan: