20180202_Beschreibung
Erfolgreiche ePaper selbst erstellen
Machen Sie aus Ihren PDF Publikationen ein blätterbares Flipbook mit unserer einzigartigen Google optimierten e-Paper Software.
Automatisierung einer Garage<br />
Gruppe 21B<br />
Malte Katz, Tim Block, Nicolas Fritsche, Maxime Junghänel
Inhalt<br />
Funktionsbeschreibung Parkhaus .................................................................................................. 3<br />
Verwendete Hardware: ................................................................................................................ 4<br />
Kontextdiagramm ........................................................................................................................ 5<br />
SA/RT........................................................................................................................................... 6<br />
Zustandsübergangsdiagramm ....................................................................................................... 7<br />
Prozessaktivierungstabelle ........................................................................................................... 8<br />
Dokumentation der Schnittstellen ................................................................................................ 9<br />
LEDs ..................................................................................................................................................... 9<br />
Empfängereinheiten ............................................................................................................................ 9<br />
Fernbedienung .................................................................................................................................. 10<br />
Motorsteuerung ................................................................................................................................ 12<br />
Pinbelegung ............................................................................................................................... 14<br />
Schaltplan .................................................................................................................................. 15<br />
Verdrahtungsplan ...................................................................................................................... 16<br />
Testplanung und Ergebnisse ....................................................................................................... 17<br />
Source-Code ............................................................................................................................... 18<br />
2
Funktionsbeschreibung Parkhaus<br />
In dem Projekt wurde ein Parkhaus aus Lego mittels eines Nucleo F401RE automatisiert.<br />
Das Parkhaus besteht aus einem Tor mit Lichtschranke, welches sich öffnen und schließen<br />
lässt, einem Schlitten, welcher das Auto in der Horizontalen bewegen kann, einer<br />
Fernbedienung zum Öffnen des Tors sowie einem Taster zum Schließen des Tors und Status-<br />
LEDs.<br />
Zunächst initialisiert sich das Parkhaus. Das bedeutet, der Schlitten fährt nach hinten. Bei der<br />
Schlittenbewegung leuchtet die Gelbe LED. Ist der Schlitten angekommen, befindet sich das<br />
Model im Zustand „TorZu“.<br />
Durch einen Infrarotbefehl der Fernbedienung (Simulation eines personalisierten Signals)<br />
wird ein Motor angesteuert und der Schlitten fährt nach vorne bis der Grenztaster ein Signal<br />
liefert. Die Gelbe LED signalisiert erneut die Bewegung des Schlittens. Der Schlitten befindet<br />
sich nun vorne und das Tor ist geschlossen.<br />
Das Tor wird nun automatisch geöffnet. Der Motor wird dazu so lange angesteuert bis der<br />
obere Grenztaster aktiviert wird. Eine Rote LED zeigt an, dass eine gefährliche Bewegung des<br />
Tors stattfindet. Dabei überwacht eine Lichtschranke den Gefahrenbereich, um beim<br />
Betreten des Gefahrenbereichs abzuschalten.<br />
Nun kann das Auto auf den Schlitten gefahren werden. Eine Grüne LED signalisiert diesen<br />
Zustand. Wenn der Taster betätigt wird (eine Person bestätigt, dass das Auto sicher auf dem<br />
3
Schlitten steht), sowie die Lichtschranke kein Objekt erkennt, wird das Garagentor herunter<br />
gefahren bis ein Grenztaster erkennt, dass das Tor unten ist.<br />
Nachdem das Garagentor unten ist, startet der Motor, welcher den Schlitten mit Auto in die<br />
Parkposition fährt. Die Endposition ist erreicht, wenn der Grenztaster im hinteren Bereich<br />
ein Signal gibt. Solange der Schlitten fährt, wird die Gelbe LED erneut eingeschaltet. Nun ist<br />
das Parkhaus im Zustand „TorZu“. Die LED´s sind ausgeschaltet.<br />
Das erneut eingelesene Signal der Fernbedienung (personalisiertes Signal um zu wissen<br />
welches Auto abgeholt werden soll) aktiviert den Motor des Schlittens woraufhin dieser mit<br />
dem Auto nach vorne fährt, bis der vordere Grenztaster betätigt wird. Dabei wird die gelbe<br />
LED eingeschaltet.<br />
Danach wird das Tor geöffnet und durch die grüne LED wird angezeigt, dass das Auto<br />
herausgefahren werden kann.<br />
Mit dem Taster wird signalisiert das das Auto herausgefahren wurde. Somit fährt das Tor<br />
wieder zu und fährt in die Position, der Schlitten befindet sich hinten um eventuell andere<br />
Autos aus dem Lager abholen zu können.<br />
Verwendete Hardware:<br />
• Nucleo Board F401RE<br />
• IR Sender/Empfänger<br />
• 2x DC-Motoren<br />
• Lichtschranke, Sender/Empfänger<br />
• 4x Grenztaster<br />
• 2x Taster<br />
• Aufbau aus Lego<br />
• Selbstgebautes Legogetriebe Tor (1:75)<br />
• Selbstgebautes Legogetriebe Schlitten (1:36)<br />
• 2x LED Grün;<br />
• LED Rot<br />
• LED Gelb,<br />
• Widerstände in Ohm ( 3x 330 ; 75; 3,3M; 2,7M; 3x 2,2 ; 2x 1; 390 ; 3x 39k)<br />
• L293D<br />
• NE555<br />
• 2x Keramik Kondensator; 10nF , 100nF<br />
4
Kontextdiagramm<br />
Im Kontext sind auf der linken Seite alle Aktoren zu sehen, dazu gehören die Leds und die<br />
Motoren. Rechts hingegen sind die Sensoren, dazu gehören die 4 Grenztaster die das<br />
Abschalten des Motors auslösen, der Empfänger der die Signale der Infrarot Fernbedienung<br />
ausliest, eine Lichtschranke die prüft ob ein Objekt vor dem Tor ist und ein Taster zum<br />
Schließen des Tors.<br />
Die Sensoren liefern in unseren Fall alle einen Kotrollfluss (Rot dargestellt), da deren<br />
Information essentiell für die Funktion ist, und im Zustandsautomat einen Zustandswechsel<br />
auslösen werden.<br />
5
SA/RT<br />
Im SA/RT Diagramm sind alle Kreise Prozesse, die sich im Source Code als Funktion<br />
widerspiegeln. Es gibt ein Prozess um jede Led anzuschalten und einen weitern um die Led<br />
auszuschalten. Dies macht die Handhabung in der PAT Tabelle übersichtlicher.<br />
Die Prozesse „IR_Empfaenger“ und „LS_Analog_Wert“ bekommen einen Analogwert von<br />
0-4096 übergeben und werten in ein digitales Signal umgewandelt, welches als Kontrollfluss<br />
auf den Knoten gehen.<br />
Der Prozess „Warten“ hat keine Daten bzw. Kontrollflüsse, da nur ein Delay von 3 Sekunden<br />
aufgerufen wird, falls sich ein Objekt in der Lichtschranke befindet und der Automat im<br />
Notzustand ist. Wenn das Objekt jetzt aus der Lichtschranke entfernt wird, würde das Tor<br />
sofort schließen und eventuell jemanden verletzen.<br />
6
Zustandsübergangsdiagramm<br />
Unser Zustandsdiagramm ist ein Mealy-Automat. Wir haben Sechs Zustände in denen sich<br />
das System im regulären Betrieb befindet. Weiter gibt es noch einen Zustand für die<br />
Initialisierung und einen zwei Not-Zustände. Die Bedingungen der Übergänge sind die<br />
Kontrollflüsse unseres SA/RT Diagramms und die Aktionen der Übergänge rufen einen oder<br />
mehrere Prozesse auf so wie es in der Prozessaktivierungstabelle vorgegeben ist. Es gibt hier<br />
einige Besonderheiten die nicht direkt verständlich sind. Da wir in unserem Ruhezustand<br />
„TorZu“ nichts machen außer auf ein richtiges Infrarot Signal zu warten gibt es hier einen<br />
Übergang auf sich selbst, wenn keine andere Bedingung der Übergänge zutrifft, um dann<br />
erneut das Infrarot Signal abzufragen. Nach demselben Prinzip gibt es einen Übergang auf<br />
sich selber um Die Lichtschranke zwischen dem Tor abzufragen.<br />
7
Prozessaktivierungstabelle<br />
Aktionen\Prozesse 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15<br />
Schlitten_Wegbringen 1 2<br />
Schlitten_Ausschalten 2 1<br />
Schlitten_Holen 1 2<br />
Tor_Oeffnen 3 2 4 1<br />
Tor_Schliessen 2 1 3<br />
Tor_Zu_Einschalten 2 3 1<br />
Tor_Auf_Einschalten 2 3 1<br />
Tor_Ausschalten 2 1<br />
Tor_Geoeffnet 3 2 1<br />
Signal_Pruefen 1<br />
Schranke_Pruefen 1<br />
Prozesse: 1: LGe_An, 2: Lro_An, 3: LGr_An, 4: LGe_Aus, 5: Lro_Aus, 6: LGr_Aus, 7: M_Tor_Stopp, 8: M_Tor_Auf, 9: M_Tor_Zu, 10: M_Schlitten_Stopp,<br />
11: M_Schlitten_Hinten, 12: M_Schlitten_Vorne, 13: Warten, 14: IR_Empf, 15: LS_Pruefen<br />
8
Dokumentation der Schnittstellen<br />
LEDs<br />
RVor/ Ω UVersorg/ V IIst /mA IMax/ mA λ/ nm<br />
LED Rot 330 5 15 20 660<br />
LED Grün 330 5 15 20 570<br />
LED Gelb 330 5 15 20 590<br />
Tx Lichtschranke 75 5 66 100 940<br />
Da der IMin in allen Fällen deutlich kleiner als IMax ist, kann von einer langen Lebensdauer<br />
ausgegangen werden. Die Wellenlängen der Senderdiode der Lichtschranke sowie der<br />
Fernbedienung liegen mit 940nm im Bereich der Fotoempfindlichkeit der Fotodiode.<br />
Empfängereinheiten<br />
Unter Zuhilfenahme eines Spannungsteilers, bestehend aus einem Widerstand und der<br />
Fotodiode, wird überprüft, ob die Diode Bestrahlt wird. Der Widerstand der Fotodiode sinkt<br />
bei Einstrahlung von UV-Licht. Dieser Spannungsabfall wird von den Pins PA5 und PA7 analog<br />
gemessen. Es wird ein 2,7MΩ bzw. ein 3,3MΩ Widerstand Verwendet, da kein 3MΩ<br />
Widerstand vorhanden war. An den Dioden Stellen sich die Spannungen aus untenstehender<br />
Tabelle ein.<br />
Fotoempfindlichkeit/nm Ubestrahlt/V Uunbestrahlt/ V<br />
Rx Lichtschranke 880-1120 0,02 0,1<br />
Rx Fernbedienung 880-1120 0,3 1,14<br />
9
Fernbedienung<br />
Die hier beschriebene Schaltung (Schaltplan S.11) stellt einen IR-Sender dar, der ein<br />
Rechtecksignal mit ca. 1200 Hz sendet.<br />
Die Schaltung wird mit 9 Volt Eingangsspannung betrieben, und das Rechteck Signal wird<br />
durch ein IC (TI NE555) erzeugt. Um die gewünschte Frequenz zu erhalten, werden die 8<br />
Eingänge des IC wie folgt beschaltet. Pin 4 und 8 werden an die 9 Volt angeschlossen, Pin 1<br />
auf Ground.<br />
Laut Datenblatt entspricht die Frequenz f =<br />
1<br />
0.693(39kΩ+2∗39kΩ)∗10nF<br />
ist und ca. 1233 Hz ergibt.<br />
1<br />
0.693(R1+R2∗2)∗C1<br />
, was in unserem Fall<br />
Das Rechtecksignal wird auf den Ausgang gelegt (Pin3) und hat eine Amplitude von ca. 9<br />
Volt.<br />
Um die IR-LED zu betreiben muss ein geeigneter Vorwiederstand definiert werden, um einen<br />
Arbeitspunkt von 1.2 V und 20 mA zu schaffen. Der Vorwiederstand ergibt sich aus R3 =<br />
9V−1.2V<br />
20mA = 390Ω .<br />
Ein Taster(SW1) kann die gesamte Schaltung mit Masse verbinden, was verhindert das IR-<br />
Sender dauerhaft sendet.<br />
Die Grüne Led(Led2) zeigt dem Benutzer an, ob der IR-Sender aktiv ist oder nicht. Der<br />
Vorwiederstand(R5) ergibt sich durch die selbe Rechnung wie R3 und beträgt 390 Ω.<br />
Protokoll IR_Fernbedienung<br />
gesendete Frequenz<br />
Frequenzband Empfänger<br />
Werte<br />
1200 Hz +/- 50Hz<br />
1100Hz-1300Hz<br />
10
11
Motorsteuerung<br />
Zur Motorsteuerung wird das IC L293D verwendet. Dieses beinhaltet zwei H-Brücken. Sowie<br />
Dioden um Induktionsströme abzufangen, welche beim Nachdrehen der Motoren entstehen.<br />
An dem Blockschaltbild erkennt man, wie die Ansteuerung funktioniert. Die Laufrichtung der<br />
Motoren wird gesteuert, indem einen Input auf HIGH und den anderen auf LOW setzt. Sind<br />
beide HIGH oder LOW bewegt sich der Motor nicht.<br />
Name Pin 1A 2A<br />
Prozes<br />
M_Schlitten_Vorne<br />
s<br />
HIGH LOW<br />
Name Pin 3A 4A<br />
Prozess<br />
M_Tor_Zu<br />
HIGH LOW<br />
M_Schlitten_Hinten LOW<br />
HIGH<br />
M_Tor_Auf LOW HIGH<br />
In<br />
In der folgenden Tabelle sind die Eigenschaften der Einzelnen Pins beschrieben.<br />
Pin<br />
Name<br />
No.<br />
Typ Description Pin on Board Pegel<br />
1,2EN 1 I<br />
Enable driver channels 1 and 2 (active high<br />
input)<br />
VCC<br />
5V<br />
1A 2 I<br />
PC7<br />
High/Low<br />
2A 7 I PB6 High/Low<br />
Driver inputs, noninverting<br />
3A 10 I PA9 High/Low<br />
4A 15 I PA8 High/Low<br />
1Y 3 O<br />
M2<br />
9V/GND<br />
2Y 6 O<br />
Driver outputs<br />
5,4Ω,<br />
Widerstandsplatine<br />
9V/GND<br />
12
3Y 11 O M1 9V/GND<br />
4Y 14 O<br />
3,2Ω;<br />
Widerstandsplatine<br />
9V/GND<br />
3,4EN 9 O<br />
Enable driver channels 3 and 4 (active high<br />
input)<br />
VCC<br />
5V<br />
GROUND<br />
4, 5,<br />
12, 13 _<br />
Device ground and heat sink pin. Connect to<br />
printed-circuit-board ground plane with<br />
multiple solid vias<br />
GND<br />
GND<br />
VCC1 16 5-V supply for internal logic Translation VCC 5V<br />
VCC2 8 _ Power VCC fordrivers 4.5V to 36V Netzteil 9V<br />
Das IC kann pro Motor maximal 600mA schalten. Da pro Motoren 500mA fließen, besteht<br />
keine Gefahr für das IC.<br />
Um die Drehzahl nach unten zu korrigieren wurden Vorwiderstände an beiden Motoren<br />
verwendet. Es sind jeweils drei Widerstände in Reihe geschaltet, damit die Widerstände eine<br />
höhere Leistung verkraften. Die Anliegenden Ströme und Spannungen sind deutlich unter<br />
den maximal zulässigen Werten.<br />
Vorwiderstand/ Ω UMotor,Ist/V IMotor,Ist/ mA UMotor,max/V IMotor,max/ A<br />
Motor Tor 3,2 5,6 500 12 1,1<br />
Motor Schlitten 5,4 4,2 500 12 1,1<br />
Die Drehzahl der Motoren wird mittels Getriebe übersetzt, damit eine ausreichende Kraft<br />
das Tor bzw. den Schlitten bewegt. Die Übersetzung für das Tor beträgt 1:75 für den<br />
Schlitten beträgt sie 1:36. Die Übersetzung des Schlittens ist geringer, da er sich schneller als<br />
das Tor bewegen muss und eine geringere Kraft für die Bewegung erforderlich ist.<br />
13
Pinbelegung<br />
Aktorik/ Sensorik Pin des Boards Typ des Pins<br />
Empfaenger CN10D13PA_5 In/ Analog<br />
LS_Betaetigt CN10D11PA_7 In/ Analog<br />
GT_Unten CN10D6PB_10 In/ Digital, Pullup<br />
GT_Oben CN10D5PB_4 In/ Digital, Pullup<br />
GT_Vorne CN10D4PB_5 In/ Digital, Pullup<br />
GT_Hinten CN10D3PB_3 In/ Digital, Pullup<br />
Taster CN10D2PA_10 In/ Digital, Interrupt<br />
M_Schlitten_Vorne CN10D10PB_6 Out/ Digital<br />
M_Schlitten_Hinten CN10D9PC_7 Out/ Digital<br />
M_Tor_Zu CN10D8PA_9 Out/ Digital<br />
M_Tor_Auf CN10D7PA_8 Out/ Digital<br />
LGr CN10D14PB_9 Out/ Digital<br />
LGe CN10D15PB_8 Out/ Digital<br />
LRo CN10D12PA_6 Out/ Digital<br />
14
Schaltplan<br />
Die Beschriftung ist im Schaltplan nicht lesbar. Leider konnten wir die Schrift nicht Scharf stellen und dabei den gesamten Plan anzeigen. Daher ist<br />
der Plan nochmal als PDF-Datei hochgeladen. Darin kann durch ZOOM die Schrift zum Lesen vergrößert werden.
Verdrahtungsplan<br />
16
Testplanung und Ergebnisse<br />
Was wird getestet? Wie wird der Test durchgeführt? Was ist das Ergebnis?<br />
Funktion der eingebauten LEDs Die LEDs einzeln auf HIGH und wieder auf LOW setzen Die LEDs leuchten und gehen wieder aus<br />
Funktion der Grenztaster Signal einlesen -> Wenn Signal erkannt wird Test-LED Test-LED leuchtet<br />
leuchten lassen<br />
Funktion der Motoren<br />
Die Motoren abwechselnd in zwei gewollte Richtungen<br />
ansteuern, dabei wird mit Sichtkontrolle überwacht<br />
Motor dreht sich abwechselnd in die gewollten<br />
Richtungen<br />
Funktion des Tasters<br />
Bei einem eingelesenen Signal wird ein sofortiger<br />
Die LED wechselt auf Knopfdruck den Zustand<br />
Zustandswechsel einer Lampe ausgelöst<br />
Funktion der Lichtschranke Falls der Analogwert über einen gewissen Wert steigt ist<br />
etwas zwischen der Lichtschranke und eine LED geht an<br />
Beim Durchkreuzen der Lichtschranke leuchtet die<br />
LED<br />
Funktion der Fernbedienung<br />
und dem Empfänger<br />
Beim Tastendruck auf der Fernbedienung wird die Frequenz<br />
des IR Signals bestimmt und bei der richtigen Frequenz<br />
leuchtet eine LED bei einer falschen Frequenz soll nicht<br />
passieren (im Debugger werden die ausgewerteten Werte<br />
Die LED leuchtet, wenn man den Knopf drückt nur<br />
bei der Fernbedienung mit der richtigen Frequenz<br />
Den regulären Betrieb des<br />
Zustandsautomaten testen<br />
Den regulären Betrieb bei<br />
irregulären Eingängen testen<br />
überwacht)<br />
Die einzelnen Zustände durchgehen und mit den richtigen<br />
Eingaben in die nächsten Zustände springen und damit alle<br />
möglichen Wege und Zustände durchlaufen (Überwachung<br />
der Ergebnisse mit Debugger)<br />
Die einzelnen Zustände und Wege durchgehen und mit allen<br />
möglichen Eingängen versuchen in andere Zustände zu<br />
springen<br />
Es tritt bei allen Wegen das gewünschte Verhalten<br />
gemäß der Funktionsbeschreibung auf<br />
Es tritt das gewünschte Verhalten nur bei den<br />
richtigen Eingaben auf<br />
17
Source-Code<br />
/*---------------------------------------------------------------------------------------------------------------------------*/<br />
Authoren<br />
: Tim Block, Malte Katz, Maxime Junghänel, Nicolas Fritsche<br />
Version : 3.2<br />
Datum zuletzt Bearbeitet : 17.1.2018<br />
/*---------------------------------------------------------------------------------------------------------------------------*/<br />
#include "main.h"<br />
#include "stm32f4xx_hal.h"<br />
/* USER CODE BEGIN Includes */<br />
/* USER CODE END Includes */<br />
/* Private variables ---------------------------------------------------------*/<br />
ADC_HandleTypeDef hadc1;<br />
DMA_HandleTypeDef hdma_adc1;<br />
TIM_HandleTypeDef htim3;<br />
/* USER CODE BEGIN PV */<br />
/* Private variables ---------------------------------------------------------*/<br />
uint32_t value[2], read_value[2], adc_buffer[2]; // ADC Variablen<br />
int Taster=0; // Interrupt merker für den Taster<br />
int LS_Betaetigt=0; // Lichtschranke bei 1 nicht Aktiv bei 0 Objekt in Lichtschranke<br />
int IR_Korrekt=0; // Variable zum speichern, ob IR Signal mit Richtiger Frequenz vorhanden ist<br />
int wert =0;<br />
// Wert des analog eingelesen Signales an der Lichtschranke<br />
typedef enum STATE {TorOeffnen, TorOffen, TorZu, TorSchliessen, SchlittenNachVorne,<br />
SchlittenNachHinten,Init,NotAuf,NotZu} TSTATE;<br />
TSTATE state= Init;<br />
18
typedef enum AKTION<br />
{Schlitten_Wegbringen,Schlitten_Ausschalten,Tor_Oeffnen,Tor_Schliessen,Tor_Zu_Einschalten,Tor_A<br />
uf_Einschalten<br />
,Tor_Ausschalten,Tor_Geoeffnet,Signal_Pruefen,Schlitten_Holen, Schranke_Pruefen} TAKTION;<br />
TAKTION aktion=Schlitten_Wegbringen;<br />
/* USER CODE END PV */<br />
/* Private function prototypes -----------------------------------------------*/<br />
void SystemClock_Config(void);<br />
static void MX_GPIO_Init(void);<br />
static void MX_DMA_Init(void);<br />
static void MX_ADC1_Init(void);<br />
static void MX_TIM3_Init(void);<br />
int IR_Empf();<br />
/* USER CODE BEGIN PFP */<br />
/* Private function prototypes -----------------------------------------------*/<br />
void delayUS(uint32_t us) {<br />
// Delay auf Mirco Sekundenen Ebene<br />
volatile uint32_t counter = 7*us;<br />
while(counter--);<br />
}<br />
void M_Schlitten_Hinten(){ // Motorschlitten nach hinten fahren<br />
HAL_GPIO_WritePin(GPIOC, GPIO_PIN_7, GPIO_PIN_SET); // M_SchlittenH 1 setzen<br />
HAL_GPIO_WritePin(GPIOB, GPIO_PIN_6, GPIO_PIN_RESET);<br />
// M_SchlittenV 0 setzen<br />
}<br />
19
void M_Schlitten_Vorne(){ // Motorschlitten nach vorne fahren<br />
HAL_GPIO_WritePin(GPIOC, GPIO_PIN_7, GPIO_PIN_RESET); // M_SchlittenH 0 setzen<br />
HAL_GPIO_WritePin(GPIOB, GPIO_PIN_6, GPIO_PIN_SET);<br />
// M_SchlittenV 1 setzen<br />
}<br />
void M_Schlitten_Stopp(){ // Motorschlitten stoppen<br />
HAL_GPIO_WritePin(GPIOC, GPIO_PIN_7, GPIO_PIN_RESET); // M_SchlittenH 0 setzen<br />
HAL_GPIO_WritePin(GPIOB, GPIO_PIN_6, GPIO_PIN_RESET);<br />
// M_SchlittenV 0 setzen<br />
}<br />
void M_Tor_Stopp(){ //Tormotor stoppen<br />
HAL_GPIO_WritePin(GPIOA, GPIO_PIN_8, GPIO_PIN_RESET); // M_TorA 0 setzen<br />
HAL_GPIO_WritePin(GPIOA, GPIO_PIN_9, GPIO_PIN_RESET);<br />
//M_TorZ 0 setzen<br />
}<br />
void M_Tor_Zu(){ //Tor schließen<br />
HAL_GPIO_WritePin(GPIOA, GPIO_PIN_8, GPIO_PIN_RESET); // M_TorA 0 setzen<br />
HAL_GPIO_WritePin(GPIOA, GPIO_PIN_9, GPIO_PIN_SET);<br />
// M_TorZ 1 setzen<br />
}<br />
void M_Tor_Auf(){ // Tor öffnen<br />
HAL_GPIO_WritePin(GPIOA, GPIO_PIN_8, GPIO_PIN_SET); // M_TorA 1 setzen<br />
HAL_GPIO_WritePin(GPIOA, GPIO_PIN_9, GPIO_PIN_RESET);<br />
// M_TorZ 0 setzen<br />
}<br />
void LGe_An(){ //Gelbe LED an<br />
}<br />
HAL_GPIO_WritePin(GPIOB, GPIO_PIN_8,GPIO_PIN_SET); //Pin B8 auf 1 setzen<br />
void LGr_An(){ // Grüne LED an<br />
20
HAL_GPIO_WritePin(GPIOB, GPIO_PIN_9,GPIO_PIN_SET); //Pin B9 auf 1 setzen<br />
}<br />
void LRo_An(){ //Rote LED an<br />
}<br />
HAL_GPIO_WritePin(GPIOA, GPIO_PIN_6,GPIO_PIN_SET); //Pin A6 auf 1 setzen<br />
void LGe_Aus(){ //Gelbe LED aus<br />
}<br />
HAL_GPIO_WritePin(GPIOB, GPIO_PIN_8,GPIO_PIN_RESET); //Pin B8 auf 0 setzen<br />
void LGr_Aus(){ // Grüne LED aus<br />
}<br />
HAL_GPIO_WritePin(GPIOB, GPIO_PIN_9,GPIO_PIN_RESET); //Pin B9 auf 0 setzen<br />
void LRo_Aus(){ //Rote LED aus<br />
}<br />
HAL_GPIO_WritePin(GPIOA, GPIO_PIN_6,GPIO_PIN_RESET); //Pin A6 auf 0 setzen<br />
void Warten(){<br />
//3 Sekunden warten<br />
HAL_Delay(3000);<br />
}<br />
int LS_Pruefen(){<br />
wert = adc_buffer[1];<br />
if(wert< 50){ // Wenn wert kleiner 50, dann Lichtschranke nicht durch brochen<br />
LS_Betaetigt=1;<br />
}<br />
else{<br />
21
LS_Betaetigt=0; // Lichtschranke durchbrochen<br />
}<br />
}<br />
return LS_Betaetigt;<br />
int IR_Empf(){ // Funktion zur Bestimmung einer Frequenz, von einem IR Signal<br />
int sensorValue = 0;<br />
int counter=0;<br />
int periodenCounter=0;<br />
float frequenz =0;<br />
float periodenDauer =0;<br />
int state =0;<br />
int vState =0;<br />
int flag =0;<br />
int counter1=0;<br />
int flagReady=0;<br />
do{<br />
sensorValue = adc_buffer[0];<br />
if(sensorValue < 50){ // Wenn Analog wert kleiner 50 ist , dann gilt dies als logische 1<br />
state =1;<br />
}<br />
if(sensorValue >= 900){<br />
state =0; // Wenn Analog wert größer als 900 ist , dann gilt dies als logische 0<br />
}<br />
if( state != vState){ // Prüfen ob ein 1 -0 durchgang statt gefunden hat<br />
addiern<br />
periodenDauer = periodenDauer + counter; // Perideondauer mit aktueller Periodendauer<br />
22
counter =0;<br />
// aktuelle Periodendauer auf 0 setzten<br />
periodenCounter++; // Anzahl der Periden erhöhen<br />
}<br />
if(counter >125){ //Wenn mehr als 125 mal kein 1 - 0 Übergang statt gefunden hat wird<br />
counter 1 hoch gezählt<br />
counter =0;<br />
counter1++;<br />
if(counter1>=15){ // Wenn counter 1 den wert 15 erreicht hat wird die Messung<br />
erfolgslos abgebrochen<br />
}<br />
}<br />
counter1=0;<br />
return 0;<br />
if(periodenCounter ==10){ // Wenn 10 Perioden gemessen worden sind<br />
periodenCounter =0;<br />
periodenDauer = periodenDauer/10; // Durchschnitss Periode bestimmen<br />
frequenz = (1/(periodenDauer*0.00001)); // bestimmung der Frequenz, aus anzahl der<br />
Messungen mal 10 Micro Sekunden delay<br />
}<br />
flag =1; // Merker das Frequenz bestimmt worden ist<br />
if(flag ==1){ // Wenn frequenz Bestimmt worden ist<br />
liegt<br />
if(frequenz < 1300 && frequenz > 1100){ // Prüfen ob Frequenz im Frequenzband<br />
counter =0; // Alles auf 0 setzen<br />
counter1=0;<br />
frequenz =0;<br />
periodenCounter=0;<br />
flag =0;<br />
flagReady++; // Erfolgreiche Messung Signalisieren<br />
}<br />
else{ // Wenn Nein, Messung als nicht gültig abbrechen<br />
return 0;<br />
23
}<br />
}<br />
if(flagReady==2){ // Wenn 2 Gültige Messungen hintereinander statt gefunden haben,<br />
Messung als gültiges Signal beenden<br />
}<br />
}while(1);<br />
}<br />
return 1;<br />
vState = state; // Alten State abspeichern für prüfung auf 1-0 Übergang<br />
counter++;<br />
counter1++;<br />
delayUS(10); // 10 Micro Sekunden warten<br />
void Pat(int aktion){ // Auflistung aller Aktionen als State Machine und Prozesse die auszuführen sind<br />
switch(aktion){<br />
case Schlitten_Wegbringen:<br />
LGe_An();<br />
M_Schlitten_Hinten();<br />
break;<br />
case Schlitten_Ausschalten:<br />
M_Schlitten_Stopp();<br />
LGe_Aus();<br />
break;<br />
case Schlitten_Holen:<br />
LGe_An();<br />
M_Schlitten_Vorne();<br />
break;<br />
case Tor_Oeffnen:<br />
M_Schlitten_Stopp();<br />
LGe_Aus();<br />
LRo_An();<br />
M_Tor_Auf();<br />
24
eak;<br />
case Tor_Schliessen:<br />
LGr_Aus();<br />
LRo_An();<br />
M_Tor_Zu();<br />
break;<br />
case Tor_Zu_Einschalten:<br />
Warten();<br />
LRo_An();<br />
M_Tor_Zu();<br />
break;<br />
case Tor_Auf_Einschalten:<br />
Warten();<br />
LRo_An();<br />
M_Tor_Auf();<br />
break;<br />
case Tor_Ausschalten:<br />
M_Tor_Stopp();<br />
LRo_Aus();<br />
break;<br />
case Tor_Geoeffnet:<br />
M_Tor_Stopp();<br />
LRo_Aus();<br />
LGr_An();<br />
break;<br />
case Signal_Pruefen:<br />
IR_Korrekt = IR_Empf();<br />
break;<br />
case Schranke_Pruefen:<br />
LS_Betaetigt = LS_Pruefen();<br />
break;<br />
25
}<br />
}<br />
/* USER CODE END PFP */<br />
/* USER CODE BEGIN 0 */<br />
void HAL_ADC_ConvCpltCallback(ADC_HandleTypeDef* hadc){ //Zyklische Messung des Analog Pins<br />
und Prüfen ob Taster gedrückt ist<br />
if(!HAL_GPIO_ReadPin(GPIOA, GPIO_PIN_10)){ // Taster gedrückt<br />
Taster=1;<br />
}<br />
if(hadc->Instance==ADC1){ // Einlesen der 2 Analog Pins, sequenziell<br />
for(int i=0; i
* USER CODE BEGIN Init */<br />
/* USER CODE END Init */<br />
/* Configure the system clock */<br />
SystemClock_Config();<br />
/* USER CODE BEGIN SysInit */<br />
/* USER CODE END SysInit */<br />
/* Initialize all configured peripherals */<br />
MX_GPIO_Init();<br />
MX_DMA_Init();<br />
MX_ADC1_Init();<br />
MX_TIM3_Init();<br />
/* USER CODE BEGIN 2 */<br />
HAL_ADC_Start_DMA(&hadc1, adc_buffer, 2);<br />
/* USER CODE END 2 */<br />
/* USER CODE BEGIN RTOS_MUTEX */<br />
/* add mutexes, ... */<br />
/* USER CODE END RTOS_MUTEX */<br />
/* USER CODE BEGIN RTOS_SEMAPHORES */<br />
/* add semaphores, ... */<br />
/* USER CODE END RTOS_SEMAPHORES */<br />
/* USER CODE BEGIN RTOS_TIMERS */<br />
27
* start timers, add new ones, ... */<br />
/* USER CODE END RTOS_TIMERS */<br />
/* Create the thread(s) */<br />
/* definition and creation of defaultTask */<br />
// osThreadDef(defaultTask, StartDefaultTask, osPriorityNormal, 0, 128);<br />
// defaultTaskHandle = osThreadCreate(osThread(defaultTask), NULL);<br />
/* USER CODE BEGIN RTOS_THREADS */<br />
/* add threads, ... */<br />
/* USER CODE END RTOS_THREADS */<br />
/* USER CODE BEGIN RTOS_QUEUES */<br />
/* add queues, ... */<br />
/* USER CODE END RTOS_QUEUES */<br />
/* Start scheduler */<br />
//osKernelStart();<br />
/* We should never get here as control is now taken by the scheduler */<br />
//Zustände für den Automaten<br />
typedef enum STATE {TorOeffnen, TorOffen, TorZu, TorSchliessen, SchlittenNachVorne,<br />
SchlittenNachHinten,Init,NotAuf,NotZu} TSTATE;<br />
TSTATE state= Init;<br />
typedef enum AKTION<br />
{Schlitten_Wegbringen,Schlitten_Ausschalten,Tor_Oeffnen,Tor_Schliessen,Tor_Zu_Einschalten,Tor_A<br />
uf_Einschalten<br />
,Tor_Ausschalten,Tor_Geoeffnet,Signal_Pruefen,Schlitten_Holen} TAKTION;<br />
TAKTION aktion=Schlitten_Wegbringen;<br />
28
Variablen zum Speicher der Digitalen Inputs festlegen und einlesen<br />
int GT_Oben = HAL_GPIO_ReadPin(GPIOB, GPIO_PIN_4);<br />
int GT_Unten = HAL_GPIO_ReadPin(GPIOB, GPIO_PIN_10);<br />
int GT_Vorne = HAL_GPIO_ReadPin(GPIOB, GPIO_PIN_5);<br />
int GT_Hinten = HAL_GPIO_ReadPin(GPIOB, GPIO_PIN_3);<br />
while (1)<br />
{<br />
/* USER CODE END WHILE */<br />
/* USER CODE BEGIN 3 */<br />
//IR Signal und Frequenz einlesen<br />
IR_Korrekt =IR_Empf();<br />
//Einlesen der Ports<br />
GT_Oben = HAL_GPIO_ReadPin(GPIOB, GPIO_PIN_4);<br />
GT_Unten = HAL_GPIO_ReadPin(GPIOB, GPIO_PIN_10);<br />
GT_Vorne = HAL_GPIO_ReadPin(GPIOB, GPIO_PIN_5);<br />
GT_Hinten = HAL_GPIO_ReadPin(GPIOB, GPIO_PIN_3);<br />
//Invertieren der Ports da Pull-Up<br />
if(GT_Oben ==0){<br />
GT_Oben =1;<br />
}else{<br />
GT_Oben =0;<br />
}<br />
29
if(GT_Unten ==0){<br />
GT_Unten =1;<br />
}else{<br />
GT_Unten =0;<br />
}<br />
if(GT_Vorne ==0){<br />
GT_Vorne =1;<br />
}else{<br />
GT_Vorne =0;<br />
}<br />
if(GT_Hinten ==0){<br />
GT_Hinten =1;<br />
}else{<br />
GT_Hinten =0;<br />
}<br />
switch(state){ // State Machine zur bestimmung des nächsten<br />
Zustandes und der Aktion die Ausgeführt werden muss<br />
case Init: // Initial Zustand, Schlitten nach hinten fahren<br />
aktion = Schlitten_Wegbringen;<br />
if(GT_Hinten){<br />
aktion = Schlitten_Ausschalten;<br />
state = TorZu;<br />
}<br />
break;<br />
case TorZu: // Garagen Tor ist zu<br />
30
Fernbedinungsignal warten<br />
aktion = Signal_Pruefen; // Auf<br />
if(!GT_Vorne && IR_Korrekt){<br />
state=SchlittenNachVorne;<br />
aktion = Schlitten_Holen;<br />
}<br />
else if(GT_Vorne){<br />
state=SchlittenNachHinten;<br />
aktion = Schlitten_Wegbringen;<br />
}<br />
break;<br />
case TorSchliessen: // Garagen Tor schließen<br />
if(GT_Unten){<br />
state=TorZu;<br />
aktion = Tor_Ausschalten;<br />
}<br />
else if(!LS_Betaetigt){<br />
state = NotZu;<br />
aktion = Tor_Ausschalten;<br />
}<br />
else{<br />
aktion= Schranke_Pruefen<br />
}<br />
break;<br />
case TorOffen: // Garagen Tor ist offen<br />
if(Taster && LS_Betaetigt){<br />
state=TorSchliessen;<br />
aktion = Tor_Schliessen;<br />
Taster=0;<br />
31
}<br />
else{<br />
aktion= Schranke_Pruefen<br />
}<br />
break;<br />
case TorOeffnen: // Garagen Tor öffnen<br />
if(GT_Oben){<br />
state=TorOffen;<br />
aktion = Tor_Geoeffnet;<br />
Taster=0;<br />
}<br />
else if(!LS_Betaetigt){<br />
aktion = Tor_Ausschalten;<br />
state=NotAuf;<br />
}<br />
else{<br />
aktion= Schranke_Pruefen<br />
}<br />
break;<br />
fahren<br />
case SchlittenNachVorne: // Schlitten nach vorne<br />
if(GT_Vorne && LS_Betaetigt){<br />
state=TorOeffnen;<br />
aktion = Tor_Oeffnen;<br />
}<br />
else{<br />
aktion= Schranke_Pruefen<br />
}<br />
break;<br />
32
Fahren<br />
case SchlittenNachHinten: // Schlitten nach hinten<br />
if(GT_Hinten && LS_Betaetigt){<br />
state=TorZu;<br />
aktion = Schlitten_Ausschalten;<br />
}<br />
break;<br />
Lichtschranke durchbrochen<br />
case NotAuf: // Beim öffnen des Tors wirde<br />
if(LS_Betaetigt){<br />
state= TorOeffnen;<br />
aktion = Tor_Auf_Einschalten;<br />
}<br />
else{<br />
aktion= Schranke_Pruefen<br />
}<br />
break;<br />
Lichtschranke durchbrochen<br />
case NotZu: // Beim schließen des Tors wirde<br />
if(LS_Betaetigt){<br />
state= Tor_Schliessen;<br />
aktion = Tor_Zu_Einschalten;<br />
}<br />
else{<br />
aktion= Schranke_Pruefen<br />
}<br />
break;<br />
}//Endeswitch<br />
Pat(aktion);<br />
33
}<br />
/* USER CODE END 3 */<br />
}<br />
/* USER CODE END 3 */<br />
/** System Clock Configuration<br />
*/<br />
void SystemClock_Config(void)<br />
{<br />
RCC_OscInitTypeDef RCC_OscInitStruct;<br />
RCC_ClkInitTypeDef RCC_ClkInitStruct;<br />
/**Configure the main internal regulator output voltage<br />
*/<br />
__HAL_RCC_PWR_CLK_ENABLE();<br />
__HAL_PWR_VOLTAGESCALING_CONFIG(PWR_REGULATOR_VOLTAGE_SCALE2);<br />
/**Initializes the CPU, AHB and APB busses clocks<br />
*/<br />
RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_HSI;<br />
RCC_OscInitStruct.HSIState = RCC_HSI_ON;<br />
RCC_OscInitStruct.HSICalibrationValue = 16;<br />
RCC_OscInitStruct.PLL.PLLState = RCC_PLL_ON;<br />
RCC_OscInitStruct.PLL.PLLSource = RCC_PLLSOURCE_HSI;<br />
34
RCC_OscInitStruct.PLL.PLLM = 16;<br />
RCC_OscInitStruct.PLL.PLLN = 336;<br />
RCC_OscInitStruct.PLL.PLLP = RCC_PLLP_DIV4;<br />
RCC_OscInitStruct.PLL.PLLQ = 7;<br />
if (HAL_RCC_OscConfig(&RCC_OscInitStruct) != HAL_OK)<br />
{<br />
_Error_Handler(__FILE__, __LINE__);<br />
}<br />
/**Initializes the CPU, AHB and APB busses clocks<br />
*/<br />
RCC_ClkInitStruct.ClockType = RCC_CLOCKTYPE_HCLK|RCC_CLOCKTYPE_SYSCLK<br />
|RCC_CLOCKTYPE_PCLK1|RCC_CLOCKTYPE_PCLK2;<br />
RCC_ClkInitStruct.SYSCLKSource = RCC_SYSCLKSOURCE_PLLCLK;<br />
RCC_ClkInitStruct.AHBCLKDivider = RCC_SYSCLK_DIV1;<br />
RCC_ClkInitStruct.APB1CLKDivider = RCC_HCLK_DIV2;<br />
RCC_ClkInitStruct.APB2CLKDivider = RCC_HCLK_DIV1;<br />
if (HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_2) != HAL_OK)<br />
{<br />
_Error_Handler(__FILE__, __LINE__);<br />
}<br />
/**Configure the Systick interrupt time<br />
*/<br />
HAL_SYSTICK_Config(HAL_RCC_GetHCLKFreq()/1000);<br />
/**Configure the Systick<br />
*/<br />
HAL_SYSTICK_CLKSourceConfig(SYSTICK_CLKSOURCE_HCLK);<br />
35
* SysTick_IRQn interrupt configuration */<br />
HAL_NVIC_SetPriority(SysTick_IRQn, 15, 0);<br />
}<br />
/* ADC1 init function */<br />
static void MX_ADC1_Init(void)<br />
{<br />
ADC_ChannelConfTypeDef sConfig;<br />
/**Configure the global features of the ADC (Clock, Resolution, Data Alignment and number of<br />
conversion)<br />
*/<br />
hadc1.Instance = ADC1;<br />
hadc1.Init.ClockPrescaler = ADC_CLOCK_SYNC_PCLK_DIV4;<br />
hadc1.Init.Resolution = ADC_RESOLUTION_12B;<br />
hadc1.Init.ScanConvMode = ENABLE;<br />
hadc1.Init.ContinuousConvMode = ENABLE;<br />
hadc1.Init.DiscontinuousConvMode = DISABLE;<br />
hadc1.Init.ExternalTrigConvEdge = ADC_EXTERNALTRIGCONVEDGE_NONE;<br />
hadc1.Init.ExternalTrigConv = ADC_SOFTWARE_START;<br />
hadc1.Init.DataAlign = ADC_DATAALIGN_RIGHT;<br />
hadc1.Init.NbrOfConversion = 2;<br />
hadc1.Init.DMAContinuousRequests = ENABLE;<br />
hadc1.Init.EOCSelection = ADC_EOC_SINGLE_CONV;<br />
if (HAL_ADC_Init(&hadc1) != HAL_OK)<br />
{<br />
}<br />
_Error_Handler(__FILE__, __LINE__);<br />
/**Configure for the selected ADC regular channel its corresponding rank in the sequencer and its<br />
sample time.<br />
36
*/<br />
sConfig.Channel = ADC_CHANNEL_5;<br />
sConfig.Rank = 1;<br />
sConfig.SamplingTime = ADC_SAMPLETIME_480CYCLES;<br />
if (HAL_ADC_ConfigChannel(&hadc1, &sConfig) != HAL_OK)<br />
{<br />
_Error_Handler(__FILE__, __LINE__);<br />
}<br />
/**Configure for the selected ADC regular channel its corresponding rank in the sequencer and its<br />
sample time.<br />
*/<br />
sConfig.Channel = ADC_CHANNEL_7;<br />
sConfig.Rank = 2;<br />
if (HAL_ADC_ConfigChannel(&hadc1, &sConfig) != HAL_OK)<br />
{<br />
}<br />
_Error_Handler(__FILE__, __LINE__);<br />
}<br />
/* TIM3 init function */<br />
static void MX_TIM3_Init(void)<br />
{<br />
TIM_ClockConfigTypeDef sClockSourceConfig;<br />
TIM_MasterConfigTypeDef sMasterConfig;<br />
htim3.Instance = TIM3;<br />
htim3.Init.Prescaler = 0;<br />
htim3.Init.CounterMode = TIM_COUNTERMODE_UP;<br />
htim3.Init.Period = 0;<br />
37
htim3.Init.ClockDivision = TIM_CLOCKDIVISION_DIV1;<br />
if (HAL_TIM_Base_Init(&htim3) != HAL_OK)<br />
{<br />
_Error_Handler(__FILE__, __LINE__);<br />
}<br />
sClockSourceConfig.ClockSource = TIM_CLOCKSOURCE_INTERNAL;<br />
if (HAL_TIM_ConfigClockSource(&htim3, &sClockSourceConfig) != HAL_OK)<br />
{<br />
_Error_Handler(__FILE__, __LINE__);<br />
}<br />
sMasterConfig.MasterOutputTrigger = TIM_TRGO_RESET;<br />
sMasterConfig.MasterSlaveMode = TIM_MASTERSLAVEMODE_DISABLE;<br />
if (HAL_TIMEx_MasterConfigSynchronization(&htim3, &sMasterConfig) != HAL_OK)<br />
{<br />
_Error_Handler(__FILE__, __LINE__);<br />
}<br />
}<br />
/**<br />
* Enable DMA controller clock<br />
*/<br />
static void MX_DMA_Init(void)<br />
{<br />
/* DMA controller clock enable */<br />
__HAL_RCC_DMA2_CLK_ENABLE();<br />
/* DMA interrupt init */<br />
/* DMA2_Stream0_IRQn interrupt configuration */<br />
38
HAL_NVIC_SetPriority(DMA2_Stream0_IRQn, 0, 0);<br />
HAL_NVIC_EnableIRQ(DMA2_Stream0_IRQn);<br />
}<br />
/** Configure pins as<br />
* Analog<br />
* Input<br />
* Output<br />
* EVENT_OUT<br />
* EXTI<br />
PA5 ------> SharedAnalog_PA5<br />
PA7 ------> SharedAnalog_PA7<br />
*/<br />
static void MX_GPIO_Init(void)<br />
{<br />
GPIO_InitTypeDef GPIO_InitStruct;<br />
/* GPIO Ports Clock Enable */<br />
__HAL_RCC_GPIOC_CLK_ENABLE();<br />
__HAL_RCC_GPIOH_CLK_ENABLE();<br />
__HAL_RCC_GPIOA_CLK_ENABLE();<br />
__HAL_RCC_GPIOB_CLK_ENABLE();<br />
/*Configure GPIO pin Output Level */<br />
HAL_GPIO_WritePin(GPIOA, GPIO_PIN_6|M_TorA_Pin|M_TorZ_Pin|Taster_Pin, GPIO_PIN_RESET);<br />
/*Configure GPIO pin Output Level */<br />
HAL_GPIO_WritePin(M_SchlittenH_GPIO_Port, M_SchlittenH_Pin, GPIO_PIN_RESET);<br />
39
*Configure GPIO pin Output Level */<br />
HAL_GPIO_WritePin(GPIOB, M_SchlittenV_Pin|LGe_Pin|LGr_Pin, GPIO_PIN_RESET);<br />
/*Configure GPIO pin : B1_Pin */<br />
GPIO_InitStruct.Pin = B1_Pin;<br />
GPIO_InitStruct.Mode = GPIO_MODE_IT_FALLING;<br />
GPIO_InitStruct.Pull = GPIO_NOPULL;<br />
HAL_GPIO_Init(B1_GPIO_Port, &GPIO_InitStruct);<br />
/*Configure GPIO pins : PA4 LRo_Pin IR_Lichtschranke_Pin */<br />
GPIO_InitStruct.Pin = GPIO_PIN_4|LRo_Pin|IR_Lichtschranke_Pin;<br />
GPIO_InitStruct.Mode = GPIO_MODE_ANALOG;<br />
GPIO_InitStruct.Pull = GPIO_NOPULL;<br />
HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);<br />
/*Configure GPIO pins : PA6 M_TorA_Pin M_TorZ_Pin Taster_Pin */<br />
GPIO_InitStruct.Pin = GPIO_PIN_6|M_TorA_Pin|M_TorZ_Pin;<br />
GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;<br />
GPIO_InitStruct.Pull = GPIO_NOPULL;<br />
GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;<br />
HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);<br />
//Taster<br />
GPIO_InitStruct.Pin = Taster_Pin;<br />
GPIO_InitStruct.Mode = GPIO_MODE_INPUT;<br />
GPIO_InitStruct.Pull = GPIO_PULLUP;<br />
GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;<br />
HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);<br />
/*Configure GPIO pins : GT_Unten_Pin GT_Hinten_Pin GT_Oben_Pin GT_Vorne_Pin */<br />
40
GPIO_InitStruct.Pin = GT_Unten_Pin|GT_Hinten_Pin|GT_Oben_Pin|GT_Vorne_Pin;<br />
GPIO_InitStruct.Mode = GPIO_MODE_INPUT;<br />
GPIO_InitStruct.Pull = GPIO_PULLUP;<br />
HAL_GPIO_Init(GPIOB, &GPIO_InitStruct);<br />
/*Configure GPIO pin : M_SchlittenH_Pin */<br />
GPIO_InitStruct.Pin = M_SchlittenH_Pin;<br />
GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;<br />
GPIO_InitStruct.Pull = GPIO_NOPULL;<br />
GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;<br />
HAL_GPIO_Init(M_SchlittenH_GPIO_Port, &GPIO_InitStruct);<br />
/*Configure GPIO pins : M_SchlittenV_Pin LGe_Pin LGr_Pin */<br />
GPIO_InitStruct.Pin = M_SchlittenV_Pin|LGe_Pin|LGr_Pin;<br />
GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;<br />
GPIO_InitStruct.Pull = GPIO_NOPULL;<br />
GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;<br />
HAL_GPIO_Init(GPIOB, &GPIO_InitStruct);<br />
/* EXTI interrupt init*/<br />
HAL_NVIC_SetPriority(EXTI15_10_IRQn, 0, 0);<br />
HAL_NVIC_EnableIRQ(EXTI15_10_IRQn);<br />
}<br />
/* USER CODE BEGIN 4 */<br />
/* USER CODE END 4 */<br />
/**<br />
* @brief This function is executed in case of error occurrence.<br />
41
* @param None<br />
* @retval None<br />
*/<br />
void _Error_Handler(char * file, int line)<br />
{<br />
/* USER CODE BEGIN Error_Handler_Debug */<br />
/* User can add his own implementation to report the HAL error return state */<br />
while(1)<br />
{<br />
}<br />
/* USER CODE END Error_Handler_Debug */<br />
}<br />
#ifdef USE_FULL_ASSERT<br />
/**<br />
* @brief Reports the name of the source file and the source line number<br />
* where the assert_param error has occurred.<br />
* @param file: pointer to the source file name<br />
* @param line: assert_param error line source number<br />
* @retval None<br />
*/<br />
void assert_failed(uint8_t* file, uint32_t line)<br />
{<br />
/* USER CODE BEGIN 6 */<br />
/* User can add his own implementation to report the file name and line number,<br />
ex: printf("Wrong parameters value: file %s on line %d\r\n", file, line) */<br />
/* USER CODE END 6 */<br />
}<br />
42
#endif<br />
/**<br />
* @}<br />
*/<br />
/**<br />
*/<br />
* @}<br />
/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/<br />
43