STM32F4 ARM MCU көмегімен сервоқозғалтқышты басқару: 4 қадам
STM32F4 ARM MCU көмегімен сервоқозғалтқышты басқару: 4 қадам
Anonim
STM32F4 ARM MCU көмегімен сервоқозғалтқышты басқару
STM32F4 ARM MCU көмегімен сервоқозғалтқышты басқару
STM32F4 ARM MCU көмегімен сервоқозғалтқышты басқару
STM32F4 ARM MCU көмегімен сервоқозғалтқышты басқару

Тағы да сәлем достар:) Сонымен, бұл жобада біз STM32F4 ARM MCU сервоприводты басқарамыз. Менің жағдайда, мен табу тақтасын қолданамын, бірақ егер сіз мәселенің мәнін түсінсеңіз, оны әр MCU үшін қолдануға болады. Сонымен бастайық:)

1 -қадам: Жабдық пен бағдарламалық қамтамасыз етуге қойылатын талаптар

Аппараттық құралдар бойынша бізге қажет:

  • Менің жағдайда STM32f4 Discovery тақтасы бар MCU
  • SG90 немесе кез келген басқа сияқты жалпы серво қозғалтқышы

Бағдарламалық қамтамасыз ету тұрғысынан бізге қажет:

  • STM32CubeMX
  • Keil uVision

Егер сізде осының бәрі болса, келесі қадамға өтіңіз:)

2 -қадам: STM32CubeMX конфигурациясы

Өздеріңіз білетіндей, серво қозғалтқышты басқару үшін бізге PWM сигналы қажет. PWM сигналына қойылатын талаптар келесідей:

  • PWM кезеңі 20 мС болуы керек
  • Уақыт 0,5 mS - 2,5 mS аралығында болуы керек. Уақыт 0,5 мС болғанда, серво 0 градусқа, 90 градус үшін 1,5 мС, 180 градус үшін 2,5 мС айналады.

Сонымен, біз PWM -ді конфигурациялауымыз керек және ол үшін Timer1 қолданамыз.

  • Алдымен Таймер бөлімінен TIM1 таңдаңыз. Бұл қадам
  • Содан кейін Mode бөлімінен

    1. Ішкі сағатты таңдаңыз Бұл қадам
    2. PWM генерациясы CH1 Бұл қадам
  • Содан кейін конфигурация бөлімінен

    1. Prescaler параметрін 160 етіп орнатыңыз Бұл қадам
    2. Санау кезеңін 2000 деп орнатыңыз Бұл қадам
    3. Импульсті 50 -ге орнатыңыз Бұл қадам
  • Сонымен қатар, Сағат конфигурациясынан APB1 таймері 16 МГц сағатты орнатады. Бұл қадам

Енді осы қадам туралы біраз сөйлесейік:

Біздің APB1 таймерінің жиілігі 16 МГц. Демек, 1 секундқа жету үшін 16 000 000 кене қажет. Дегенмен, біз алдын ала есептегішті 160 -қа қойдық. Демек, біз жиілікті осы санға бөліп, кенелердің санын 100 000 -ға дейін азайттық. Демек, 1 секундқа бізге 100 000 кене қажет. Алайда, бізге бұрын айтылғандай, 20 мЗ PWM кезеңі қажет. Сонымен, қарапайым математикаға сүйене отырып, бізге 20mS үшін 2000 кене қажет. Осылайша, Counter Period -ды 2000 -ге орнату арқылы біз PWM сигналының периодын анықтаймыз, ол 20mS. Енді біз 0.5mS -ден 2.5mS -ге дейін қосылу уақытын алу үшін белгі санын анықтауымыз керек. Біз бұл теңдеуді қарапайым математикадан аламыз және ол:

On_Time = (Tick_Number / 100). Бұл servo қозғалтқыштың бұрышын өзгертетін on_time екенін есте сақтаңыз. Сонымен, төмендегі суретте мен бұл қадамды қорытындылаймын. Егер сізде сұрақтар туындаса, түсініктемелерде жазыңыз, мен мүмкіндігінше тез жауап беремін.

Есептеулер суреті

Осының бәрін жасағаннан кейін кодты жасаңыз:)

3 -қадам: Keil UVision кодтау

Сонымен, алдымен не істегіміз келетінін анықтайық? Біз дәрежені қабылдайтын функцияны жазуды және оны сервоға жазуды қалаймыз. Сонымен, біз мұны қалай жасаймыз? Жоғарыда айтқанымыздай, бұрышты өзгерту үшін уақытты өзгерту керек. Біздің бұрыштар [0, 180] мен кенелердің саны арасында өзгереді, бұл уақыт бойынша [50, 250] арасында өзгереді. Сонымен, бізге кенелердің санына берілген бұрышты салыстыратын картаға түсіру функциясы қажет. Мысалы, 0 градустық 50 кенеге, 180 градусқа 250 кенеге және т.б. үшін … Сонымен, картографиялау функциясын жазайық:

int картасы (int st1, int fn1, int st2, int fn2, int мәні) {қайтару (1.0*(мән-st1))/((fn1-st1)*1.0)*(fn2-st2)+st2; }

Бұл біздің картографиялық функция. Сіз оның қалай алынғанына қызығасыз ба? Сосын осыны оқыңыз. Сонымен, біз диапазондарды және біз салыстырғымыз келетін мәнді аламыз.

Енді бұрышты қабылдайтын және оны кенелер диапазонына салыстыратын функцияны жазайық:

void servo_write (int бұрышы) {htim1. Instance-> CCR1 = карта (0, 180, 50, 250, бұрыш); }

Көріп отырғаныңыздай, бұл код бұрышты қабылдайды және оны кенелер санының диапазонымен салыстырады. Содан кейін кенелердің саны CCR1 регистріне беріледі, ол уақыт пен бұрышты басқарады.

Алайда, осының бәрі жұмыс істеуі үшін біз алдымен pwm -ды іске қосамыз, оны тек код жолымен жасауға болады:

HAL_TIM_PWM_Start (& htim1, TIM_CHANNEL_1);

Сонымен, бізде бұрышты қабылдайтын және оны сервоға жазатын функция бар. Оны сынап көрейік және біздің тазалау функциясын жазайық, бұл өте оңай:

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

Сонымен, ол 180 -ге дейін, содан кейін 0 -ге дейін төмендейді және осы мәндерді сервоға жазады:) Сонымен, нәтижені көрейік!

4 -қадам: Нәтиже:)

Сонымен, бұл соңы. Егер сізде қандай да бір сұрақ болса, сұраңыз. Мен оларға жауап беру үшін бақытты боламын. Оқығаныңыз үшін көп рахмет және келесі жобада кездесеміз деп үміттенемін:)

Ұсынылған: