Агуулгын хүснэгт:

STM32F4 ARM MCU бүхий Servo моторын хяналт: 4 алхам
STM32F4 ARM MCU бүхий Servo моторын хяналт: 4 алхам

Видео: STM32F4 ARM MCU бүхий Servo моторын хяналт: 4 алхам

Видео: STM32F4 ARM MCU бүхий Servo моторын хяналт: 4 алхам
Видео: STM32. Урок 4. Введение в архитектуры МК на ядре Cortex-M 2024, Арваннэгдүгээр
Anonim
STM32F4 ARM MCU бүхий Servo моторын хяналт
STM32F4 ARM MCU бүхий Servo моторын хяналт
STM32F4 ARM MCU бүхий Servo моторын хяналт
STM32F4 ARM MCU бүхий Servo моторын хяналт

Сайн байцгаана уу найзуудаа:) Тиймээс энэ төсөлд бид STM32F4 ARM MCU бүхий servo моторыг удирдах болно. Миний хувьд би нээлтийн самбарыг ашиглах болно, гэхдээ хэрэв та асуудлын мөн чанарыг ойлговол та үүнийг MCU бүрт хэрэглэж болно. Тиймээс. Эхэлцгээе:)

Алхам 1: Техник хангамж ба програм хангамжийн шаардлага

Тоног төхөөрөмжийн хувьд бидэнд дараахь зүйлс хэрэгтэй болно.

  • Миний хувьд STM32f4 Discovery самбартай MCU
  • SG90 эсвэл бусадтай адил түгээмэл servo мотор

Програм хангамжийн хувьд бидэнд дараахь зүйлс хэрэгтэй болно.

  • STM32CubeMX
  • Keil uVision

Хэрэв танд энэ бүхэн байгаа бол дараагийн алхам руу орно уу:)

Алхам 2: STM32CubeMX -ийн тохиргоо

Таны мэдэж байгаагаар servo моторыг хянахын тулд бидэнд ХОУХД -ийн дохио хэрэгтэй болно. ХОУХ -ны дохионы шаардлагууд дараах байдалтай байна.

  • ХБХ -ны хугацаа 20 мS байх ёстой
  • Цаг нь 0.5 -аас 2.5 мС хооронд байх ёстой. Цаг нь 0.5 мС байх үед servo нь 0 градус, 90 градусын хувьд 1.5 mS, 180 градусын хувьд 2.5 mS болно.

Тиймээс бид PWM -ийг тохируулах хэрэгтэй бөгөөд энэ зорилгоор Timer1 -ийг ашиглах болно.

  • Эхлээд таймер хэсгээс TIM1 -ийг сонгоно уу. Энэ алхам
  • Дараа нь Mode хэсгээс

    1. Дотоод цагийг сонгоно уу Энэ алхам
    2. ХОУХ -ны үеийн CH1 Энэ алхам
  • Дараа нь Тохиргоо хэсгээс

    1. Prescaler -ийг 160 болгож тохируулна уу Энэ алхам
    2. Тоолуурын хугацааг 2000 гэж тохируулах Энэ алхам
    3. Пульсыг 50 болгож тохируулна уу Энэ алхам
  • Нэмж хэлэхэд, цагны тохиргооноос APB1 таймерын цагийг 16 МГц болгож тохируулна уу. Энэ алхам

Одоо энэ алхамын талаар жаахан ярилцъя.

Манай APB1 таймер цагийн давтамж нь 16 МГц юм. Тиймээс, 1 секунд авахын тулд 16,000, 000 хачиг шаардлагатай болно гэсэн үг юм. Гэсэн хэдий ч, бид prescaler -ийг 160 гэж тохируулсан. Энэ нь бидний давтамжийг энэ тоонд хувааж, хачигны тоог 100 000 болгон бууруулсан гэсэн үг юм. Тиймээс 1 секундын турш бидэнд 100 000 хачиг хэрэгтэй болно. Гэсэн хэдий ч бидэнд өмнө нь хэлсэнчлэн 20mS ХБХ -ны хугацаа хэрэгтэй болно. Тиймээс энгийн математик дээр үндэслэн бидэнд 20mS -т 2000 хачиг хэрэгтэй болно. Тиймээс Counter Period -ийг 2000 гэж тохируулснаар бид ХОУХ -ны дохионы хугацааг 20mS гэж тодорхойлдог. Одоо бид 0.5mS -ээс 2.5mS хүртэл идэвхжүүлэх хугацааг тэмдэглэх хэрэгтэй. Энэ тэгшитгэлийг энгийн математикаас авах боломжтой бөгөөд энэ нь:

On_Time = (Tick_Number / 100). Энэ бол servo моторын өнцгийг өөрчилдөг on_time гэдгийг санаарай. Тиймээс, зургийн доор би энэ алхамыг тоймлон харуулав. Хэрэв танд асуулт байвал коммент хэсэгт бичээрэй, би аль болох хурдан хариулах болно.

Тооцооллын зураг

Эдгээр бүгдийг хийсний дараа код үүсгэнэ:)

Алхам 3: Keil UVision кодчилол

Тиймээс эхлээд юу хийхийг хүсч байгаагаа тодорхойлъё? Бид зэрэг хүлээн авах функцийг бичиж, үүнийг servo дээр бичихийг хүсч байна. Тэгэхээр, бид үүнийг яаж хийх вэ? Өмнө нь хэлсэнчлэн өнцгийг өөрчлөхийн тулд цагийг өөрчлөх хэрэгтэй. Бидний өнцөг [0, 180] болон хачигны тоо хоорондоо өөрчлөгддөг бөгөөд энэ нь цаг хугацааны хувьд [50, 250] хооронд хэлбэлздэг. Тиймээс, бид хачигны тооны дагуу өнцгийг харуулсан газрын зургийн функц хэрэгтэй болно. Жишээлбэл, 0 градус 50 хачиг, 180 градус 250 хачиг гэх мэт … Тиймээс зураглалын функцээ бичье.

int map (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);

Тиймээс, бид өнцгийг хүлээн авч, servo дээр бичдэг функцтэй. Үүнийг туршиж үзээд маш хялбархан цэвэрлэх функцээ бичье.

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 хүртэл тоолж, эдгээр утгуудыг servo дээр бичнэ үү:) Үр дүнг нь харцгаая!

Алхам 4: Үр дүн:)

Тиймээс энэ бол төгсгөл юм. Хэрэв танд ямар нэгэн асуулт байвал асуугаарай. Тэдэнд хариулахын тулд би баяртай байх болно. Уншсанд маш их баярлалаа, дараагийн төсөл дээр уулзана гэж найдаж байна:)

Зөвлөмж болгож буй: