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 και επιταχυνσιόμετρου.

  • Αλλαγή φοράς και ταχύτητας περιστροφής των LED μέσω του επιταχυνσιόμετρου.

    Σε αυτή την εφαρμογή θα ασχοληθούμε με το επιταχυνσιόμετρο που είναι ενσωματωμένο στην πλακέτα. Το μοντέλο είναι το LIS3DSH της MEMS, και πρόκειται για ένα υψηλής απόδοσης γραμμικό επιταχυνσιόμετρο τριών αξόνων που ανήκει στην οικογένεια “nano” με ενσωματωμένη μηχανή κατάστασης που μπορεί να προγραμματιστεί ώστε να εκτελεί αυτόνομες εφαρμογές. Το LIS3DSH έχει δυναμικά επιλέξιμες κλίμακες των ±2g/±4g/±6g/±8g/±16g και έχει τη δυνατότητα να υπολογίζει επιταχύνσεις με ρυθμούς δεδομένων εξόδου από 3.125 Hz έως 1.6 kHz. Πιο συγκεκριμένα στην άσκηση θα χρησιμοποιήσουμε το επιταχυνσιόμετρο ώστε όταν αντιληφθεί επιτάχυνση στον χ ή στον ψ άξονα να πετύχουμε αλλαγή φοράς περιστροφής και ταχύτητας στη διαδοχή των LED. Όταν κινήσουμε την πλακέτα προς τα δεξιά, το επιταχυνσιόμετρο θα αντιληφθεί κίνηση στον χ άξονα και θα αρχίσει η διαδοχή των LED δεξιόστροφα. Αν το κινήσουμε προς τα αριστερά θα αντιληφθεί κίνηση στον χ’ και θα εκκινήσει αριστερόστροφη διαδοχή των LED. Σε οποιαδήποτε από τις δύο κατευθύνσεις αν υπάρξει κίνηση στον ψ άξονα η διαδοχή των LED θα είναι πιο γρήγορη, ενώ αν υπάρξει στον ψ’ θα έχουμε επιβράδυνση.

    Τα 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"

     /* Dedomena gia to Accelerometer */

    TM_LIS302DL_LIS3DSH_t Axes_Data;

     int main(void) {

    /* 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);

    while (1) {

    /* Anagnwsh twn dedomenwn stous aksones tou accelerometer */

    TM_LIS302DL_LIS3DSH_ReadAxes(&Axes_Data);

    /* Elegxos tou X aksona.

    An einai pros ta deksia tote tha anavoun deksiostrofa*/

    if (Axes_Data.X > 200) {

    TM_DISCO_LedOn(LED_RED);

    TM_DISCO_LedOff(LED_ORANGE);

    /* Elegxos tou Y aksona.

    Analoga me th thesi tou board auksanetai h meiwnetai h taxuthta diadoxhs twn leds*/

    if (Axes_Data.Y > 200){ Delayms(200);}

    else if (Axes_Data.Y < -200) {

    Delayms(800);}

    else{

    Delayms(500);}

    TM_DISCO_LedOn(LED_BLUE);

    TM_DISCO_LedOff(LED_RED);

    if (Axes_Data.Y > 200){ Delayms(200);}

    else if (Axes_Data.Y < -200) {

    Delayms(800);}

    else{

    Delayms(500);}

    TM_DISCO_LedOn(LED_GREEN);

    TM_DISCO_LedOff(LED_BLUE);

    if (Axes_Data.Y > 200){ Delayms(200);}

    else if (Axes_Data.Y < -200) {

    Delayms(800);}

    else{

    Delayms(500);}

    TM_DISCO_LedOn(LED_ORANGE);

    TM_DISCO_LedOff(LED_GREEN);

    if (Axes_Data.Y > 200){ Delayms(200);}

    else if (Axes_Data.Y < -200) {

    Delayms(800);}

    else{

    Delayms(500);}

    }

    /* Elegxos tou X aksona.

    An einai pros ta aristera tote tha anavoun aristerostrofa*/

    if (Axes_Data.X < -200) {

    TM_DISCO_LedOn(LED_RED);

    TM_DISCO_LedOff(LED_BLUE);

    /* Elegxos tou Y aksona.

    Analoga me th thesi tou board auksanetai h meiwnetai h taxuthta diadoxhs twn leds*/

    if (Axes_Data.Y > 200){ Delayms(200);}

    else if (Axes_Data.Y < -200) {

    Delayms(800);}

    else{

    Delayms(500);}

    TM_DISCO_LedOn(LED_ORANGE);

    TM_DISCO_LedOff(LED_RED);

    if (Axes_Data.Y > 200){ Delayms(200);}

    else if (Axes_Data.Y < -200) {

    Delayms(800);}

    else{

    Delayms(500);}

    TM_DISCO_LedOn(LED_GREEN);

    TM_DISCO_LedOff(LED_ORANGE);

    if (Axes_Data.Y > 200){ Delayms(200);}

    else if (Axes_Data.Y < -200) {

    Delayms(800);}

    else{

    Delayms(500);}

    TM_DISCO_LedOn(LED_BLUE);

    TM_DISCO_LedOff(LED_GREEN);

    if (Axes_Data.Y > 200){ Delayms(200);}

    else if (Axes_Data.Y < -200) {

    Delayms(800);}

    else{

    Delayms(500);}

    }

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

    TM_DISCO_LedOff(LED_ALL);

    }

    }

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



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

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

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

    Labview File