Loading...

STM32F4G (ARM University Program Lab-in-a-Box)

Το STM32F4G προσφέρθηκε δωρεάν στα πλαίσια του ARM University Program Lab-in-a-Box. Το STM32F4G περιέχει έναν ισχυρό επεξεργαστή arm των 32bit,στατική ram και flash μνήμη. Επίσης έχει τη δυνατότητα σύνδεσης πολλών περιφεριακών.Παρακάτω θα παραθέσουμε μερικές εφαρμογές υλοποιημένες πάνω στον stm32f4 σε συνδυασμό με την πλακέτα της flight electronics.

Παρακάτω παραθέτουμε 6 εφαρμογές που έχουν υλοποιηθεί με τον Stm32f4G και το Flight board.

Η σχεδίαση των εφαρμογών έγινε από τους φοιτητές Μούλιο Γρηγόρη, Μώκο Σωτήρη και Λιάγκο Παντελή σε συνεργασία τον Δρ. Τοπάλη Ευάγγελο.

  • Χειρισμός κίνησης των LEDs με το κουμπί USER του board.
  • Αλλαγή φορά περιστροφής και ταχύτητας των LED με το κουμπί USER.
  • Αλλαγή φοράς και ταχύτητας περιστροφής των LED μέσω του επιταχυνσιόμετρου.
  • Έλεγχος κίνησης του motor του FLIGHT board μέσω του κουμπιού USER του STM.
  • Έλεγχος κίνησης του dc κινητήρα του FLIGHT board μέσω επιταχυνσιόμετρου.
  • Έλεγχος στροφών του dc κινητήρα του FLIGHT board μέσω PWM και επιταχυνσιόμετρου.

  • Έλεγχος στροφών του dc κινητήρα του FLIGHT board μέσω PWM και επιταχυνσιόμετρου.

    Σε αυτή την εφαρμογή θα ασχοληθούμε με τον χειρισμό του dc κινητήρα του multi-applications board της FLIGHT electronics. Για να ελέγξουμε τον κινητήρα πρέπει αρχικά να βάλουμε τον διακόπτη SW2 2 στη θέση motor. Τα υπόλοιπα δεν μας επηρεάζουν σε οποιαδήποτε κατάσταση τους. Αφού γίνει αυτό πρέπει να συνδέσουμε το board της STM στα bits 6,7 του port B του FLIGHT. Όταν δεχτεί λογικό “1” σε ένα από τα δύο bits ο κινητήρας θα εκκινήσει δεξιόστροφα αν αυτό είναι το 6ο και αριστερόστροφα αν αυτό είναι το 7ο. Συνδέουμε το 6ο bit με το κόκκινο led του STM και το 7ο με το πράσινο.
    Αν αναγνωριστεί κίνηση στο Χ, ενεργοποιούνται τα PWM κανάλια και ενεργοποιεί  το κανάλι 3 που έχουμε συνδέσει με το 6o bit του Flight board και κινεί το motor δεξιόστροφα.
    Στον Χ έχουμε καθορίσει 2 τιμές. Αν ξεπεραστεί η πρώτη τιμή θα λειτουργεί  με το 33% του duty cycle, ενώ αν ξεπεραστεί η δεύτερη θα λειτουργεί με το 25% του duty cycle.Αντίστοιχα αν αναγνωριστεί στο Χ’, θα ενεργοποιηθεί  το κανάλι 1 που έχουμε συνδέσει με το 7ο bit του Flight.

    Το flowcharts της εφαρμογής.

    Ο κώδικας στην εφαρμογή του keil θα είναι ο εξής.

    /**

    * Keil project gia to LIS302DL h to LIS3DSH accelerometer sto STM32F4-Discovery board

    * *

    * @ide Keil uVision 5

    * @packs STM32F4xx Keil packs version 2.2.0 or greater required

    * @stdperiph STM32F4xx Standard peripheral drivers version 1.4.0 or greater required

    * * Sthn energopoihsh, an to STM32F4-Discovery board exei to accelerometer LIS302DL,

    * ta LED_GREEN kai LED_RED tha anapsoun gia 2 deuterolepta,

    * An exei to accelerometer LIS3DSH ,

    * ta LED_BLUE kai LED_ORANGE tha anapsoun gia 2 deuterolepta.

    * * An anapsoun ola ta led mazi,shmainei pws uparxei kapoio error.

    *//* Eisagwgh kuriwn modules */

    #include "stm32f4xx.h"

    /* Eisagwgh biblithikwn */

    #include "defines.h"

    #include "tm_stm32f4_disco.h"

    #include "tm_stm32f4_delay.h"

    #include "tm_stm32f4_lis302dl_lis3dsh.h"

    #include "tm_stm32f4_pwm.h"

     /* Dedomena gia to Accelerometer */

    TM_LIS302DL_LIS3DSH_t Axes_Data;

    int main(void) {

    TM_PWM_TIM_t TIM4_Data;

    /* Energopoihsh susthmatos */

    SystemInit();

    /* Energopoihsh tou delay */

    TM_DELAY_Init();

    /* Energopoihsh twn LEDs */

    TM_DISCO_LedInit();

    /* Entopise thn katallhlh suskeuh */

    if (TM_LIS302DL_LIS3DSH_Detect() == TM_LIS302DL_LIS3DSH_Device_LIS302DL) {

    /* Anapse ta GREEN kai RED */

    TM_DISCO_LedOn(LED_GREEN | LED_RED);

    /* Energopoihse to LIS302DL */

    TM_LIS302DL_LIS3DSH_Init(TM_LIS302DL_Sensitivity_2_3G, TM_LIS302DL_Filter_2Hz);

    } else if (TM_LIS302DL_LIS3DSH_Detect() == TM_LIS302DL_LIS3DSH_Device_LIS3DSH) {

    /* Alliws anapse ta BLUE kai ORANGE */

    TM_DISCO_LedOn(LED_BLUE | LED_ORANGE);

    /* Energopoihse to LIS3DSH */

    TM_LIS302DL_LIS3DSH_Init(TM_LIS3DSH_Sensitivity_2G, TM_LIS3DSH_Filter_800Hz);

    } else {

    /* Alliws,h suskeuh den anagnwrizetai */

    /* Anapse ola ta leds */

    TM_DISCO_LedOn(LED_GREEN | LED_RED | LED_BLUE | LED_ORANGE);

    /* Atermwn broxos */

    while (1);

    }

    /* Delay gia 2 deuterolepta */

    Delayms(2000);

    TM_DISCO_LedOff(LED_ALL);

    TM_PWM_InitTimer(TIM4, &TIM4_Data, 1000);

    while (1) {

    /* Anagnwsh twn dedomenwn stous aksones tou accelerometer */

    TM_LIS302DL_LIS3DSH_ReadAxes(&Axes_Data);

    /* Elegxos tou X aksona.

    An X>200 tote anapse to kokkino led kai xrhsimopoihse to

    duty cycle kai kinhse to motor deksiostrofa */

    if (Axes_Data.X > 200) {

    /* Energopoihsh tou PWM ston TIM4, Channel 1 and PinsPack 2 =
    PD12 */

    TM_PWM_InitChannel(&TIM4_Data, TM_PWM_Channel_1,
    TM_PWM_PinsPack_2);

    /* Energopoihsh tou PWM ston TIM4, Channel 2 and PinsPack 2 =
    PD13 */

    TM_PWM_InitChannel(&TIM4_Data, TM_PWM_Channel_2,
    TM_PWM_PinsPack_2);

    TM_PWM_InitChannel(&TIM4_Data, TM_PWM_Channel_3,
    TM_PWM_PinsPack_2
    );

    /* Eneropoihsh tou PWM ston TIM4, Channel 4 and PinsPack 2 =
    PD15 */

    TM_PWM_InitChannel(&TIM4_Data, TM_PWM_Channel_4,
    TM_PWM_PinsPack_2);

    GPIO_ResetBits(GPIOD, GPIO_Pin_12);

    /* orizoume poso pososto tou duty cycle tou stm pou theloume */

    TM_PWM_SetChannel(&TIM4_Data, TM_PWM_Channel_3,
    TIM4_Data
    .Period / 3);

    /* An X>400 tote xrhsimopoihse to 25% tou duty cycle me thn idia

    fora peristrofhs */

    if (Axes_Data.X > 400){

    /* orizoume poso pososto tou duty cycle tou stm pou theloume */

    TM_PWM_SetChannel(&TIM4_Data, TM_PWM_Channel_3, TIM4_Data.Period / 4);

    }

    }

    /* Elegxos tou X aksona.

    An X<-200 tote anapse to prasino led kai xrhsimopoihse to 33% tou

    duty cycle kai kinhse to motor aristerostrofa */

    if(Axes_Data.X < -200){

    GPIO_ResetBits(GPIOD, GPIO_Pin_14);

    /* Energopoihsh tou PWM ston TIM4, Channel 1 and PinsPack 2 = PD12 */

    TM_PWM_InitChannel(&TIM4_Data, TM_PWM_Channel_1, TM_PWM_PinsPack_2);

    /* Energopoihsh tou PWM ston TIM4, Channel 2 and PinsPack 2 = PD13 */

    TM_PWM_InitChannel(&TIM4_Data, TM_PWM_Channel_2, TM_PWM_PinsPack_2);

    TM_PWM_InitChannel(&TIM4_Data, TM_PWM_Channel_3, TM_PWM_PinsPack_2);

    /* Eneropoihsh tou PWM ston TIM4, Channel 4 and PinsPack 2 = PD15 */

    TM_PWM_InitChannel(&TIM4_Data, TM_PWM_Channel_4, TM_PWM_PinsPack_2);

    /* orizoume poso pososto tou duty cycle tou stm pou theloume */

    TM_PWM_SetChannel(&TIM4_Data, TM_PWM_Channel_1, TIM4_Data.Period / 3);

    /* An X<-200 tote xrhsimopoihse to 25% tou duty cycle

    me thn idia fora peristrofhs */

    if (Axes_Data.X < -400) {

    TM_PWM_SetChannel(&TIM4_Data, TM_PWM_Channel_1, TIM4_Data.Period / 4);

    }

    }

    /* Otan den metakinoume to board,ta leds na paremenoun svhsta*/

    GPIO_ResetBits(GPIOD, GPIO_Pin_12|GPIO_Pin_14);

    }

    }

    Στο βίντεο φαίνεται η λειτουργία της πλακέτας με τον παραπάνω κώδικα.

    Η εικόνα στο πρόγραμμα Labview όπου έχει οπτικοποιηθεί η πλακέτα stm32f4g είναι η εξής.

    Στο πρόγραμμα Labview η εικόνα του block diagramm θα είναι η εξής.

    Υπάρχει και η δυνατότητα λήψης του αρχείου του προγράμματος Labview από τον παρακάτω σύνδεσμο.

    Labview File