Πίνακας περιεχομένων:

Servo Motor Control με STM32F4 ARM MCU: 4 Βήματα
Servo Motor Control με STM32F4 ARM MCU: 4 Βήματα

Βίντεο: Servo Motor Control με STM32F4 ARM MCU: 4 Βήματα

Βίντεο: Servo Motor Control με STM32F4 ARM MCU: 4 Βήματα
Βίντεο: Servo motor control using STM32 and PWM || HAL || CubeMx || Keil 2024, Ιούλιος
Anonim
Servo Motor Control με STM32F4 ARM MCU
Servo Motor Control με STM32F4 ARM MCU
Servo Motor Control με STM32F4 ARM MCU
Servo Motor Control με STM32F4 ARM MCU

Γεια σας και πάλι φίλοι:) Έτσι, σε αυτό το έργο θα ελέγξουμε έναν σερβοκινητήρα με STM32F4 ARM MCU. Στην περίπτωσή μου, θα χρησιμοποιήσω τον πίνακα ανακάλυψης, αλλά αν καταλάβετε την ουσία του προβλήματος, τότε μπορείτε να τον εφαρμόσετε για κάθε MCU. Ετσι. ας αρχίσουμε:)

Βήμα 1: Απαιτήσεις υλικού και λογισμικού

Όσον αφορά το υλικό, θα χρειαστούμε:

  • Ένα MCU που είναι στην περίπτωσή μου ο πίνακας STM32f4 Discovery
  • Ένας κοινός σερβοκινητήρας, όπως ο SG90 ή οποιοσδήποτε άλλος

Όσον αφορά το λογισμικό, θα χρειαστούμε:

  • STM32CubeMX
  • Keil uVision

Εάν τα έχετε όλα αυτά, προχωρήστε στο επόμενο βήμα:)

Βήμα 2: Διαμόρφωση STM32CubeMX

Όπως γνωρίζετε, για τον έλεγχο ενός σερβοκινητήρα χρειαζόμαστε σήμα PWM. Οι απαιτήσεις όσον αφορά το σήμα PWM είναι οι εξής:

  • Η περίοδος PWM πρέπει να είναι 20 mS
  • Η ώρα πρέπει να είναι μεταξύ 0,5 mS και 2,5 mS. Όταν η ώρα είναι 0,5 mS, τότε το σερβο θα γυρίσει 0 μοίρες, 1,5 mS για 90 μοίρες και 2,5 mS για 180 μοίρες.

Έτσι, πρέπει να διαμορφώσουμε το PWM και για το σκοπό αυτό θα χρησιμοποιήσουμε το Timer1.

  • Αρχικά, επιλέξτε TIM1 από την ενότητα Χρονόμετρα. Αυτό το βήμα
  • Στη συνέχεια, από την ενότητα Λειτουργία

    1. Επιλέξτε Εσωτερικό ρολόι Αυτό το βήμα
    2. PWM Generation CH1 Αυτό το βήμα
  • Στη συνέχεια, από την ενότητα Διαμόρφωση

    1. Ορίστε το Prescaler σε 160 Αυτό το βήμα
    2. Ορίστε την Περίοδο μετρητή σε 2000 Αυτό το βήμα
    3. Ορίστε το Pulse σε 50 Αυτό το βήμα
  • Επιπλέον, από το Clock Configuration ρυθμίστε το ρολόι APB1 Timer στα 16MHz. Αυτό το βήμα

Τώρα, ας μιλήσουμε λίγο για αυτό το βήμα:

Η συχνότητα του ρολογιού APB1 Timer είναι 16MHz. Έτσι, σημαίνει ότι απαιτούνται 16, 000, 000 τσιμπούρια για να πάρει 1 δευτερόλεπτο. Ωστόσο, ορίσαμε τον προπληρωτή μας σε 160. Αυτό σημαίνει ότι διαιρούμε τη συχνότητά μας με αυτόν τον αριθμό και μειώνουμε τον αριθμό των τσιμπουριών σε 100.000. Έτσι, για 1 δευτερόλεπτο χρειαζόμαστε 100.000 τσιμπούρια. Ωστόσο, χρειαζόμαστε 20mS περιόδου PWM όπως αναφέραμε προηγουμένως. Έτσι, με βάση απλά μαθηματικά, χρειαζόμαστε 2000 τσιμπούρια για 20mS. Έτσι, ορίζοντας το Counter Period στο 2000 καθορίζουμε την περίοδο του σήματος PWM που είναι 20mS. Τώρα πρέπει να καθορίσουμε τον αριθμό τσιμπούρι για χρόνους ενεργοποίησης από 0,5 mS έως 2,5 mS. Μπορούμε να πάρουμε αυτήν την εξίσωση από απλά μαθηματικά και είναι:

On_Time = (Tick_Number / 100). Λάβετε υπόψη ότι αυτή είναι η ώρα που αλλάζει τη γωνία του σερβοκινητήρα. Έτσι, κάτω από την εικόνα συνοψίζω αυτό το βήμα. Εάν έχετε οποιαδήποτε ερώτηση γράψτε στα σχόλια και θα απαντήσω το συντομότερο δυνατό.

Εικόνα υπολογισμών

Αφού κάνετε όλα αυτά, δημιουργήστε κώδικα:)

Βήμα 3: Κωδικοποίηση Keil UVision

Λοιπόν, ας καθορίσουμε πρώτα τι θέλουμε να κάνουμε; Θέλουμε, να γράψουμε μια συνάρτηση που δέχεται βαθμό και να τη γράψουμε στο σερβο. Λοιπόν, πώς θα το κάνουμε; Όπως έχουμε ξαναπεί, για να αλλάξουμε γωνία πρέπει να αλλάξουμε την ώρα. Οι γωνίες μας αλλάζουν μεταξύ [0, 180] και ο αριθμός των τσιμπουριών μας που καθορίζει την ώρα αλλάζει μεταξύ [50, 250]. Έτσι, χρειαζόμαστε μια συνάρτηση χαρτογράφησης που αντιστοιχεί σε δεδομένη γωνία στο εύρος του αριθμού των τσιμπουριών. Για παράδειγμα, για 0 βαθμούς 50 τσιμπούρια, για 180 μοίρες 250 τσιμπούρια και ούτω καθεξής … Ας γράψουμε λοιπόν τη συνάρτηση αντιστοίχισης:

int χάρτης (int st1, int fn1, int st2, int fn2, int τιμή) {return (1.0*(value-st1))/((fn1-st1)*1.0)*(fn2-st2)+st2; }

Αυτή είναι η λειτουργία χαρτογράφησης. Σας ενδιαφέρει πώς προέρχεται; Στη συνέχεια, διαβάστε το. Έτσι, παίρνουμε τα εύρη μας και την τιμή που θέλουμε να χαρτογραφήσουμε.

Τώρα, ας γράψουμε μια συνάρτηση που δέχεται γωνία και τη χαρτογραφεί στο εύρος των τσιμπουριών:

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

Όπως μπορείτε να δείτε, αυτός ο κώδικας δέχεται γωνία και τη χαρτογραφεί στο εύρος του αριθμού των τσιμπουριών. Στη συνέχεια, ο αριθμός των τσιμπουριών δίνεται στον καταχωρητή 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: Το αποτέλεσμα:)

Αυτό λοιπόν είναι το τέλος. Εάν έχετε οποιαδήποτε ερώτηση ρωτήστε. Θα χαρώ να τους απαντήσω. Σας ευχαριστώ πολύ που διαβάσατε και ελπίζω να σας δω στο επόμενο έργο:)

Συνιστάται: