In diesem Dokument geht's um die Inbetriebnahme vom Schwebekörper-Versuchsstand. Das NMPC-Verfahren mit exaktem Endzustand wird für den Schwebekörper auf einem STM32F767-Bord implementiert.
Um den Versuchsstand zu initialisieren, müssen die folgenden Vorbereitungen verfertigt und das Bord richtig mit dem Versuchstand verbunden werden.
These instructions will get you a copy of the project up and running on your local machine for development and testing purposes. See deployment for notes on how to deploy the project on a live system.
Hardware
- PC mit Linux Betriebssystem
- STM32F767
Software
- arm-none-eabi-gcc
- stlink
- ACADO Toolkit
Pin-Definitionen des STM-Bord finden Sie hier: NUCLEO-F767ZI
Funktionalität der GPIOs | Auswahl der alternativen Funktionen | Pins | Versuchsstand |
---|---|---|---|
TIM_OUT | PWM1/3 (AF1) | PE13 | Lüfter |
TIM_IN | PWM4/1 (AF2) | PB6 | Lüfter |
I2C SCL | I2C1 SCL(AF4) | PB8 | Ultraschallsensor |
I2C SDA | I2C1 SDA(AF4) | PB9 | Ultraschallsensor |
USART TX | USART3_TX(AF7) | PD8 | PC |
USART RX | USART3_RX (AF7) | PD9 | PC |
PS: Zusätzliche Verbindung zwischen dem Motor-Shield und einem verwendeten Pin benötig, weil das Pin nicht direkt mit dem verfügbaren Motor-Shield verbinden kann.
- arm-none-eabi-gcc mit Version 8.3.1 als Kompiler wird für das Projekt verwendet. Herunterladen der Source-Code von der Linke: Auswählen der 8-2019-q3-update.
- Entpacken der Source-Code
- Aktualisieren der Path-Variable dadurch: Eingabe der Pfad vom gcc-arm-none-eabi in .bashrc:
export PATH=/path/goes/here/gcc−arm−none−eabi/bin:$PATH
- Aufrufe der .bashrc-Datei:
source .bashrc
- Bestätigung der richtigen installation:
arm-none-eabi-gcc --version
Falls die richtigen Version-Informationen ausgegeben werden, ist der erste Schritt bis hier fertig.
PS: Falls Fehlermeldung auftritt, ist sehr möglich, dass GNU-C-Bibliothek oder andere Pakete installiert werden müssen. Lösung: Installation der Pakete anhand der Fehlermeldung.
- Um die ausführbare Code auf dem Mikrokontroller zu flashen und debugen, ist die Software stlink angefordert. Die verwendete Version ist v1.5.1
- Installationsanleitung anhand der folgenden Linke unter dem Teil von LInux: stlink-Installation
- ACADO Toolkit ist eine Software-Umgebung für Simulation der optimalen Steuerung und Code-Generation der MPC-Regler. Programm wird in C++ geschrieben und dann in C exportiert.
- Installationsanleitung anhand der folgenden Linke: ACAO-Installation
Im Verzeichnis project_schwebekoerper steht schon eine ausführbare Datei schwebekoerper.bin zur Verfügung. Was zu tun ist, die Datei schwebekoerper.bin auf dem Bord zu hochladen(flashen). Nach richtiger Verbindung des Nucleo-Bord mit dem Versuchsstand, ist die folgende Befehl auszuführen:
st-flash write schwebekoerper.bin 0x8000000
Um die richtige Informationen der seriellen Kommunikation, die durch USART in PC eingegeben werden, wird eine Software für die Kommunikation gefordert. Folgend Möglichkeiten sind verfügbar:
-
Kommunikation durch Putty für ein PC mit einem Windows Betriebsystem.
-
Nach dem Flashen der bin-Datei verbinden das Bord mit einem Windows-PC.
-
Eingeben das richtige Port der Kommunikation und Baudrate.
-
oder
-
Verwenden stty auf Linux-System oder WSL-System (Windows Subsystem for Linux)
-
Finden die Shell-Skripte under dem Verzeichnis \project_schwebekoerper\script
-
Geben ein richtiges Port-Pferd ein
-
Ausführen ssty_start.sh mit
sh ssty_start.sh
-
Damit werden die Messdaten jeder schleife empfangen.
-
Entwickelung des Acado-Modells für den Schwebekörper
- /schwebekoerper_umsetzung/schwebekoerper_acado/schwebekoerper.cpp
-
Änderung der eingebetteten Code
- /schwebekoerper_umsetzung/project_schwebekoerper/src/acado_function.c
-
Einstellung und Initialisierung des Bords
- /schwebekoerper_umsetzung/project_schwebekoerper/src/main.c
- /schwebekoerper_umsetzung/project_schwebekoerper/src/stm32f7xx_it.c
- /schwebekoerper_umsetzung/project_schwebekoerper/Inc
-
Erzeugung der ausführbaren Datei durch Makefile
- /schwebekoerper_umsetzung/project_schwebekoerper/Makefile
Das Regelungsproblem des Schwebekörpers wird in C++-Datei definiert und danach in C-Datei für das eingebettete System exportiert. Folgende Schritte werden in der Datei schwebekoerper.cpp angefordert:
- Definieren des Zustands und der Stellgröße
- Eingeben des Zeitkontinuierlichen Modells des Schwebekörpers
- Definieren der Gewichtungsmatrix, Endgewichtungsmatrix und Zielfunktion definieren
- Eingeben der Beschränkungen und Randbedingungen
- Auswählen der Funktionalität der exportierten Dateien
Detailliert findet man im Tutorial des ACADO-Toolkits in Kapitel 15.
Die geschriebene C++-Datei wird nach den folgenden Schritten in C-Dateien exportiert.
-
Erzeugen der Makefile durch Cmake
-
PS. 2 Dinge in Cmake zu ändern
- Ein weiteres Flag für Kompilierung muss eingesetzt, ansonst tritt Kompilierungsfehler auf. Durch:
if(UNIX) SET(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++0x") endif()
- Ausführbare Zieldatei, Source-C++-Datei und Ziel-Linke-Bibliothek müssen erneut anhand der Datei-Namen angepasst werden.
-
-
Ausführen cmake-file und erzeugen make-file für Kompilierung im Verzeichnis build:
cmake .\build
-
Erzeugen der ausführbaren Datei
make
-
Ausführen der Datei, um eingebettete Dateien zu erzeugen
./schwebekoerper
Bis hier erhält die benötigten Dateien für die eingebettete Implementierung.
PS. Weder eine Ruhelage als Referenz noch eine Referenz-Trajektorie soll in C++-Datei eingegeben. Wenn eine Referenz in C++-Datei definiert wird, triff ein Export-Fehler. Die Referenz soll in den erzeugten eingebetteten Dateien erneuert eingegeben werden.
In /schwebekoerper_umsetzung/project_schwebekoerper/src/acado_function werden Referenz, das gemessene aktuelle Zustand und Initialisierung der Zustände und Eingaben definiert.
Der Teil beschreibt, wie die Parameter ausgewählt werden und wie das Bord initialisiert wird. Alle folgenden Einstellungen werden mithilfe der verfügbaren HAL-APIs geschrieben. User-Manual findet man hier.
Die benötigten HAL-Source-Codes und -Headers sind schon im Verzeichnis /schwebekoerper_umsetzung/project_schwebekoerper/STM32F7xx_HAL_Driver verfügbar.
- TIM_OUT: PE13, PWM1/3 (AF1)
- TIM_IN(capture): PB6 PWM4/1 (AF2)
- I2C1: PB8 SCL(AF4), PB9 SDA(AF4)
- USART3: PD8 USART3_TX(AF7), PD9 USART3_RX (AF7)
-
read data: UART_Receive_IT
-
Interruptsweg:
interrupt ->USART3_IRQHandler-> HAL_UART_IRQHandler -> UART_Receive_IT ->(process receiving till --huart->RxXferCount == 0U) -> HAL_UART_RxCpltCallback
-
-
Interruptsweg: HAL_TIM_IC_Init -> HAL_TIM_IC_MspInit
-
TIM4_Config -> HAL_TIM_PWM_Init -> HAL_TIM_PWM_MspInit
-
TIM4 setting:
Moterfrequenz:
$2000-6000 \frac{1}{\min}$ ->$\frac{100}{3} - 100 \frac{1}{s}$ -> capture 30-150 Hz signal$\frac{54 \times 10^6}{(30-1+1)\times(60000-1+1)}$ = 30
- Handler wird in startup_.s definiert
- Auswählen der Parameter
- clock source and frequency. clock source can be chosen among PCK1(APB1 clock), HSI and SYSCLK. The value of PCK1 can be read from system clock setting with APB1 Prescaler = 4(216Mhz /4 = 54Mhz)
- Timing setting.
$t_{I2CCLK} = 1/(54 MHz)$ = 18,5185 ns
PRESC | SCLL | SCLH | SCLDEL | SDADEL |
---|---|---|---|---|
Prescaler | SCL low | SCL high | SCL delay | SDA delay |
1000ns+250ns=1250ns = 1,25us 1,25 / 0.24 = 5,21 5,21 - 1 <= SCDEL -> SCDEL >=5 |
||||
PRESC = 12 = 0xC | SCLL = 20 = 0x14 | SCLH = 0x10 | SCLDEL = 0x4 | SDADEL = 0x2 |
-
sequential transmission:
- I2C_FIRST_AND_NEXT_FRAME then I2C_NEXT_FRAME
- HAL_I2C_Master_Seq_Transmit_IT zu verwenden
-
Error interrupt: HAL_I2C_ER_IRQHandler -> I2C_ITError -> HAL_I2C_ErrorCallback
-
Event interrupt:
-
At transmission end of transfer, @ref HAL_I2C_MasterTxCpltCallback() is executed and user can add his own code by customization of function pointer @ref HAL_I2C_MasterTxCpltCallback().
-
At reception end of transfer, @ref HAL_I2C_MasterRxCpltCallback() is executed and user can add his own code by customization of function pointer @ref HAL_I2C_MasterRxCpltCallback()
-
When address slave I2C match, @ref HAL_I2C_AddrCallback() is executed and user can add his own code to check the Address Match Code and the transmission direction request by master (Write/Read).
-
example: HAL_I2C_Master_Seq_Transmit_IT -> set hi2c->XferISR = I2C_Master_ISR_IT -> HAL_I2C_EV_IRQHandler calls hi2c->XferISR(hi2c, itflags, itsources); (I2C_Master_ISR_IT ) -> I2C_ITMasterSeqCplt-> HAL_I2C_MasterRxCpltCallback
-
- Enable hal header file in stm32f7xx_hal_conf.h.
Durch Makefile werden Source-Dateien kompiliert und mit den dynamischen und statistischen Bibliotheken verbunden.
Source-Codes bestehen aus:
- STM32F7xx_HAL_Driver
- System-Funktionen
- Einstellung des Bords
- Formulierung des Optimalsteuerungsproblems in ACADO und der Solver in qpoases
Die Einstellung der Flags wird durch Probieren und umfangreich Recherche bestimmt. Referenz:
1. [gcc gnu: arm options](https://gcc.gnu.org/onlinedocs/gcc/ARM-Options.html)
2. [STM32 Forum](https://community.st.com/s/topic/0TO0X000000BSqSWAW/stm32-mcus)
Ausführen der Befehl
make
unter dem Verzeichnis /schwebekoerper_umsetzung/project_schwebekoerper/, um eine ausführbare Datei schwebekoerper.bin zu erzeugen. Vor der erneuerten Erzeugung der binären Datei, ist empfohlen, dass die vorherigen erzeugten Dateien durch
make clean
rauszulösen.
Die Zustandstrajektorien und Eingangsverlauf werden durch /schwebekoerper_umsetzung/project_schwebekoerper/src/py_read.py gemessen.
- Zhengang Zhong - Initial work