Daftar Isi:

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

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

Video: Kontrol Motor Servo Dengan STM32F4 ARM MCU: 4 Langkah
Video: Servo motor control using STM32 and PWM || HAL || CubeMx || Keil 2024, Juli
Anonim
Kontrol Motor Servo Dengan STM32F4 ARM MCU
Kontrol Motor Servo Dengan STM32F4 ARM MCU
Kontrol Motor Servo Dengan STM32F4 ARM MCU
Kontrol Motor Servo Dengan STM32F4 ARM MCU

Halo lagi sobat:) Nah, pada project kali ini kita akan mengontrol sebuah motor servo dengan STM32F4 ARM MCU. Dalam kasus saya, saya akan menggunakan papan penemuan, tetapi jika Anda memahami inti masalahnya, maka Anda dapat menerapkannya untuk setiap MCU. Jadi. mari kita mulai:)

Langkah 1: Persyaratan Perangkat Keras dan Perangkat Lunak

Dalam hal perangkat keras kita akan membutuhkan:

  • MCU yang ada di papan Discovery STM32f4 kasus saya
  • Motor servo umum, seperti SG90 atau lainnya

Dalam hal perangkat lunak kita akan membutuhkan:

  • STM32CubeMX
  • Keil uVision

Jika Anda memiliki semua ini, lompat ke langkah berikutnya:)

Langkah 2: Konfigurasi STM32CubeMX

Seperti yang Anda ketahui, untuk mengendalikan motor servo kita membutuhkan sinyal PWM. Persyaratan dalam hal sinyal PWM adalah seperti itu:

  • Periode PWM harus 20 mS
  • Tepat waktu harus antara 0,5 mS hingga 2,5 mS. Saat on time 0,5 mS, maka servo akan berputar 0 derajat, 1,5 mS untuk 90 derajat, dan 2,5 mS untuk 180 derajat.

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

  • Pertama, pilih TIM1 dari bagian Timer. Langkah ini
  • Kemudian, dari bagian Mode

    1. Pilih Jam Internal Langkah ini
    2. PWM Generasi CH1 Langkah ini
  • Kemudian, dari bagian Konfigurasi

    1. Atur Prescaler ke 160 Langkah ini
    2. Atur Periode Penghitung ke 2000 Langkah ini
    3. Atur Pulse ke 50 Langkah ini
  • Selain itu, dari Konfigurasi Jam, atur jam Timer APB1 ke 16MHz. Langkah ini

Sekarang, mari kita bicara sedikit tentang langkah ini:

Frekuensi jam APB1 Timer kami adalah 16MHz. Jadi, itu berarti dibutuhkan 16.000, 000 tik untuk mendapatkan 1 detik. Namun, kita mengatur prescaler kita menjadi 160. Artinya, kita membagi frekuensi kita dengan angka tersebut dan mengurangi jumlah tick menjadi 100.000. Jadi, untuk 1 detik kita membutuhkan 100.000 tick. Namun, kami membutuhkan 20mS periode PWM seperti yang kami nyatakan sebelumnya. Jadi, berdasarkan matematika sederhana, kita membutuhkan 2000 tick untuk 20mS. Jadi, dengan mengatur Counter Period menjadi 2000 kita menentukan periode sinyal PWM yaitu 20mS. Sekarang kita perlu menentukan nomor centang untuk mendapatkan waktu On dari 0.5mS ke 2.5mS. Kita bisa mendapatkan persamaan ini dari matematika sederhana dan itu adalah:

On_Time = (Tick_Number / 100). Perlu diingat bahwa ini adalah on_time yang mengubah sudut motor servo. Jadi, di bawah gambar saya merangkum langkah ini. Jika Anda memiliki pertanyaan tulis di komentar dan saya akan menjawab secepat mungkin.

Gambar perhitungan

Setelah melakukan semua ini, buat kode:)

Langkah 3: Pengkodean Keil UVion

Jadi, mari kita tentukan dulu apa yang ingin kita lakukan? Kami ingin, menulis fungsi yang menerima derajat dan menulisnya ke servo. Jadi, bagaimana kita akan melakukannya? Seperti yang telah kami katakan sebelumnya, untuk mengubah sudut kita perlu mengubah waktu. Sudut kami berubah antara [0, 180] dan jumlah kutu kami yang menentukan perubahan waktu antara [50, 250]. Jadi, kita membutuhkan fungsi pemetaan yang memetakan sudut yang diberikan ke kisaran jumlah kutu. Misalnya, untuk 0 derajat 50 tick, untuk 180 derajat 250 tick dan seterusnya… Jadi mari kita tulis fungsi pemetaan kita:

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

Ini adalah fungsi pemetaan kami. Apakah Anda tertarik bagaimana itu diturunkan? Kemudian baca itu. Jadi, kami mengambil rentang dan nilai yang ingin kami petakan.

Sekarang, mari kita tulis sebuah fungsi yang menerima sudut dan memetakannya ke kisaran tick:

void servo_write(int angle){ htim1. Instance->CCR1 = map(0, 180, 50, 250, angle); }

Seperti yang Anda lihat, kode ini menerima sudut dan memetakannya ke kisaran jumlah kutu. Kemudian, jumlah tick diberikan ke register CCR1 yang mengontrol waktu tepat dan sudut.

Namun, agar semua ini berfungsi, pertama-tama kita memulai pwm yang dapat dilakukan hanya dengan sebaris kode:

HAL_TIM_PWM_Start(&htim1, TIM_CHANNEL_1);

Jadi, kita memiliki fungsi yang menerima sudut dan menuliskannya ke servo. Mari kita uji dan tulis fungsi sapuan kita yang sangat mudah:

void servo_sweep(void){ for(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 tinggal hitung sampai 180 lalu turun ke 0 dan tulis nilai-nilai ini ke servo:) Jadi, mari kita lihat hasilnya!

Langkah 4: Hasilnya:)

Jadi, ini adalah akhir. Jika Anda memiliki pertanyaan silahkan bertanya. Saya akan senang untuk menjawabnya. Terima kasih banyak telah membaca dan berharap saya akan melihat Anda di proyek berikutnya:)

Direkomendasikan: