Mundarija:

STM32F4 ARM MCU bilan servo dvigatelni boshqarish: 4 qadam
STM32F4 ARM MCU bilan servo dvigatelni boshqarish: 4 qadam

Video: STM32F4 ARM MCU bilan servo dvigatelni boshqarish: 4 qadam

Video: STM32F4 ARM MCU bilan servo dvigatelni boshqarish: 4 qadam
Video: Servo motor control using STM32 and PWM || HAL || CubeMx || Keil 2024, Iyul
Anonim
STM32F4 ARM MCU bilan servo dvigatelni boshqarish
STM32F4 ARM MCU bilan servo dvigatelni boshqarish
STM32F4 ARM MCU bilan servo dvigatelni boshqarish
STM32F4 ARM MCU bilan servo dvigatelni boshqarish

Salom do'stlar yana:) Shunday qilib, biz ushbu loyihada STM32F4 ARM MCU bilan servo motorni boshqaramiz. Mening vaziyatimda men kashfiyot taxtasidan foydalanaman, lekin agar siz muammoning mohiyatini tushunsangiz, uni har bir MCU uchun qo'llashingiz mumkin. Shunday qilib Qani boshladik:)

1 -qadam: Uskuna va dasturiy ta'minot talablari

Uskuna jihatidan bizga kerak bo'ladi:

  • Mening holatimda STM32f4 Discovery kartasi bo'lgan MCU
  • SG90 yoki boshqa har qanday kabi umumiy servo vosita

Dasturiy ta'minot nuqtai nazaridan bizga kerak bo'ladi:

  • STM32CubeMX
  • Keil uVision

Agar sizda bularning barchasi bo'lsa, keyingi bosqichga o'ting:)

2 -qadam: STM32CubeMX konfiguratsiyasi

Ma'lumki, servo dvigatelni boshqarish uchun bizga PWM signali kerak. PWM signaliga qo'yiladigan talablar quyidagicha:

  • PWM davri 20 mS bo'lishi kerak
  • Vaqt 0,5 mS dan 2,5 mS gacha bo'lishi kerak. Vaqti -vaqti bilan 0,5 mS bo'lsa, servo 0 gradusga, 90 gradus uchun 1,5 mS va 180 daraja 2,5 mS ga aylanadi.

Shunday qilib, biz PWM -ni sozlashimiz kerak va buning uchun biz Timer1 -dan foydalanamiz.

  • Birinchidan, Taymerlar bo'limidan TIM1 -ni tanlang. Bu qadam
  • Keyin Mode bo'limidan

    1. Ichki soatni tanlang Bu qadam
    2. PWM avlodi CH1 Bu qadam
  • Keyin, Konfiguratsiya bo'limidan

    1. Prescaler -ni 160 ga o'rnating Bu qadam
    2. Hisoblagich davrini 2000 ga o'rnating Bu qadam
    3. Pulsni 50 ga o'rnating Bu qadam
  • Bundan tashqari, soat konfiguratsiyasidan APB1 taymerining soatlari 16 MGts ga o'rnatiladi. Bu qadam

Keling, bu qadam haqida bir oz gaplashaylik:

Bizning APB1 taymer soatining chastotasi 16 MGts. Bu shuni anglatadiki, 1 soniyani olish uchun 16 000 000 shomil kerak bo'ladi. Biroq, biz oldindan hisoblagichni 160 ga o'rnatdik. Bu shuni anglatadiki, biz chastotamizni shu songa bo'lamiz va Shomil sonini 100 000 ga tushirdik. Shunday qilib, 1 soniya uchun bizga 100 000 Shomil kerak bo'ladi. Biroq, biz ilgari aytib o'tganimizdek, bizga 20 mS PWM davri kerak. Shunday qilib, oddiy matematikaga asoslanib, bizga 20mS uchun 2000 ta Shomil kerak. Shunday qilib, hisoblagich davrini 2000 ga o'rnatish orqali biz 20 mS bo'lgan PWM signalining davrini aniqlaymiz. Endi biz 0,5 mS dan 2,5 mS gacha bo'lgan vaqtni belgilash uchun raqamni aniqlashimiz kerak. Biz bu tenglamani oddiy matematikadan olishimiz mumkin va bu:

On_Time = (Tick_Number / 100). Shuni yodda tutingki, bu servo dvigatel burchagini o'zgartiradigan on_time. Shunday qilib, rasm ostida men bu qadamni umumlashtiraman. Agar sizda biron bir savol bo'lsa, izohlarda yozing va men iloji boricha tezroq javob beraman.

Hisob -kitoblar tasviri

Bularning barchasini bajarganingizdan so'ng kodni yarating:)

3 -qadam: Keil UVision kodlash

Xo'sh, birinchi navbatda nima qilishni xohlayotganimizni aniqlaylikmi? Biz darajani qabul qiladigan funktsiyani yozib, uni servoga yozishni xohlaymiz. Xo'sh, buni qanday qilamiz? Yuqorida aytib o'tganimizdek, burchakni o'zgartirish uchun o'z vaqtida o'zgartirish kerak. Bizning burchaklarimiz [0, 180] va shomillarning soni o'rtasida o'zgarib turadi, bu esa o'z vaqtida o'zgarishini aniqlaydi [50, 250]. Shunday qilib, bizga Shomillarning soniga berilgan burchakni xaritaga soluvchi xaritalash funktsiyasi kerak. Masalan, 0 daraja 50 Shomil uchun, 180 daraja 250 Shomil va boshqalar uchun … Shunday qilib, xaritalash funksiyamizni yozamiz:

int xaritasi (int st1, int fn1, int st2, int fn2, int qiymati) {qaytish (1.0*(qiymat-st1))/((fn1-st1)*1.0)*(fn2-st2)+st2; }

Bu bizning xaritalash funktsiyamiz. U qanday paydo bo'lganiga qiziqasizmi? Keyin buni o'qing. Shunday qilib, biz diapazonlarimizni va xaritaga kiritmoqchi bo'lgan qiymatni olamiz.

Keling, burchakni qabul qiladigan funktsiyani yozamiz va uni Shomil oralig'iga joylashtiramiz:

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

Ko'rib turganingizdek, bu kod burchakni qabul qiladi va uni shomil soniga mos keladi. Shomillarning soni CCR1 registriga beriladi, u o'z vaqtida va boshqasini boshqaradi.

Biroq, bularning barchasi ishlashi uchun biz avval pwm -ni ishga tushiramiz, uni faqat kod satri orqali bajarish mumkin:

HAL_TIM_PWM_Start (& htim1, TIM_CHANNEL_1);

Shunday qilib, biz burchakni qabul qiladigan va uni servoga yozadigan funktsiyaga egamiz. Keling, buni sinab ko'ramiz va tozalash funktsiyasini yozamiz, bu juda oson:

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

Shunday qilib, u faqat 180 gacha, keyin 0 ga tushadi va bu qiymatlarni servoga yozadi:) Shunday qilib, natijani ko'rib chiqaylik!

4 -qadam: natija:)

Demak, bu oxir. Agar sizda biron bir savol bo'lsa, iltimos so'rang. Men ularga javob berishdan xursand bo'laman. O'qiganingiz uchun katta rahmat va keyingi loyihada ko'rishguncha umid qilaman:)

Tavsiya: