Мазмуну:

STV32F4 ARM MCU менен Servo Motor Control: 4 кадам
STV32F4 ARM MCU менен Servo Motor Control: 4 кадам

Video: STV32F4 ARM MCU менен Servo Motor Control: 4 кадам

Video: STV32F4 ARM MCU менен Servo Motor Control: 4 кадам
Video: Обязательно запомни эту хитрость! Как можно моментально вывести йод с одежды? #shorts 2024, Ноябрь
Anonim
STV32F4 ARM MCU менен Servo Motor Control
STV32F4 ARM MCU менен Servo Motor Control
STV32F4 ARM MCU менен Servo Motor Control
STV32F4 ARM MCU менен Servo Motor Control

Дагы салам достор:) Ошентип, бул долбоордо биз STM32F4 ARM MCU менен серво моторун башкарабыз. Менин учурда, мен ачылыш тактасын колдоном, бирок эгер сиз көйгөйдүн маңызын түшүнсөңүз, анда аны ар бир MCUга колдонсоңуз болот. Ошентип. баштайлы:)

1 -кадам: Аппараттык жана программалык камсыздоого талаптар

Аппараттык жактан бизге керек болот:

  • Менин учурда STM32f4 Discovery тактасы болгон MCU
  • SG90 же башка сыяктуу жалпы серво мотору

Программалык камсыздоо жагынан бизге керек болот:

  • STM32CubeMX
  • Keil uVision

Эгер мунун баары бар болсо, кийинки кадамга өтүңүз:)

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

Белгилүү болгондой, servo моторун башкаруу үчүн бизге PWM сигналы керек. PWM сигналына карата талаптар мындай:

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

Ошентип, биз PWMди конфигурациялашыбыз керек жана бул үчүн биз Timer1ди колдонобуз.

  • Биринчиден, Таймер бөлүмүнөн TIM1 тандаңыз. Бул кадам
  • Андан кийин, Mode бөлүмүнөн

    1. Ички саатты тандоо Бул кадам
    2. PWM Generation CH1 Бул кадам
  • Андан кийин, Конфигурация бөлүмүнөн

    1. Prescaler'ди 160ка коюңуз Бул кадам
    2. Эсептөө мезгилин 2000ге коюңуз Бул кадам
    3. Бул кадамды Pulse 50гө коюңуз
  • Кошумча, Саат Конфигурациясынан APB1 Таймерин 16 МГцке коюңуз. Бул кадам

Эми бул кадам тууралуу бир аз сүйлөшөлү:

Биздин APB1 таймеринин жыштыгы 16 МГц. Демек, бул 1 секунд алуу үчүн 16 000 000 кене талап кылынат дегенди билдирет. Бирок, биз алдын ала эсептегичибизди 160 деп койдук. Демек, биз жыштыгыбызды ошол санга бөлүп, кенелердин санын 100 000ге чейин азайттык. Демек, 1 секундага 100 000 кене керек. Бирок, биз буга чейин айткандай, 20mS PWM мезгилине муктажбыз. Ошентип, жөнөкөй математиканын негизинде бизге 20mS үчүн 2000 кене керек. Ошентип, Counter Period 2000ди коюу менен биз PWM сигналынын мезгилин 20mS деп аныктайбыз. Эми биз 0.5mSден 2.5mSке чейин On убактысын алуу үчүн кененин санын аныкташыбыз керек. Биз бул теңдемени жөнөкөй математикадан ала алабыз жана ал:

On_Time = (Tick_Number / 100). Бул servo мотордун бурчун өзгөрткөн on_time экенин унутпаңыз. Ошентип, сүрөттүн астында мен бул кадамды жыйынтыктайм. Эгерде кандайдыр бир суроолоруңуз болсо, комментарийге жазыңыз, мен мүмкүн болушунча тезирээк жооп берем.

Эсептөөлөрдүн сүрөтү

Мунун баарын жасагандан кийин кодду жаратыңыз:)

3 -кадам: Keil UVision коддоо

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

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

Бул биздин картаны түзүү функциясы. Ал кантип пайда болгонуна кызыгасызбы? Анда муну окуңуз. Ошентип, биз диапазондорубузду жана картага түшүргүбүз келген маанини алабыз.

Эми, бурчту кабыл алуучу жана кенелер диапазонуна карта түзүүчү функцияны жазалы:

жараксыз 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 -кадам: Жыйынтык:)

Демек, бул аягы. Эгерде сизде кандайдыр бир суроо болсо, сураңыз. Мен аларга жооп берүү үчүн бактылуу болом. Окуганыңыз үчүн чоң рахмат жана кийинки долбоордо көрүшөм деп үмүттөнөм:)

Сунушталууда: