Talaan ng mga Nilalaman:

Servo Motor Control Sa STM32F4 ARM MCU: 4 na Hakbang
Servo Motor Control Sa STM32F4 ARM MCU: 4 na Hakbang

Video: Servo Motor Control Sa STM32F4 ARM MCU: 4 na Hakbang

Video: Servo Motor Control Sa STM32F4 ARM MCU: 4 na Hakbang
Video: Servo motor control using STM32 and PWM || HAL || CubeMx || Keil 2024, Hulyo
Anonim
Servo Motor Control Sa STM32F4 ARM MCU
Servo Motor Control Sa STM32F4 ARM MCU
Servo Motor Control Sa STM32F4 ARM MCU
Servo Motor Control Sa STM32F4 ARM MCU

Kumusta ulit mga kaibigan:) Kaya, sa proyektong ito makokontrol namin ang isang servo motor na may STM32F4 ARM MCU. Sa aking kaso, gagamitin ko ang board ng pagtuklas, ngunit kung mauunawaan mo ang kabuuan ng problema, maaari mo itong ilapat para sa bawat MCU. Kaya naman Magsimula na tayo:)

Hakbang 1: Mga Kinakailangan sa Hardware at Software

Sa mga tuntunin ng hardware kakailanganin namin:

  • Isang MCU na nasa aking kaso STM32f4 Discovery board
  • Isang pangkaraniwang servo motor, tulad ng SG90 o anumang iba pa

Sa mga tuntunin ng software kakailanganin namin:

  • STM32CubeMX
  • Keil uVision

Kung mayroon kang lahat ng mga ito, tumalon sa susunod na hakbang:)

Hakbang 2: Pag-configure ng STM32CubeMX

Tulad ng alam mo, para sa pagkontrol ng isang servo motor kailangan namin ng PWM signal. Ang mga kinakailangan sa mga tuntunin ng PWM signal ay tulad nito:

  • Ang panahon ng PWM ay dapat na 20 mS
  • Sa oras ay dapat na nasa pagitan ng 0.5 mS hanggang 2.5 mS. Kapag sa oras ay 0.5 mS, pagkatapos ang servo ay magiging 0 degree, 1.5 mS para sa 90 degree, at 2.5 mS para sa 180 degree.

Kaya, kailangan naming i-configure ang PWM at para sa hangaring iyon gagamitin namin ang Timer1.

  • Una, piliin ang TIM1 mula sa seksyong Mga Timer. Ang hakbang na ito
  • Pagkatapos, mula sa seksyon ng Mode

    1. Piliin ang Panloob na Orasan Ang hakbang na ito
    2. PWM Generation CH1 Ang hakbang na ito
  • Pagkatapos, mula sa seksyong Pag-configure

    1. Itakda ang Prescaler sa 160 Ang hakbang na ito
    2. Itakda ang Panahon ng Kontra sa 2000 Ang hakbang na ito
    3. Itakda ang Pulse sa 50 Ang hakbang na ito
  • Bukod pa rito, mula sa Pag-configure ng Orasan ay itinakda ang mga APB1 Timer na orasan sa 16MHz. Ang hakbang na ito

Ngayon, pag-usapan natin nang kaunti ang tungkol sa hakbang na ito:

Ang dalas ng aming APB1 Timer na orasan ay 16MHz. Kaya, nangangahulugan ito na kinakailangan ng 16, 000, 000 na mga ticks upang makakuha ng 1 segundo. Gayunpaman, itinakda namin ang aming prescaler sa 160. Nangangahulugan ito, hinati namin ang aming dalas sa bilang na iyon at binawasan ang bilang ng mga ticks hanggang sa 100, 000. Kaya, para sa 1 segundo kailangan namin ng 100, 000 ticks. Gayunpaman, kailangan namin ng 20mS ng PWM na panahon tulad ng sinabi namin dati. Kaya, batay sa simpleng matematika, kailangan namin ng 2000 ticks para sa 20mS. Kaya, sa pamamagitan ng pagtatakda ng Panahon ng Kontra sa 2000 natutukoy namin ang panahon ng PWM signal na 20mS. Ngayon kailangan naming matukoy ang tick number para sa pagkuha ng Sa mga oras mula sa 0.5mS hanggang 2.5mS. Maaari nating makuha ang equation na ito mula sa simpleng matematika at ito ay:

On_Time = (Tick_Number / 100). Tandaan na ito ang on_time na nagbabago sa anggulo ng servo motor. Kaya, sa ibaba ng imahe ay buod ko ang hakbang na ito. Kung mayroon kang anumang katanungan isulat ang mga komento at sasagutin ko ang pinakamabilis hangga't maaari.

Larawan ng mga kalkulasyon

Matapos gawin ang lahat ng mga makabuo ng code:)

Hakbang 3: Keil UVision Coding

Kaya, alamin muna natin kung ano ang nais nating gawin? Nais namin, na magsulat ng isang pagpapaandar na tumatanggap ng degree at isulat ito sa servo. Kaya, paano natin ito gagawin? Tulad ng sinabi natin dati, upang mabago ang anggulo kailangan nating baguhin ang tamang oras. Nagbabago ang aming mga anggulo sa pagitan ng [0, 180] at ang aming bilang ng mga ticks na tumutukoy sa mga pagbabago ng oras sa pagitan ng [50, 250]. Kaya, kailangan namin ng isang pagpapa-map na pagpapa-map na binibigyan ng mapa ang anggulo sa saklaw ng bilang ng mga ticks. Halimbawa, para sa 0 degree 50 ticks, para sa 180 degree 250 ticks at iba pa … Kaya't isulat natin ang pagpapaandar sa pagmamapa:

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

Ito ang aming pagpapaandar sa pagmamapa. Interesado ka ba kung paano ito nagmula? Pagkatapos basahin iyon. Kaya, kinukuha namin ang aming mga saklaw at ang halagang nais naming mapa.

Ngayon, magsulat tayo ng isang pagpapaandar na tumatanggap ng anggulo at nai-map ito sa saklaw ng mga ticks:

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

Tulad ng nakikita mo, ang code na ito ay tumatanggap ng anggulo at ini-map ito sa saklaw ng bilang ng mga ticks. Pagkatapos, ang bilang ng mga ticks ay ibinibigay sa rehistro ng CCR1 na kumokontrol sa oras at sa gayon, anggulo.

Gayunpaman, upang magtrabaho ang lahat ng ito ay sinimulan muna namin ang pwm na maaaring gawin ng isang linya lamang ng code:

HAL_TIM_PWM_Start (& htim1, TIM_CHANNEL_1);

Kaya, mayroon kaming isang function na tumatanggap ng anggulo at isulat ito sa servo. Subukan natin ito at isulat ang ating pag-andar sa pagwawalis na napakadali:

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

Kaya, bibilangin lamang ito hanggang sa 180 at pagkatapos ay bumaba sa 0 at isulat ang mga halagang ito sa servo:) Kaya, tingnan natin ang resulta!

Hakbang 4: Ang Resulta:)

Kaya, ito ang wakas. Kung mayroon kang anumang katanungan mangyaring magtanong. Masisiyahan ako upang masagot ko sila. Maraming salamat sa pagbabasa at inaasahan na makikita kita sa susunod na proyekto:)

Inirerekumendang: