Sommario:

Controllo del servomotore con MCU ARM STM32F4: 4 passaggi
Controllo del servomotore con MCU ARM STM32F4: 4 passaggi

Video: Controllo del servomotore con MCU ARM STM32F4: 4 passaggi

Video: Controllo del servomotore con MCU ARM STM32F4: 4 passaggi
Video: 50. Как подключить сервопривод для хобби к микроконтроллеру ARM. Часть 2 — Микроконтроллер ARM STM32. 2024, Novembre
Anonim
Controllo del servomotore con MCU ARM STM32F4
Controllo del servomotore con MCU ARM STM32F4
Controllo del servomotore con MCU ARM STM32F4
Controllo del servomotore con MCU ARM STM32F4

Ciao di nuovo amici:) Quindi, in questo progetto controlleremo un servomotore con STM32F4 ARM MCU. Nel mio caso, userò la discovery board, ma se cogli l'essenza del problema, puoi applicarla per ogni MCU. Così. Iniziamo:)

Passaggio 1: requisiti hardware e software

In termini di hardware avremo bisogno di:

  • Un MCU che è nel mio caso la scheda Discovery STM32f4
  • Un servomotore comune, come SG90 o qualsiasi altro

In termini di software avremo bisogno di:

  • STM32CubeMX
  • Keil uVision

Se hai tutti questi, passa al passaggio successivo:)

Passaggio 2: configurazione STM32CubeMX

Come sai, per controllare un servomotore abbiamo bisogno del segnale PWM. I requisiti in termini di segnale PWM sono così:

  • Il periodo PWM deve essere 20 mS
  • Il tempo di attivazione deve essere compreso tra 0,5 mS e 2,5 mS. Quando il tempo è di 0,5 mS, il servo ruoterà di 0 gradi, 1,5 mS per 90 gradi e 2,5 mS per 180 gradi.

Quindi, abbiamo bisogno di configurare PWM e per quello scopo useremo Timer1.

  • Per prima cosa, seleziona TIM1 dalla sezione Timer. questo passaggio
  • Quindi, dalla sezione Modalità

    1. Scegli l'orologio interno in questo passaggio
    2. Generazione PWM CH1 Questo passaggio
  • Quindi, dalla sezione Configurazione

    1. Imposta il prescaler a 160 Questo passaggio
    2. Imposta il periodo del contatore su 2000 Questo passaggio
    3. Imposta Pulse a 50 Questo passaggio
  • Inoltre, dalla configurazione dell'orologio, impostare gli orologi del timer APB1 su 16 MHz. questo passaggio

Ora parliamo un po' di questo passaggio:

La frequenza dell'orologio del nostro timer APB1 è 16MHz. Quindi, significa che sono necessari 16, 000, 000 tick per ottenere 1 secondo. Tuttavia, impostiamo il nostro prescaler su 160. Significa che dividiamo la nostra frequenza per quel numero e diminuiamo il numero di tick fino a 100.000. Quindi, per 1 secondo abbiamo bisogno di 100.000 tick. Tuttavia, abbiamo bisogno di 20 ms di periodo PWM come abbiamo affermato prima. Quindi, in base a semplici calcoli, abbiamo bisogno di 2000 tick per 20 ms. Quindi, impostando Counter Period su 2000 determiniamo il periodo del segnale PWM che è 20mS. Ora dobbiamo determinare il numero di tick per ottenere i tempi di attivazione da 0,5 mS a 2,5 mS. Possiamo ottenere questa equazione da semplici calcoli ed è:

On_Time = (Tick_Number / 100). Tieni presente che questo è l'on_time che cambia l'angolo del servomotore. Quindi, sotto l'immagine riassumo questo passaggio. Se hai qualche domanda scrivi nei commenti e ti risponderò il prima possibile.

Immagine dei calcoli

Dopo aver eseguito tutte queste operazioni, genera codice:)

Passaggio 3: codifica Keil UVision

Quindi, prima determiniamo cosa vogliamo fare? Vogliamo scrivere una funzione che accetti il grado e scriverlo sul servo. Allora, come lo faremo? Come abbiamo detto prima, per cambiare angolo dobbiamo cambiare il tempo di accensione. I nostri angoli cambiano tra [0, 180] e il nostro numero di tick che determina i cambiamenti di tempo tra [50, 250]. Quindi, abbiamo bisogno di una funzione di mappatura che mappi l'angolo dato nell'intervallo del numero di tick. Ad esempio, per 0 gradi 50 tick, per 180 gradi 250 tick e così via… Quindi scriviamo la nostra funzione di mappatura:

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

Questa è la nostra funzione di mappatura. Ti interessa come viene derivato? Allora leggilo. Quindi, prendiamo i nostri intervalli e il valore che vogliamo mappare.

Ora, scriviamo una funzione che accetti l'angolo e la mappi nell'intervallo di tick:

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

Come puoi vedere, questo codice accetta l'angolo e lo associa all'intervallo del numero di tick. Quindi, il numero di tick è dato al registro CCR1 che controlla il tempo di accensione e quindi l'angolo.

Tuttavia, affinché tutti questi funzionino, avviamo prima il pwm che può essere eseguito solo con una riga di codice:

HAL_TIM_PWM_Start(&htim1, TIM_CHANNEL_1);

Quindi, abbiamo una funzione che accetta l'angolo e lo scrive sul servo. Proviamolo e scriviamo la nostra funzione di scansione che è molto semplice:

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

Quindi, conta fino a 180 e poi fino a 0 e scrivi questi valori sul servo:) Quindi, vediamo il risultato!

Passaggio 4: il risultato:)

Quindi, questa è la fine. Se hai qualche domanda chiedi pure. Sarò felice di rispondere loro. Grazie mille per aver letto e spero di vederti nel prossimo progetto:)

Consigliato: