02.02.2018 Aufrufe

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

Hurra! Ihre Datei wurde hochgeladen und ist bereit für die Veröffentlichung.

Erfolgreich gespeichert!

Leider ist etwas schief gelaufen!