Individální projekty MPOA

Mikroprocesory s architekturou ARM

Uživatelské nástroje

Nástroje pro tento web


2015:rot-control

Rozdíly

Zde můžete vidět rozdíly mezi vybranou verzí a aktuální verzí dané stránky.

Odkaz na výstup diff

Obě strany předchozí revize Předchozí verze
Následující verze
Předchozí verze
2015:rot-control [2016/01/18 05:03]
David Krolák Firmware
2015:rot-control [2016/01/24 10:44] (aktuální)
David Krolák [Ukázka činnosti]
Řádek 1: Řádek 1:
-Not final 
 ====== Modul pro řízení mechanického rotačního systému ====== ====== Modul pro řízení mechanického rotačního systému ======
   * David Krolák   * David Krolák
Řádek 8: Řádek 7:
  
 ===== Úvod ===== ===== Úvod =====
-Uvedený projekt je součástí diplomové práce na téma //Modul pro verifikaci rotačních pozičních senzorů//, jejímž výstupem je návrh řídícího modulu včetně komunikačního rozhraní pro rotační systém ​dostupný na pracovišti firmy ON Design Czech. Cílem tohoto projektu je vytvořit program pro vhodně zvolenou vývojovou desku mikrokontroléru (dále MCU kit) umožňující jak řízení systému tak i časově synchronizovaný záznam velkého množství aktuálních pozic.+Uvedený projekt je součástí diplomové práce na téma //Modul pro verifikaci rotačních pozičních senzorů//, jejímž výstupem je návrh řídícího modulu včetně komunikačního rozhraní pro mechanický ​rotační systém. Cílem tohoto projektu je vytvořit program pro vhodně zvolenou vývojovou desku mikrokontroléru (dále MCU kit) umožňující jak řízení systému tak i časově synchronizovaný záznam velkého množství aktuálních pozic.
  
 ===== Hardware ===== ===== Hardware =====
Řádek 14: Řádek 13:
 {{ :​2015:​rot-control:​rotator_perspective.png?​direct&​400x356 |Rotační systém}} {{ :​2015:​rot-control:​rotator_perspective.png?​direct&​400x356 |Rotační systém}}
  
-Primární aplikací modulu je testování při vývoji bezkontaktních indukčních pozičních senzorů, kdy se vyhodnocuje přesnost měřeného úhlu natočení vůči referenční hodnotě zaznamenané právě touto jednotkou. Aplikační zapojení si lze prohlédnout na následujícím obrázku, kde A, B tvoří kvadraturní signál kodéru (vzájemný fázový posuv 90°) a M je tzv. index signál informující svou nástupnou hranou o počáteční pozici rotoru. Řídící signály STEP a DIR slouží k řízení otočení o předem definovaný krok. REQB je synchronizační ​singál ​jehož sestupná hrana definuje časové okamžiky zápisu aktuální pozice rotoru. Otáčky motorku se řídí velikosti napětí signálu SPD na vstupu lineárního zesilovače,​ kdy kladné napětí znamená otáčení ve směru hodinových ručiček a záporné napětí směr opačný. Digitální signál STOP nastavuje nulový točivý moment, aby se rotor neotáčel díky napěťovému ofsetu.+Primární aplikací modulu je testování při vývoji bezkontaktních indukčních pozičních senzorů, kdy se vyhodnocuje přesnost měřeného úhlu natočení vůči referenční hodnotě zaznamenané právě touto jednotkou. Aplikační zapojení si lze prohlédnout na následujícím obrázku, kde A, B tvoří kvadraturní signál kodéru (vzájemný fázový posuv 90°) a M je tzv. index signál informující svou nástupnou hranou o počáteční pozici rotoru. Řídící signály STEP a DIR slouží k řízení otočení o předem definovaný krok. REQB je synchronizační ​signál ​jehož sestupná hrana definuje časové okamžiky zápisu aktuální pozice rotoru. Otáčky motorku se řídí velikosti napětí signálu SPD na vstupu lineárního zesilovače,​ kdy kladné napětí znamená otáčení ve směru hodinových ručiček a záporné napětí směr opačný. Digitální signál STOP nastavuje nulový točivý moment, aby se rotor neotáčel díky napěťovému ofsetu.
 {{ :​2015:​rot-control:​zap_mer3.png?​direct&​500 |Aplikace modulu}} {{ :​2015:​rot-control:​zap_mer3.png?​direct&​500 |Aplikace modulu}}
  
Řádek 52: Řádek 51:
  
 ===== Firmware ===== ===== Firmware =====
-Program pro MCU byl vyvíjen v prostředí **Em::​Blocks** verze 2.30 a zkompilován **ARM GCC** kompilátorem,​ jež je součástí vývojového prostředí. Firmware se skládá z hlavního programu obsahující supersmyčku s konstrukci přepínače testující,​ zdali nedošlo k přijetí příkazu voláním procedůry ''​CDC_process_command(&​stop,​ &speed, &​direction,​ &​samples,​ &​step);''​ z knihovny **usbd_cdc_if.h** popřípadě k přerušení a tak ke změně stavu. Jednotlivé stavy jsou deklarovány pomocí globální výčtové proměnné ''​enum { Idle, MPOS_set, MPOS_loop, STEP_set, STEP_loop, MSPD_set, CALIB_set, STEP_proc, REQB_proc } Mode = Idle;''​. Jako globální proměnná je volena kvůli přístupu z podprogramů pro obsluhu přerušení.+Program pro MCU byl vyvíjen v prostředí **Em::​Blocks** verze 2.30 a zkompilován **ARM GCC** kompilátorem,​ jež je součástí vývojového prostředí. Firmware se skládá z hlavního programu obsahující supersmyčku s konstrukci přepínače testující,​ zdali nedošlo k přijetí příkazu voláním procedůry ''​CDC_process_command(&​stop,​ &speed, &​direction,​ &​samples,​ &​step);''​ z knihovny **usbd_cdc_if.h** popřípadě k přerušení a tak ke změně stavu. Jednotlivé stavy jsou deklarovány pomocí globální výčtové proměnné ''​enum { Idle, MPOS_set, MPOS_loop, STEP_set, STEP_loop, MSPD_set, CALIB_set, STEP_proc, REQB_proc } Mode = Idle;''​. Jako globální proměnná je volena kvůli přístupu z podprogramů pro obsluhu přerušení. Před vstupem do smyčky se provede inicializace použitých periférií a zavolá se funkce **Rotator_calib()** pro zjištění konstanty úměrnosti kn mezi výstupními otáčkami rotoru a kódem DAC.
  
 Následující obrázek ukazuje stavový diagram popisující změnu stavu na základě přijatého příkazu, splnění podmínky měření pozic nebo zmáčknutí uživatelského tlačítka (Button = 1). Zejména na začátku program čeká na stisk tlačítka pro korektní komunikaci přes virtuální sériovou linku ve smyslu zachycení začátku vysílaných dat (v okně telnetu se vypíše menu příkazů). Při zmačknutí tlačítka Reset se pochopitelně neprodleně přejde do stavu Reset, který není potřeba deklarovat ve výčtové proměnné. ​ Následující obrázek ukazuje stavový diagram popisující změnu stavu na základě přijatého příkazu, splnění podmínky měření pozic nebo zmáčknutí uživatelského tlačítka (Button = 1). Zejména na začátku program čeká na stisk tlačítka pro korektní komunikaci přes virtuální sériovou linku ve smyslu zachycení začátku vysílaných dat (v okně telnetu se vypíše menu příkazů). Při zmačknutí tlačítka Reset se pochopitelně neprodleně přejde do stavu Reset, který není potřeba deklarovat ve výčtové proměnné. ​
Řádek 87: Řádek 86:
 </​code>​ </​code>​
  
-Definice přijímacího a vysílacího bufferu (''#​define APP_RX_DATA_SIZE ​ 64''​ a ''#​define APP_TX_DATA_SIZE ​ 64''​) byla přemístěna ze zdrojového souboru **usbd_cdc_if.c** do hlavičkového souboru **usbd_cdc_if.h**,​ aby byla přístupná pro hlavní program, kde se deklaruje interní buffer pro předávání textových řetězců funkci pro odeslání na osobní počítač. Terminál operačního systému Windows používá CDC příkazy pro adekvátní nastavení ​kodování ​linky a také vyžaduje vyčíst toto kódování zpět. Tato akce je zachycena pomocí funkce ''​static int8_t CDC_Control_HS ​ (uint8_t cmd, uint8_t* pbuf, uint16_t length)'',​ do které bylo nutné doplnit jednoduchý trik uvedený v následující ukázce kódu pro zpětné odeslání přijatého kódování (více informací [[https://​blog.brichacek.net/​wp-content/​uploads/​2015/​10/​STM32F4-and-USB.pdf|zde]]).+Definice přijímacího a vysílacího bufferu (''#​define APP_RX_DATA_SIZE ​ 64''​ a ''#​define APP_TX_DATA_SIZE ​ 64''​) byla přemístěna ze zdrojového souboru **usbd_cdc_if.c** do hlavičkového souboru **usbd_cdc_if.h**,​ aby byla přístupná pro hlavní program, kde se deklaruje interní buffer pro předávání textových řetězců funkci pro odeslání na osobní počítač. Terminál operačního systému Windows používá CDC příkazy pro adekvátní nastavení ​kódováni ​linky a také vyžaduje vyčíst toto kódování zpět. Tato akce je zachycena pomocí funkce ''​static int8_t CDC_Control_HS ​ (uint8_t cmd, uint8_t* pbuf, uint16_t length)'',​ do které bylo nutné doplnit jednoduchý trik uvedený v následující ukázce kódu pro zpětné odeslání přijatého kódování (více informací [[https://​blog.brichacek.net/​wp-content/​uploads/​2015/​10/​STM32F4-and-USB.pdf|zde]]).
 <code c> <code c>
 ... ...
Řádek 127: Řádek 126:
 </​code>​ </​code>​
  
-Do funkce volané při příjmu byl implementován tzv. loopback pro odeslání přijatého znaku zpět do uživatelova terminálu na osobním počítači pro zobrazování zadávaných znaků příkazu, který tak není psán "​naslepo"​. Tato funkce také vyhodnocuje,​ zdali nebylo dokončeno psaní příkazu čili jeho odeslání k zpracování zmáčknutím klávesy enter. Pokud je tedy přijat netisknutelný znak carriage return ''​\r''​ tak se posílá přijatý řetězec pomocí nastavení přiznakové ​proměnné ''​CDC_command_ready''​ na nenulovou hodnotu k dalšímu zpracování funkci ''​void CDC_process_command(uint8_t *Stop, uint8_t *Speed, uint8_t *Direction, uint32_t *Samples, uint32_t *Step)'',​ která zde z důvodu velkého rozsahu není uvedena, ale lze si ji prohlédnout v přiloženém archivu projektu v sekci zdrojové kódy.+Do funkce volané při příjmu byl implementován tzv. loopback pro odeslání přijatého znaku zpět do uživatelova terminálu na osobním počítači pro zobrazování zadávaných znaků příkazu, který tak není psán "​naslepo"​. Tato funkce také vyhodnocuje,​ zdali nebylo dokončeno psaní příkazu čili jeho odeslání k zpracování zmáčknutím klávesy enter. Pokud je tedy přijat netisknutelný znak carriage return ''​\r''​ tak se posílá přijatý řetězec pomocí nastavení příznakové ​proměnné ''​CDC_command_ready''​ na nenulovou hodnotu k dalšímu zpracování funkci ''​void CDC_process_command(uint8_t *Stop, uint8_t *Speed, uint8_t *Direction, uint32_t *Samples, uint32_t *Step)'',​ která zde z důvodu velkého rozsahu není uvedena, ale lze si ji prohlédnout v přiloženém archivu projektu v sekci zdrojové kódy.
 <code c> <code c>
 static int8_t CDC_Receive_HS (uint8_t* Buf, uint32_t *Len) static int8_t CDC_Receive_HS (uint8_t* Buf, uint32_t *Len)
Řádek 154: Řádek 153:
 </​code>​ </​code>​
  
-Následuje ​procedůra ​využívající funkci ''​uint8_t CDC_Transmit_HS(uint8_t* Buf, uint16_t Len)'',​ která byla vytvořená pro snadnější a spolehlivější odesílání textových řetězců. Testuje se zde zdali je možné odeslat data, kdy se v případě zaneprázdnění USB čeká 1 ms. Celkem je deset pokusů, po desátém pokusu se data zahazují.+Následuje ​procedura ​využívající funkci ''​uint8_t CDC_Transmit_HS(uint8_t* Buf, uint16_t Len)'',​ která byla vytvořená pro snadnější a spolehlivější odesílání textových řetězců. Testuje se zde zdali je možné odeslat data, kdy se v případě zaneprázdnění USB čeká 1 ms. Celkem je deset pokusů, po desátém pokusu se data zahazují.
 <code c> <code c>
 void CDC_Send_HS(char* Buf, uint16_t Len) void CDC_Send_HS(char* Buf, uint16_t Len)
Řádek 228: Řádek 227:
 </​code>​ </​code>​
  
-Následující kód ukazuje inicializaci flexibilního ​controléru ​externí paměti, kde bylo nutné doplnit odeslání konfiguračních příkazu SDRAM paměti včetně korektního časování. Použitá paměť dovoluje maximální obnovovací interval paměťové buňky 15,6 us. Pro zajištění určité spolehlivosti byla zvolena poloviční doba, které odpovídá při kmitočtu SDCLK 84 MHz hodnota obnovovacího čítače 656. Další definiční hodnoty jako je počáteční adresa paměti apod. byly přidány do hlavičkového souboru **mxconstants.h**.+Následující kód ukazuje inicializaci flexibilního ​kontroléru ​externí paměti, kde bylo nutné doplnit odeslání konfiguračních příkazu SDRAM paměti včetně korektního časování. Použitá paměť dovoluje maximální obnovovací interval paměťové buňky 15,6 us. Pro zajištění určité spolehlivosti byla zvolena poloviční doba, které odpovídá při kmitočtu SDCLK 84 MHz hodnota obnovovacího čítače 656. Další definiční hodnoty jako je počáteční adresa paměti apod. byly přidány do hlavičkového souboru **mxconstants.h**.
 <code c> <code c>
 ... ...
Řádek 321: Řádek 320:
 </​code>​ </​code>​
  
-Následuje obrázek ukazující výsledek testu všech buněk SDRAM paměti. S danou externí paměti dat je možné uložit 2 097 152 vzorků pozic s 4 B zarovnáním. Proto při zápisu a čtení vystupuje čtyčnásobek indexu dat.+Následuje obrázek ukazující výsledek testu všech buněk SDRAM paměti. S danou externí paměti dat je možné uložit 2 097 152 vzorků pozic s 4 B zarovnáním. Proto při zápisu a čtení vystupuje čtyřnásobek indexu dat.
 {{ :​2015:​rot-control:​sdram_test.png?​direct |Test SDRAM 8 MB}} {{ :​2015:​rot-control:​sdram_test.png?​direct |Test SDRAM 8 MB}}
  
-Pro potřeby ​ledění programu, kdy nebyl mechanický rotační kodér takříkajíc po ruce se použily dva kanály časovače TIM1 pro generování kvadraturního signálu potřebné frekvence. Následující kód uvádí inicializaci časovače ve funcki emulátoru kodéru. Díky předděličky PSC je možné nastavovat výstupní kmitočet v širokých mezích. Emulovaný kodér se poté spustí voláním ​procedůry ​''​static void Emulate_Encoder_Start(TIM_HandleTypeDef* htim)'',​ která spustí generování signálu jednotlivých kanálů pomocí ''​HAL_StatusTypeDef HAL_TIM_OC_Start(TIM_HandleTypeDef *htim, uint32_t Channel)''​.+Pro potřeby ​ladění programu, kdy nebyl mechanický rotační kodér takříkajíc po rucese použily dva kanály časovače TIM1 pro generování kvadraturního signálu potřebné frekvence. Následující kód uvádí inicializaci časovače ve funcki emulátoru kodéru. Díky předděličky PSC je možné nastavovat výstupní kmitočet v širokých mezích. Emulovaný kodér se poté spustí voláním ​procedury ​''​static void Emulate_Encoder_Start(TIM_HandleTypeDef* htim)'',​ která spustí generování signálu jednotlivých kanálů pomocí ''​HAL_StatusTypeDef HAL_TIM_OC_Start(TIM_HandleTypeDef *htim, uint32_t Channel)''​.
 <code c> <code c>
 ... ...
Řádek 358: Řádek 357:
 </​code>​ </​code>​
  
-Knihovna **rotator.h** pro ovládání rotačního mechanického systému obsahuje následující ​procedůry ​a funkce:+Knihovna **rotator.h** pro ovládání rotačního mechanického systému obsahuje následující ​procedury ​a funkce:
   * **Rotator_set_base_pos()** - nastaví nulovou pozici rotoru   * **Rotator_set_base_pos()** - nastaví nulovou pozici rotoru
   * **Rotator_run(uint8_t rpm, uint8_t direction)** - roztočí rotor požadovanou rychlostí a v požadovaném směru s pevně danou strmostí zvyšování rychlosti ​   * **Rotator_run(uint8_t rpm, uint8_t direction)** - roztočí rotor požadovanou rychlostí a v požadovaném směru s pevně danou strmostí zvyšování rychlosti ​
   * **Rotator_stop()** - zastaví rotor s pevně danou strmosti snižování rychlosti   * **Rotator_stop()** - zastaví rotor s pevně danou strmosti snižování rychlosti
   * **Rotator_step_proc(uint32_t step)** - otočí rotorem o zadaný krok   * **Rotator_step_proc(uint32_t step)** - otočí rotorem o zadaný krok
-  * **float Rotator_calib()** - slouží k získání konstanty úměrnosti pro adekvátní nastavení otáček rotoru+  * **float Rotator_calib()** - slouží k získání konstanty úměrnosti pro adekvátní nastavení otáček rotoru ​(měří ve třech bodech očekávaného výstupního napětí DAC)
   * **float Rotator_rpm_meas()** - měření rychlosti využívající pevně stanovený časový interval   * **float Rotator_rpm_meas()** - měření rychlosti využívající pevně stanovený časový interval
-  ​+ 
 +Následující kód ukazuje funkci měření rychlosti s pevně stanoveným časovým intervalem. Uvedený algoritmus obsahuje také ošetření nekorektního výpočtu rychlosti kvůli přechodu pozice nulou např. při čítání nahoru, když je počátek 399000 a koncová pozice 1000. 
 +<code c> 
 +/Rotor speed measurement of the rotator in rpm */ 
 +float Rotator_rpm_meas(void) 
 +
 +    static float    temp      = 0.0; 
 +    static uint32_t beginning = 0; 
 +    static uint32_t position ​ = 0; 
 + 
 +    /* Capture and calculate delta position for 100 ms period */ 
 +    beginning = __HAL_TIM_GET_COUNTER(&​htim8) + Rep_count * (Encoder_rep_res + 1); 
 +    HAL_Delay(100);​ 
 +    position ​ = __HAL_TIM_GET_COUNTER(&​htim8) + Rep_count * (Encoder_rep_res + 1); 
 + 
 +    /* Check direction of the rotator */ 
 +    if(__HAL_TIM_IS_TIM_COUNTING_DOWN(&​htim8)) 
 +    { 
 +        /* Check cross zero position */ 
 +        if(beginning > position) 
 +        { 
 +            temp = (float)(beginning - position);​ 
 +        } 
 +        else 
 +        { 
 +            /* Cross zero position correction */ 
 +            temp = (float)(Encoder_res - position + beginning);​ 
 +        } 
 +    } 
 +    else 
 +    { 
 +        if(position > beginning) 
 +        { 
 +            temp = (float)(position - beginning);​ 
 +        } 
 +        else 
 +        { 
 +            /* Cross zero position correction */ 
 +            temp = (float)(Encoder_res - beginning + position);​ 
 +        } 
 +    } 
 + 
 +    return 600.0 * temp/​Encoder_res;​ 
 +
 +</​code>​ 
 ===== Ukázka činnosti ===== ===== Ukázka činnosti =====
-Text+Následující snímky obrazovek terminálů ukazují úvodní menu po stisku tlačítka. Poté během cca čtyř vteřin proběhne kalibrace rotačního mechanického systému. Po této kalibraci je rotor natočen na nulovou pozici. Program v tuto chvíli očekává příkaz, kterým se zvolí požadovaná funkce systému. Na výběr je měření pozic v závislosti na synchronizačním signálu REQB se zadaným počtem vzorků, rychlosti a směrem otáčení. Dále kontinuální měření aktuální rychlostí rotoru MSPD, kdy se rotor roztočí opět zadanou rychlostí a směrem. Funkce STEP umožňuje krokovat pozici rotoru v závislosti na zadaném kroku a externích signálech STEP a DIR. Na každou nástupnou hranu signálu STEP se rotor otočí o požadovaný krok a směr definovaný signálem DIR. A nakonec je možnost znovu provést kalibraci rotačního systému příkazem CALIB. Program umožňuje zobrazit nápovědu a kontroluje hodnoty zadávaných parametrů. 
 + 
 +První ukázka je synchronní poziční měření s rychlostí 10 otáček za minutu ve směru hodinových ručiček pro tři vzorky. Výstupní kmitočet emulovaného kodéru činí 100 kHz. Stop signál se nastaví na nulu a výstup DAC začne postupně stoupat až dosáhne adekvátní hodnoty. Poté postupným přivedením synchronizačních pulzů dojde k zaznamenání pozice do paměti SDRAM. Po dosáhnutí zadaného počtu vzorků napětí výstupu DAC začne rychle klesat a STOP signál se nastaví na logickou jedničku. Do terminálu se vypíšou zaznamenané hodnoty pozic z externí paměti. 
 + 
 +Při testování funkce stepování byly vyzkoušeny zejména krajní hodnoty kroku a to 200 000 a experimentálně 1. Při tomto testu se nezobrazil informační text o konfiguraci měřicího procesu kvůli zaneprázdněnému USB. Po desátém pokusu o odeslání se data zahodí. Tento stav se při dalším testování neopakoval. Po přivedení nástupné hrany na vstup STEP se nastaví na výstupu DAC napětí menší než 1,25 V při nulovém napětí signálu DIR. Poté co čítač napočítá daný počet kroků se výstupní napětí nastaví zpět na 1,25 V a zobrazí se dosažená pozice. Měření bylo po několika testech ukončeno příkazem STOP. Pokusem na rotačním zařízení bylo zjištěno, že nejmenší hodnota kroku činí 80 000 pozic při cca 10 otáčkách za minutu kvůli dynamickým vlastnostem celého systému. 
 + 
 +Mód měření rychlosti se aktivuje příkazem MSPD s požadovanou rychlostí a směrem otáčení rotoru. Po nastavení odpovídající hodnotě napětí na výstupu DAC se periodicky co 100 ms vypisuje v okně terminálu informace o aktuální rychlosti, která při kmitočtu kvadraturního signálu 100 kHz a s uvažovaným rozlišením kodéru 400 000 PPR činí 30 otáček za minutu. Měření se korektně ukončilo stiskem tlačítka. 
 + 
 +Příkaz CALIB byl také testován, ačkoliv s emulovaným signálem kodéru o konstantním kmitočtu vypočtená hodnota nedává smysl.
 {{ :​2015:​rot-control:​command_emul_test.png?​direct |Test programu s emulovaným kodérem}} {{ :​2015:​rot-control:​command_emul_test.png?​direct |Test programu s emulovaným kodérem}}
  
-{{ :​2015:​rot-control:​emul_enc_tim1_forwdir.png?​direct |}} +Obrázek nalevo ukazuje test krokování pozice s emulovaným kodérem při ladění programu a snímek napravo uvádí měření rychlosti při nastavených otáčkách,​ které je použito ke kontrole kalibrace a také ke zjištění regulačních charakteristik systému. 
-{{ :​2015:​rot-control:​emul_enc_tim1_backdir.png?​direct |}}+{{ :​2015:​rot-control:​stepemultest_mspd_encoder.png?​direct |STEP s emulovaným kodérem a měření rychlosti na reálném kodéru}} 
 + 
 +Následující snímky ukazují výstupní emulovaný kvadraturní signál generovaný při nastaveném požadovaném kmitočtu 1 kHz s předděličkou 1000. První snímek emuluje otáčení ve směru hodinových ručiček. Druhý směr opačný. 
 +{{ :​2015:​rot-control:​emul_enc_tim1_forwdir.png?​direct&​500 ​|Emulovaný signál v kladném směru otáčení}} 
 +{{ :​2015:​rot-control:​emul_enc_tim1_backdir.png?​direct&​500 ​|Emulovaný signál v opačném smeru otáčení}} 
 + 
 +Videoukázka činnosti modulu s mechanickým rotačním systémem:​ 
 +{{youtube>​4CmBFKIEgZY?​medium}}
  
 ===== Zdrojové soubory ===== ===== Zdrojové soubory =====
-Použité a vytvořené zdrojové soubory projektu se nacházejí v přiloženém archivu. {{:​2015:​rot-control:​module.rar|Program pro MCU}}+Použité a vytvořené zdrojové soubory ​knihoven a hlavního programu ​projektu se nacházejí v přiloženém archivu. {{:​2015:​rot-control:​module.rar|Program pro MCU}}
  
 ===== Závěr ===== ===== Závěr =====
 +Použití aplikace STM32CubeMX výrazně urychluje vývoj embedded aplikací, avšak tato aplikace ještě skýtá pár nedostatků ve formě poznámek k nastavení periférií. Například při nastavení časovače do funkce čítání pulsů z inkrementálního kodéru v módu TI12 by mohla informovat, že není dovolené nastavovat jednotlivé vstupy kanálů, aby reagovaly jak na nástupnou tak i sestupnou hranu pro správnou funkčnost.
  
 +Vytvořený firmware je plně funkční, kdy důkazem jsou vyfocené obrazovky terminálu pro komunikaci s modulem přes virtuální sériový port, videoukázka a naměřené průběhy signálu emulovaného kodéru. Při měření rychlosti otáčení s emulovaným kodérem je vidět vliv zaokrouhlovací chyby floatu při přechodu pozice nulou, kdy se provádí korekce se započítáním rozlišení kodéru. Nicméně tato chyba se projevuje na druhém desetinném místě a není až tak významná.
  
 +Při měření rychlosti otáčení s mechanickým systémem se nastavené otáčky od měřených odlišují z důvodů zesílení servozesilovače,​ které není konstantní v celém pracovním rozsahu. Konečná pozice u krokování s emulovaným kodérem běžícím na kmitočtu 100 kHz je větší o 7 pozic kvůli pozdějšímu vyčtení obsahu čítače při odesílání zprávy přes USB.
2015/rot-control.1453089808.txt.gz · Poslední úprava: 2016/01/18 05:03 autor: David Krolák