Aufbau und Inbetriebnahme eines Steuerungssystems zur ...

et.fh.mannheim.de

Aufbau und Inbetriebnahme eines Steuerungssystems zur ...

Erich Haag

Aufbau und Inbetriebnahme eines

Steuerungssystems

zur Navigation und Beobachtung

eines autonomen Fahrzeugs

Diplomarbeit

FACHHOCHSCHULE MANNHEIM – HOCHSCHULE FÜR TECHNIK UND GESTALTUNG

Fachbereich Elektrotechnik

Institut für Automatisierungssysteme


Aufbau und Inbetriebnahme eines Steuerungssystems zur Navigation und Beobachtung eines autonomen

Fahrzeugs

__________________________________________________________________________________________

Erklärung

Hiermit erkläre ich, dass ich die vorliegende Arbeit selbständig angefertigt, alle benutzten

Quellen und Hilfsmittel vollständig und genau angegeben habe. Ich habe alles kenntlich

gemacht, was ich aus Arbeiten anderer oder mit Änderungen übernommen habe.

Aalen, den 24. Juni 2002

Erich Haag

Thüringerstr. 10

73431 Aalen

Matrikel – Nr.: 97036

_________________________________________________________________________________

Fachhochschule Mannheim Seite 2

Hochschule für Technik und Gestaltung


Aufbau und Inbetriebnahme eines Steuerungssystems zur Navigation und Beobachtung eines autonomen

Fahrzeugs

__________________________________________________________________________________________

Zusammenfassung

Die Diplomarbeit beschreibt den Aufbau und die Inbetriebnahme eines Steuerungssystems zur

Navigation und Beobachtung eines autonomen Fahrzeugs. Das autonome Fahrzeug wird in

dieser Konzeption als fahrerloses Transportsystem für Werkstücke in einer Modellwerkstatt

eingesetzt, wobei die Verfahrwege ohne Leithilfsmittel, wie z.B. Bodenmarken zurückgelegt

werden. Dadurch sind Änderungen der Verfahrwege ohne großen Aufwand möglich.

Das Steuerungssystem besteht im wesentlichen aus einem Leitrechner und einem

Fahrzeugsteuerrechner, die über Funkmodems miteinander kommunizieren.

Die Funktionen des Leit- und Steuerrechners sind folgendermaßen verteilt:

Leitrechnerfunktionen:

• Fahrwege verwalten

- Eingabe, editieren, laden, löschen, speichern

- Erstellen von Bildern für Fahraufträge

• Kommunikation mit Fahrzeugsteuerrechner

- Fahrwege senden

- Startbefehl senden

- Fahrzeugstatus empfangen

- Rückmeldungen auswerten bzw. empfangene Daten auf Fehler prüfen

• Visualisierung

- Positionsanzeige von Fahrzeug

- Fahrzeugstatus anzeigen

- Fehler anzeigen und Alarmlisten anlegen

Fahrzeugsteuerrechner Funktionen:

• Fahrzeugfunktionen

- Antriebsregelung

- Auswertung der Sensorik (Ultraschallsensoren, Pulsgeber)

- Abfahren der Verfahrwege

- Referenzfahrt und parken an Andokstationen

• Kommunikation mit Leitrechner

- Fahrwege empfangen und umrechnen

- Startbefehl empfangen

- Fahrzeugstatus zyklisch senden

- Position senden

- Rückmeldungen auswerten bzw. empfangene Daten auf Fehler prüfen

_________________________________________________________________________________

Fachhochschule Mannheim Seite 3

Hochschule für Technik und Gestaltung


Aufbau und Inbetriebnahme eines Steuerungssystems zur Navigation und Beobachtung eines autonomen

Fahrzeugs

__________________________________________________________________________________________

Inhaltsverzeichnis

1. Einleitung....................................................................................................................... 7

2. Aufgabenstelleung......................................................................................................... 8

3. Hardware........................................................................................................................10

3.1 Aufbau des Fahrzeugs................................................................................................... 10

3.2 Fahrzeugsteuerrechner...................................................................................................12

3.3 Motoren, Getriebe und Pulsgeber..................................................................................16

3.4 Antriebselektronik......................................................................................................... 17

3.4.1 Dreieckgenerator...................................................................................................... 18

3.4.2 Sollwertanpassung....................................................................................................19

3.4.3 Pulsfreigabe.............................................................................................................. 21

3.4.4 PWM – Komparator................................................................................................. 22

3.4.5 Integrierte H – Brücke L293B..................................................................................23

3.4.6 Fahrtrichtungsumkehr...............................................................................................25

3.4.7 Strombegrenzung......................................................................................................25

3.5 Zählerkarte.....................................................................................................................26

3.5.1 Pulsaufbereitung.......................................................................................................27

3.5.2 Impulsverdoppelung.................................................................................................28

3.5.3 Zähler........................................................................................................................29

3.5.4 Totmannschaltung.................................................................................................... 29

3.6 Ultraschallsensoren........................................................................................................32

3.7 Funkmodems................................................................................................................. 34

3.8 Spannungsregler............................................................................................................ 36

4. Handhabung...................................................................................................................37

4.1 Leitrechnerdemo............................................................................................................37

4.1.1 Menü Datei............................................................................................................... 37

4.1.2 Menü Fahrzeug.........................................................................................................38

4.1.3 Statusanzeigen.......................................................................................................... 40

4.2 Fahrzeug....................................................................................................................... 41

_________________________________________________________________________________

Fachhochschule Mannheim Seite 4

Hochschule für Technik und Gestaltung


Aufbau und Inbetriebnahme eines Steuerungssystems zur Navigation und Beobachtung eines autonomen

Fahrzeugs

__________________________________________________________________________________________

4.3 Datenübertragung.......................................................................................................... 42

5. Software..........................................................................................................................45

5.1 Fahrzeugsoftware.......................................................................................................... 45

5.1.1 Überblick.................................................................................................................. 46

5.1.2 main() (Hauptprogramm)......................................................................................... 46

5.1.2.1 init() (Initialisierungsroutine).............................................................................. 50

5.1.2.2 fahren() (Unterprogramm Wege abfahren)......................................................... 53

5.1.2.3 parkfahrt() (Unterprogramm Park- bzw. Referenzfahrt).....................................56

5.1.2.4 sonarpos() (Unterprogramm Positionierung mit Ultraschallsensoren)............... 57

5.1.2.5 winkel() (Unterprogramm Fahrzeug parallel auf Platten ausrichten).................. 59

5.1.2.6 drehung() (Unterprogramm 90° rechts Drehung)................................................60

5.1.2.7 blinker() (Unterprogramm Blinkbit für LED erzeugen)......................................61

5.1.2.8 taste_lampe() (Unterprogramm Bedienteil)........................................................ 62

5.1.2.9 senden(...) (Unterprogramm Daten an Funkmodem senden).............................. 64

5.1.2.10 senden1() (Unterprogramm Status und Wegnummer senden).......................... 66

5.1.2.11 kontroll() (Unterprogramm zur Kontrolle der empfangenen Daten).................68

5.1.2.12 datfilt() (Unterprogramm Empfangsdatenfilter)................................................70

5.1.3 time_int() (ISR Timer für interne Laufzeiten)..........................................................73

5.1.4 regler() (ISR für die Regelung des Antriebs)...........................................................74

5.1.4.1 PID_Regler(...) (Unterprogramm Regelalgorithmus)......................................... 83

5.1.5 irq4t() (ISR zum Empfang der Daten)......................................................................85

5.1.5.1 RM() (Unterprogramm Rückmeldung empfangen)............................................. 86

5.1.5.2 empfang() (Unterprogramm Daten empfangen)..................................................88

5.1.5.3 byteein() (Unterprogramm Byte einlesen)...........................................................90

5.2 Software für Leitrechnerdemo.......................................................................................92

5.2.1 MSComm1_OnComm() (ISR RS – 232 – Schnittstelle)...........................................92

5.2.2 auswert() (Unterprogramm zum Auswerten der empfangenen Daten)....................93

5.2.3 Timer1_Timer() (Zeitgesteuerter Interrupt)..............................................................95

6. Zusammenfassung und Bewertung..............................................................................98

7. Anhang............................................................................................................................100

7.1 Programmausdruck Fahrzeug........................................................................................100

7.1.1 Definitionen..............................................................................................................100

7.1.2 main() (Hauptprogramm)......................................................................................... 105

7.1.3 init() (Initialisierungsroutine)................................................................................... 106

7.1.4 fahren() (Unterprogramm Wege abfahren).............................................................. 107

7.1.5 parkfahrt() (Unterprogramm Park- bzw. Referenzfahrt)..........................................109

7.1.6 sonarpos() (Unterprogramm Positionierung mit Ultraschallsensoren).................... 109

7.1.7 winkel() (Unterprogramm Fahrzeug parallel auf Platten ausrichten)....................... 110

_________________________________________________________________________________

Fachhochschule Mannheim Seite 5

Hochschule für Technik und Gestaltung


Aufbau und Inbetriebnahme eines Steuerungssystems zur Navigation und Beobachtung eines autonomen

Fahrzeugs

__________________________________________________________________________________________

7.1.8 drehung() (Unterprogramm 90° rechts Drehung).....................................................110

7.1.9 blinker() (Unterprogramm Blinkbit für LED erzeugen)...........................................111

7.1.10 taste_lampe() (Unterprogramm Bedienteil)........................................................... 111

7.1.11 senden(...) (Unterprogramm Daten an Funkmodem senden)................................. 112

7.1.12 senden1() (Unterprogramm Status und Wegnummer senden)............................... 113

7.1.13 kontroll() (Unterprogramm zur Kontrolle der empfangenen Daten)......................113

7.1.14 datfilt() (Unterprogramm Empfangsdatenfilter).....................................................114

7.1.15 time_int() (ISR Timer für interne Laufzeiten)........................................................115

7.1.16 regler() (ISR für die Regelung des Antriebs).........................................................115

7.1.17 PID_Regler(...) (Unterprogramm Regelalgorithmus)............................................ 118

7.1.18 irq4t() (ISR zum Empfang der Daten)....................................................................119

7.1.19 RM() (Unterprogramm Rückmeldung empfangen)................................................ 119

7.1.20 empfang() (Unterprogramm Daten empfangen).....................................................120

7.1.21 byteein() (Unterprogramm Byte einlesen)..............................................................121

7.2 Programmausdruck Leitrechnerdemo........................................................................... 122

7.3 Schaltplan Antrieb.........................................................................................................133

7.3.1 Platinenlayout Antrieb..............................................................................................137

7.4 Schaltplan Zählerkarte...................................................................................................138

7.4.1 Platinenlayout Zählerkarte........................................................................................141

7.5 Schaltplan Bedienteil.....................................................................................................142

7.5.1 Platinenlayout Bedienteil..........................................................................................143

7.6 Schaltplan Anpaßschaltung Ultraschallsensoren...........................................................144

7.6.1 Platinenlayout Anpaßschaltung................................................................................145

7.7 Verdrahtungsplan Fahrzeug...........................................................................................146

7.8 Quellenverzeichnis........................................................................................................ 150

7.9 Begriffe und Abkürzungen.......................................................................................... 152

_________________________________________________________________________________

Fachhochschule Mannheim Seite 6

Hochschule für Technik und Gestaltung


Aufbau und Inbetriebnahme eines Steuerungssystems zur Navigation und Beobachtung eines autonomen

Fahrzeugs

__________________________________________________________________________________________

1. Einleitung

Fahrerlose Transportsysteme stehen fürdieErfüllung innerbetrieblicher Transportaufgaben,

schon seit den 50er Jahren zur Verfügung. Die Automatisierung der Logistik ermöglicht ein

effektives und wirtschaftliches Zusammenspiel, der einzelnen Fertigungskomponenten.

Deshalb wurde die Entwicklung solcher Systeme, auch immer unter Zuhilfenahme der

neuesten Techniken vorangetrieben. Bis heute sind viele dieser Transportsysteme Leitlienien

gebunden, weil dadurch eine sichere Führung dieser Fahrzeuge gewährleistet ist. Die

Erstellung solcher Leitlienien, ist jedoch immer mit einem beträchtlicher Aufwand verbunden

und deshalb liegt es nahe, daß Leitlienienlose Transportsysteme entwickelt werden. Dadurch

steigt auch die Flexibilität dieser Transportsysteme. Durch die parallele Entwicklung mobiler

Roboter, die auch erfolgreich von der NASA eingesetzt wurden und die rapide

Leistungssteigerung der Mikrorechner, liegt es nahe, mobile Roboter in der Industrie als

Leitlinienlose Transportsysteme einzusetzen.

Der in dieser Diplomarbeit vorgestellte mobile Roboter, soll als flexibles Transportsystem in

einer Modellwerkstatt eingesetzt werden und als mobiles Bindeglied zwischen Lager und

Fertigungsmaschinen dienen.

Die Darstellung der Entwicklung des mobilen Roboters ist dabei so aufgebaut, dass zu Beginn

des 2. Kapitels Informationen zur Aufgabenstellung vermittelt werden.

Das 3. Kapitel befaßt sich mit der Entwicklung der Hardware. Dort wird beschrieben, wie der

Aufbau des Fahrzeugs und die Elektronik zustande kommt. Die Benutzung und Anpassung

der Verwendeten Sensoren und Aktoren ist dort ebenfalls zu finden.

Kapitel 4 beschäftigt sich mit der Handhabung des Fahrzeugs und der Funktion des

Leitrechners. Dieses Kapitel ist eine Art Bedienungsanleitung für das Transportsystem und

beschreibt dessen Eigenschaften im momentanen Zustand.

Im Kapitel 5 wird die komplette Fahrzeugsoftware und wichtige Teile der

Leitrechnersoftware aufgeschlüsselt.

Eine Beurteilung wird im Kapitel 6 zu dem erreichten Ergebnis gestellt. Dabei werden die

Vor- und Nachteile diskutiert und Vorschläge für eine Verbesserung des augenblicklichen

Standes dargestellt.

Zum Schluß findet man im Kapitel 7 die Programmlistings von Fahrzeug und Leitrechner, die

Schaltpläne und Platinenlayouts der Hardware, sowie die Datenblätter der verwendeten

Komponenten.

_________________________________________________________________________________

Fachhochschule Mannheim Seite 7

Hochschule für Technik und Gestaltung


Aufbau und Inbetriebnahme eines Steuerungssystems zur Navigation und Beobachtung eines autonomen

Fahrzeugs

__________________________________________________________________________________________

2. Aufgabenstellung

Ziel dieser Diplomarbeit ist es, ein Steuerungssystem für einen mobilen Roboter zu

entwickeln, der als fahrerloses Transportsystem in einer Modellwerkstatt eingesetzt wird. Die

Verfahrwege sollen ohne Leithilfsmittel wie z.B. Bodenmarken oder Induktionsschleifen

zurückgelegt werden. Dadurch sind Änderungen der Verfahrwege ohne großen Aufwand

möglich.

Das Steuerungssystem besteht im wesentlichen aus einem Leitrechner (handelsüblicher PC)

und einem Fahrzeugsteuerrechner (embedded PC 386 EX von JK microsystems), die über

Funkmodems (HDM41F von SRC) miteinander kommunizieren. (Siehe Abb. 2.1).

Abb. 2.1 Steuerungssystem mobiler Roboter

Das Fahrzeug soll von einer Ladestation z.B. zu einem Hochregallager fahren, ein Rohteil

aufnehmen und wird dann manuell wieder gestartet, um dieses Rohteil zur Bearbeitung an

eine CNC – Maschine zu befördern. Nach erneutem manuellen Start soll das Fahrzeug sich

zur Ladestation zurückbewegen, um einen neuen Fahrauftrag zu bekommen. (Siehe Abb. 2.2).

Während der Fahrt soll das Fahrzeug mit einem Sonarsensor selbständig Hindernisse

erkennen und die Fahrt unterbrechen, bis sich das Hindernis aus dem Erfassungsbereich

entfernt bzw. entfernt wird.

_________________________________________________________________________________

Fachhochschule Mannheim Seite 8

Hochschule für Technik und Gestaltung


Aufbau und Inbetriebnahme eines Steuerungssystems zur Navigation und Beobachtung eines autonomen

Fahrzeugs

__________________________________________________________________________________________

Abb. 2.2 Beispiel eines Fahrauftrags

Ein Fahrauftrag besteht aus einzelnen Wegstücken, die sequentiell vom Start bis zum Ziel

abgearbeitet werden (siehe Abb. 2.2). Da keine Leithilfs- und keine räumlichen

Orientierungsmittel vorhanden sind, muß an jedem Fahrziel (Andokstation), das erreicht

wird, eine Referenz- bzw. Parkfahrt eingeleitet werden, um Fehler die während der freien

Fahrt bei einer Koppelnavigation zwangsläufig auftreten, wieder zu kompensieren.

Während der Abarbeitung eines Fahrauftrags soll der aktuell bearbeitete Fahrweg und der

Fahrzeugstatus über das Funkmodem zum Leitrechner gesendet werden.

Am Leitrechner sollen Fahraufträge erstellt, abgespeichert bzw. geladen, editiert und an das

Fahrzeug gesendet werden können. Dadurch ist ein Umplanen des Fahrauftrags ohne grosse

Probleme möglich.Weiterhin soll am Leitrechner das Fahrzeug visualisiert werden, d.h.

feststellen der Istposition im Raum und anzeigen des Fahrzeugstatus mit Fehler und

Betriebsmeldungen. Zur Steuerung des Fahrzeugs werden im Leitrechner Befehle wie z.B.

starten, stoppen und Fahrzeugfehler löschen generiert.

Um diese ziele zu erreichen, sind drei Aufgabenschwerpunkte zu erfüllen:

1.) Konzipieren der Hardware bzw. des mechanischen Aufbaus des Fahrzeugs

2.) Entwicklung der Fahrzeugsoftware

3.) Entwicklung der Leitrechnersoftware

_________________________________________________________________________________

Fachhochschule Mannheim Seite 9

Hochschule für Technik und Gestaltung


Aufbau und Inbetriebnahme eines Steuerungssystems zur Navigation und Beobachtung eines autonomen

Fahrzeugs

__________________________________________________________________________________________

3. Hardware

Die gelieferte Hardware des mobilen Roboters besteht aus einer Fahrplattform (Typ MAX 99

von Zacrobotics) , zwei DC – Motoren(TypRS– 385SH der Firma Mabuchi), zwei

Getrieben (Typ 5NG40 der Firma Dayton), zwei Hartgummirädern (Durchmesser 15 cm), ein

386 EX embedded PC (der Firma JK microsystems), einer Multi I/O Karte mit 4 A/D –

Wandlern, zwei D/A – Wandlern und 4 getreiberten digitalen Ausgängen. Weiterhin sind

zwei Pulsgeber (Typ HEDS 500 der Firma...) mit 500 Pulsen pro Umdrehung vorhanden. Die

Pulsgeber sind nach dem Getriebe, direkt an der Radachse angebracht und zur Positionierung

des Fahrzeugs gedacht. Die Antriebsräder haben unterschiedliche Durchmesser und laufen

sehr unrund. Deshalb werden sie durch gedrehte Aluminiumräder ersetzt, damit ein guter

Geradeauslauf des Fahrzeugs überhaupt möglich ist.

3.1 Aufbau des Fahrzeugs

Im Folgenden wird beschrieben, wie der hardwaremäßige Aufbau des Fahrzeugs zustande

kommt. Dabei gilt die erste Überlegung der Ansteuerung der DC – Motorenanden

Antriebsrädern.

Das Fahrzeug wird durch einen 12V Bleiakku gespeist und deshalb wird, um Strom zu sparen,

ein PWM – Antrieb zur Ansteuerung der DC – Motoren eingesetzt. Dies könnte man über den

Fahrzeugsteuerrechner mit zwei Timern und einer Treiberstufe realisieren. Da nur drei Timer

im Prozessor des Rechners integriert sind (siehe [1] Kap. 10.1 S. 10-2), einer davon vom

Betriebssystem benutzt wird und der zweite für die Abtastregelung vorgesehen ist (siehe

später), muß der PWM – Antrieb hardwaremäßig realisiert werden.

Zum Lenken des Fahrzeugs wird entweder die Drehrichtung eines der beiden

Antriebsmotoren umgekehrt (Drehung auf der Stelle) oder die Drehzahl eines Motors

verringert bzw. erhöht (kontinuierliche Kurvenfahrt).

Das Geradeausfahren des Fahrzeugs erfordert absolut gleiche Drehzahlen der beiden

Antriebsmotoren. Diese sind mechanisch so eingebaut, daß sie sich bei Fahrt in eine Richtung

des Fahrzeugs (vorwärts oder rückwärts) gegensinnig drehen. Folglich müssen die Motoren

[14] bezüglich ihrer Fertigungstoleranzen sehr genau sein, um einen vernünftigen

Geradeauslauf des Fahrzeugs gewährleisten zu können.

Durch einen einfachen Versuch kann man den Synchronlauf beider Motoren bei einer

Geradeausfahrt im Groben testen. Dazu werden beide Antriebsmotoren antiparallel an eine

Spannungsquelle geschlossen, auf jedes Rad eine Marke angebracht und die Spannungsquelle

eingeschaltet. Nachdem eines der beiden Räder eine Umdrehung gemacht hat, wird die

Spannungsquelle abgeschaltet und nachgeschaut, ob die Marken auf den Rädern wieder an

der gleichen Stelle sind. Die gelieferten Antriebsmotoren schnitten bei diesem Test miserabel

ab, d.h. einer der beiden Motoren dreht bei gleichem Sollwert wesentlich schneller als der

andere (ca. 3cm Wegdifferenz). Infolge dessen, ist es nicht möglich das Fahrzeug gesteuert zu

betreiben, da die Fehler bei einer Koppelnavigation schon auf kurze Distanzen viel zu groß

sind. Man muß auf jedenfall eine Drehzahlregelung für jeden Antriebsmotor vorsehen, um

einen guten Geradeauslauf des Fahrzeugs zu bekommen.

_________________________________________________________________________________

Fachhochschule Mannheim Seite 10

Hochschule für Technik und Gestaltung


Aufbau und Inbetriebnahme eines Steuerungssystems zur Navigation und Beobachtung eines autonomen

Fahrzeugs

__________________________________________________________________________________________

Die Drehzahlregelung wird bei diesem Fahrzeug digital, d.h. über eine Abtastregelung im

Fahrzeugsteuerrechner realisiert. Dafür ist es unbedingt nötig, die Istdrehzahl der Motoren zu

messen. Da der einzige mechanische Angriffspunkt zur Drehzahlmessung an der Radachse

ist, wird die Messung der Drehzahl und die Positionierung über einen hochauflösenden

Pulsgeber [22] [23] realisiert. Dazu sind die gelieferten Pulsgeber ungeeignet (siehe Kap 3.3

S.16). Durch den Einsatz hochauflösender Pulsgeber, wird die Pulsfrequenz so hoch, daß die

Auswertung im Fahrzeugsteuerrechner durch Interrupts nicht mehr möglich ist. Aus diesem

Grund muß die Zählung der Impulse hardwaremäßig realisiert werden. Aus den gezählten

Pulsen pro Zeiteinheit wird die Drehzahl abgeleitet und durch Aufsummieren der gefahrene

Weg ermittelt.

Während der Fahrt des Roboters, muß die Fahrtrichtung ständig auf Hindernisse überwacht

werden. Für die Referenz- bzw. Parkfahrt an den Andokstationen muß zum einen der Abstand

und zum anderen die Winkeligkeit des Fahrzeugs zu einer Fläche gemessen werden. Dies

wird hier mit zwei Ultraschallsensoren realisiert.

Daraus ergibt sich der hardwaremäßige Aufbau des Fahrzeugs (siehe Abb. 3.1.1).

Abb. 3.1.1 Prinzipieller Aufbau des Fahrzeugs

_________________________________________________________________________________

Fachhochschule Mannheim Seite 11

Hochschule für Technik und Gestaltung


Aufbau und Inbetriebnahme eines Steuerungssystems zur Navigation und Beobachtung eines autonomen

Fahrzeugs

__________________________________________________________________________________________

3.2 Fahrzeugsteuerrechner

Dieses Kapitel bezieht sich rein auf die Hardware bzw. die benutzten Anschlüsse des

Steuerrechners für das Fahrzeug.

Grundsätzlich besteht der Fahrzeugsteuerrechner aus einem 386 Ex embedded PC von

JK microsystems mit digitalen Ein- bzw. Ausgängen und seriellen Schnittstellen (siehe Abb.

3.2.1).

Abb. 3.2.1 Fahrzeugsteuerrechner Logic Flex 386 Ex

_________________________________________________________________________________

Fachhochschule Mannheim Seite 12

Hochschule für Technik und Gestaltung


Aufbau und Inbetriebnahme eines Steuerungssystems zur Navigation und Beobachtung eines autonomen

Fahrzeugs

__________________________________________________________________________________________

Es sind 5 Ports (Port A – Port E bzw. J5, J6, J7) mit je 8 digitalen Ein- bzw. Ausgängen

vorhanden. Diese werden mit TTL – Pegeln angesteuert und sind, wie in Abb. 3.2.2

dargestellt, folgendermaßen verteilt:

Port Ein – Ausgang Bit Funktion Pin

A Eingang 0 Starttaste (Bedienfeld) 25

B Ausgang 0 LED grün (Bedienfeld) 26

B Ausgang 1 LED rot (Bedienfeld) 24

C Eingang 0 Hardwarezähler Pulsgeber Rad links Wert 2 0

C Eingang 1 Hardwarezähler Pulsgeber Rad links Wert 2 1

C Eingang 2 Hardwarezähler Pulsgeber Rad links Wert 2 2

C Eingang 3 Hardwarezähler Pulsgeber Rad links Wert 2 3

C Eingang 4 Hardwarezähler Pulsgeber Rad links Wert 2 4

C Eingang 5 Hardwarezähler Pulsgeber Rad links Wert 2 5

C Eingang 6 Hardwarezähler Pulsgeber Rad links Wert 2 6

C Eingang 7 Hardwarezähler Pulsgeber Rad links Wert 2 7

D Eingang 0 Hardwarezähler Pulsgeber Rad rechts Wert 2 0

D Eingang 1 Hardwarezähler Pulsgeber Rad rechts Wert 2 1

D Eingang 2 Hardwarezähler Pulsgeber Rad rechts Wert 2 2

D Eingang 3 Hardwarezähler Pulsgeber Rad rechts Wert 2 3

D Eingang 4 Hardwarezähler Pulsgeber Rad rechts Wert 2 4

D Eingang 5 Hardwarezähler Pulsgeber Rad rechts Wert 2 5

D Eingang 6 Hardwarezähler Pulsgeber Rad rechts Wert 2 6

D Eingang 7 Hardwarezähler Pulsgeber Rad rechts Wert 2 7

E Ausgang 0 Pulsfreigabe Rad rechts 11

E Ausgang 1 Pulsfreigabe Rad links 12

E Ausgang 2 Reset Hardwarezähler Rad rechts 13

E Ausgang 3 Reset Hardwarezähler Rad links 14

E Ausgang 4 vorwärts/rückwärts Rad rechts 4

E Ausgang 5 Vorwärts/rückwärts Rad links 5

E Ausgang 6 Lebenstakt Rechner 6

E Ausgang 7 Durchlaufzeit Regler (Meßpunkt) 7

Abb. 3.2.2 Verteilung der digitalen Ein – bzw. Ausgänge

Die genauen technischen Daten der digitalen Ein- bzw. Ausgänge sind in [2] S. 26 dargestellt

und werden deshalb hier nicht genauer beschrieben.

_________________________________________________________________________________

Fachhochschule Mannheim Seite 13

Hochschule für Technik und Gestaltung

25

23

21

19

17

15

13

11

26

24

22

20

18

16

14

12


Aufbau und Inbetriebnahme eines Steuerungssystems zur Navigation und Beobachtung eines autonomen

Fahrzeugs

__________________________________________________________________________________________

An J2 POWER (siehe Abb. 3.2.1) wird die Versorgungsspannung des Rechners

angeschlossen. Diese beträgt 5V und muß einen Strom von ca. 500mA liefern.

Am Anschluß J10 CONSOLE (siehe Bild 3.2.1) wird ein PC als Bedienterminal fürden

Steuerrechner angeschlossen. Die Einstellungen des Terminalprogramms und die Bedienung

sind in [2] ab S. 4 genau beschrieben.

Der Stecker J9 COM1 ist für den Anschluß des Funkmodems vorgesehen (näheres in Kap. 3.7

ab S. 34).

Auf einer zusätzlichen Karte (Multi - I/O Expansion Board) befinden sich noch vier

A/D – Wandler, zwei D/A – Wandler und vier digitale Ausgänge mit Treibertransistoren

(siehe Abb. 3.2.3). Die zwei Karten werden über eine 1:1 Flachbandleitung miteinander

verbunden (Rechnerkarte J3 und Multi – I/O Expansion Board J2).

Abb. 3.2.3 Multi I/O – Expansion Board

Eine genaue Beschreibung des Multi I/O – Boards ist in [3] zu finden.

J2 = Multi I/O – Bus 1

J4 = Multi I/O – Bus 2

J5 = D/A – Wandler 1

J6 = D/A – Wandler 2

J7 = A/D – Wandler 1, 2

J8 = A/D – Wandler 3, 4

J9 = 4 digitale Ausgänge

Die zwei D/A – Wandler besitzen eine Auflösung von 12 Bit, dies entspricht 1mV pro Bit

und einer max. Ausgangsspannung von 4,095V. Mit diesen D/A – Wandlern soll der

PWM – Antrieb fürdieDC– Motoren angesteuert werden.

Zwei A/D – Wandler dieser Erweiterungskarte werden für die Analogen Spannungswerte der

Ultraschallsensoren verwendet (siehe Kap. 3.6 ab S. 32), die einerseits für die

Kollisionsüberwachung und andererseits für die Referenz- bzw. Parkfahrt des Fahrzeugs

eingesetzt werden.

Die Auflösung der A/D – Wandler geht über 12 Bit. Sie haben eine Bezugsspannung von

4.096V und die max. Eingangsspannung sollte 5V nicht überschreiten.

_________________________________________________________________________________

Fachhochschule Mannheim Seite 14

Hochschule für Technik und Gestaltung


Aufbau und Inbetriebnahme eines Steuerungssystems zur Navigation und Beobachtung eines autonomen

Fahrzeugs

__________________________________________________________________________________________

Mit den vier digitalen, getreiberten Ausgängen (J9), könnte man die LED´s des Bedienteils

ohne weiteren Hardwareaufwand ansteuern. Durch zyklisches ansteuern dieser Ausgänge mit

der mitgelieferten Software, kamen nicht reproduzierbare sporadische Abstürze des Rechners

zustande und deshalb wird von der Verwendung dieser Ausgänge abgesehen. Die LED´s

werden nun mit den digitalen Ausgängen des Rechners (siehe Abb. 3.2.2) und einer

hinzugefügten Treiberstufe angesteuert. In Abb. 3.2.4 ist die Schaltung des Bedienteils

dargestellt.

Abb. 3.2.4 Schaltung des Bedienteils

_________________________________________________________________________________

Fachhochschule Mannheim Seite 15

Hochschule für Technik und Gestaltung


Aufbau und Inbetriebnahme eines Steuerungssystems zur Navigation und Beobachtung eines autonomen

Fahrzeugs

__________________________________________________________________________________________

3.3 Motoren, Getriebe und Pulsgeber

Wie in Kap 3.1 S. 10 beschrieben müssen die Antriebe drehzahlgeregelt werden um einen

vernünftigen Geradeauslauf des Fahrzeugs zu gewährleisten. Da die Regelung über den

Fahrzeugsteuerrechner erfolgen soll, muß die Abtastzeit der Regelung ermittelt werden. Da

ein 12V Bleiakku zur Spannungsversorgung des Fahrzeugs verwendet wird und damit auch

die Antriebsmotoren versorgt werden, kann die Einschwingzeit der Regelung nur so schnell

wie die Einschwingzeit der Strecke, also Motor, Getriebe, Antriebsrad und Pulsgeber sein.

Die Einschwingzeit der Strecke wird über den Motorstrom gemessen. Dazu wird ein

Vorwiderstand in die Motorleitung geschaltet, der max. Eingangssprung (12V) aufgeschaltet

und mit einen Speicheroszilloskop der Spannungsabfall am Widerstand gemessen (siehe Abb.

3.3.1).

+12V

Schalter

1 2

Oszilloskop

Abb. 3.3.1 Schaltung zur Messung der Einschwingzeit

Anhand der entstehenden Kurve kann dann die Einschwingzeit, bis der Motorstrom konstant

bleibt, ermittelt werden und beträgt hier ca. 180 ms. Die Abtastzeit der Regelung soll

mindestens ca. 25 mal kleiner sein als die Einschwingzeit der Strecke, also ca. 7ms. Die

Abtastzeit wird hier auf 5ms festgelegt.

Nun muß noch die max. Drehzahl gemessen werden. Dazu wird eine Marke auf der Radachse

(nach dem Getriebe) angebracht, der Motor an 12V Spannung gelegt und 1 min. lang

mitgezählt. Das Ergebnis beträgt 50 U/min.

Nun kann berechnet werden, wie viele Impulse pro Zeiteinheit (Abtastzeit) übrig bleiben, um

eine Drehzahlregelung durchzuführen:

Pulse = DRZ/60 * Abtastzeit * Impulse pro Umdrehung (Pulsgeber)

0.15

Benutzt man die mitgelieferten Pulsgeber, die 500 Impulse pro Umdrehung liefern, bekommt

man bei maximaler Geschwindigkeit und einer Abtastzeit von 5 ms gerade noch 2 Impulse für

die max. Drehzahl. Damit ist es natürlich ausgeschlossen eine sinnvolle Regelung

durchzuführen.

Diese Pulsgeber werden durch solche ersetzt, die 5000 Impulse pro Umdrehung liefern.

Nutzt man jetzt noch die Phasenverschobenen Pulse des Gebers kann die Pulszahl noch

verdoppelt werden. Somit stehen pro Radumdrehung 10000 Impulse vom Geber zur

Verfügung. Jetzt stehen 41 Impulse bei max. Geschwindigkeit als Drehzahl an. Damit ist es

möglich eine sinnvolle Drehzahlregelung durchzuführen (genaueres dazu in Kap. 5.1.4 ab S.

75 ).

_________________________________________________________________________________

Fachhochschule Mannheim Seite 16

Hochschule für Technik und Gestaltung

M


Aufbau und Inbetriebnahme eines Steuerungssystems zur Navigation und Beobachtung eines autonomen

Fahrzeugs

__________________________________________________________________________________________

3.4 Antriebselektronik

Zur Ansteuerung der beiden Motoren, wird ein PWM – Antrieb eingesetzt. Da nicht genügend

TimerimProzessordesRechnerszurVerfügung stehen, muß der Antrieb hardwaremäßig

realisiert werden (siehe Abb. 3.4.1).

Abb. 3.4.1 Prinzipschaltbild des Antriebs füreinenKanal

_________________________________________________________________________________

Fachhochschule Mannheim Seite 17

Hochschule für Technik und Gestaltung


Aufbau und Inbetriebnahme eines Steuerungssystems zur Navigation und Beobachtung eines autonomen

Fahrzeugs

__________________________________________________________________________________________

3.4.1 Dreieckgenerator

Um eine Pulsweitenmodulation zu erzeugen muß, ein Dreiecksignal mit einer

Gleichspannung überlagert und einem Komparator zugeführt werden. In dieser Schaltung

wird ein Dreieckgenerator für beide Motoren verwendet, da dieser kontinuierlich sein Signal

erzeugt (siehe Abb. 3.4.1.1)

Abb. 3.4.1.1 Schaltung des Dreieckgenerators

Herzstück des Generators ist der Taktgeber NE 555 [13]. Durch die äußere Beschaltung des

IC´s wird eine Frequenz von ca. 3 kHz erzeugt. Das Dreiecksignal wird am Kondensator C6

entnommen und über die Widerstände R21 bzw. R22 den Komparatoren für die Erzeugung

des PWM – Signals zugeführt.

Da das Fahrzeug mit einem 12V Akku betrieben wird und diese Spannung sich je nach

Ladezustand bzw. Belastung ändert, muß die Versorgungsspannung des Dreieckgenerators

stabilisiert werden, um die Amplitude des Signals stabil zu halten. Dies wird mit einem 8V

Festspannungsregler erreicht (Siehe Schaltplan Kap. 7.3 S. 136 bzw. [6]), d.h. wenn die

Batteriespannung unter 11V sinkt ist noch genug Spannungsreserve (ca. 3V) vorhanden, um

die Amplitude stabil zu halten (Faustregel bei Festspannungsreglern: 2 bis 3V höhere

Eingangsspannung).

In Abb. 3.4.1.2 ist der Spannungsverlauf des Dreiecksignals dargestellt. Wie man unschwer

erkennen kann, hat diese Spannung einen Offset von ca. 2.5V, Uss von ca. 3V und eine

Frequenz von 2.7 kHz.

_________________________________________________________________________________

Fachhochschule Mannheim Seite 18

Hochschule für Technik und Gestaltung


Aufbau und Inbetriebnahme eines Steuerungssystems zur Navigation und Beobachtung eines autonomen

Fahrzeugs

__________________________________________________________________________________________

Abb. 3.4.1.2 Spannungsverlauf des Dreiecksignals

3.4.2 Sollwertanpassung

Der Sollwert für die Antriebsmotoren wird den D/A – Wandlern des Fahrzeugsteuerrechners

entnommen. Diese können eine Spannung von 0V – 4.095V liefern. Wobei 0V

Motorstillstand und 4.095V der max. Motordrehzahl entspricht. Da nun diese

Sollwertspannung der Dreieckspannung überlagert werden soll, um ein PWM – Signal zu

erzeugen, aber die Dreieckspannung einen Offset besitzt, muß die Sollwertspannung über eine

geeignete Schaltung entsprechend angepasst werden. Die Schaltung hierzu ist in Abb. 3.4.2.1

wiedergegeben.

Abb. 3.4.2.1 Schaltung der Sollwertanpassung

_________________________________________________________________________________

Fachhochschule Mannheim Seite 19

Hochschule für Technik und Gestaltung


Aufbau und Inbetriebnahme eines Steuerungssystems zur Navigation und Beobachtung eines autonomen

Fahrzeugs

__________________________________________________________________________________________

Die Schaltung besteht im wesentlichen aus einem invertierenden Differenzverstärker mit einer

einstellbaren Referenzspannungsquelle (LM 317 [9]). Die Ausgangsspannung dieser

Schaltung muß in Abhängigkeit der Sollwertspannung einen Bereich von ca. 5.3V bis 2.5V

überstreichen.

Dieser Bereich kann mit den Trimmpotis R4 bzw. R16 eingestellt werden. Zum einstellen

wird ein 2 – Kanal Oszilloskop verwendet. Die Nullmarken der beiden Kanäle werden an die

unterste Marke des Bildschirms und die Spannung auf 1V/Div. eingestellt.

Mit einem Kanal wird die Spannung des Dreieckgenerators gemessen und mit dem zweiten

Kanal die Ausgangsspannung der Sollwertanpassung.

Einstellung:

1.) Sollwert von 0V anlegen

2.) Trimpoti R16 so einstellen, daß die Ausgangsspannung der Sollwertanpassung an die

obere Grenze der Dreickspannung gelangt.

3.) Sollwert 4.095V anlegen

4.) Trimpoti R4 so einstellen, daß die Ausgangsspannung der Sollwertanpassung an die

untere Grenze der Dreieckspannung gelangt.

5.) Punkt 1 bis 4 so lange wiederholen, bis Einstellung bei Anlegen der Sollwerte 0V und

4,095V ohne ein Trimpoti zu verstellen paßt.

Da nun die Motoren erst bei einer Spannung von ca. 1V sich zu bewegen beginnen, muß bei

einem Sollwert von 0V schon eine Vorspannung am Motor anliegen, um möglichst wenig

Totzeit beim ansteuern der Motoren zu bekommen.

Somit muß die bei einem Sollwert von 0V die Ausgangsspannung der Sollwertanpassung die

Dreieckspannung schon anschneiden. Dazu werden die Punkte 1 – 5 wiederholt, nur daß bei

Punkt 2 die Ausgangsspannung der Sollwertanpassung so eingestellt sein muß wie in Abb.

3.4.2.2 dargestellt.

Abb. 3.4.2.2 Einstellung bei 0V Sollwert

_________________________________________________________________________________

Fachhochschule Mannheim Seite 20

Hochschule für Technik und Gestaltung


Aufbau und Inbetriebnahme eines Steuerungssystems zur Navigation und Beobachtung eines autonomen

Fahrzeugs

__________________________________________________________________________________________

Die Einstellungen für den zweiten Motor werden mit den Trimpotis R11 und R18

durchgeführt.

3.4.3 Pulsfreigabe

Das PWM – Signal muß nur während der Fahrt des Fahrzeugs anliegen. Steht das Fahrzeug

oder ist ein Hindernis erkannt worden muß das PWM – Signal gesperrt werden. Um dies mit

dem TTL – Pegel eines Rechnerausgangs ansteuern zu können, wird eine kleine

Anpaßschaltung benötigt (siehe Abb. 3.4.3.1).

Abb. 3.4.3.1 Schaltung der Pulsfreigabe

Die Schaltung besteht aus einem einfachen Komparator. Liegt keine Spannung oder eine

Spannung kleiner 2V an, liegt am Ausgang max. Spannung an. Da dieser Ausgang am

Sollwerteingang des PWM – Komparators angeschlossen ist, wird in diesem Fall die

Dreieckspannung nicht angeschnitten und somit kein PWM – Signal erzeugt (siehe Abb.

3.4.3.2). Bei einer Eingangsspannung größer 2V, liegt am Ausgang 0V an. Durch die Diode

ist die Schaltung in diesem Fall bedeutungslos und das PWM – Signal wird entsprechend dem

Sollwert erzeugt.

_________________________________________________________________________________

Fachhochschule Mannheim Seite 21

Hochschule für Technik und Gestaltung


Aufbau und Inbetriebnahme eines Steuerungssystems zur Navigation und Beobachtung eines autonomen

Fahrzeugs

__________________________________________________________________________________________

Abb. 3.4.3.2 keine Pulsfreigabe

3.4.4 PWM – Komparator

Mit dem PWM – Komparator wird das eigentliche PWM – Signal erzeugt. Der Komparator

besteht aus einem Bi-MOS-OP LM358 [11], der MOS – Eingänge und einen Bipolaren

Ausgang besitzt. Dieser wird deshalb gewählt, weil mit den MOS – Eingängen die

Anpaßschaltungen und der Dreieckgenerator nicht belastet wird und der Bipolare Ausgang

genügend Strom liefert um die integrierte H – Brücke zu versorgen. Tests mit komplett

Bipolaren OP´s wie z.B. 741 oder LM324 [10] oder nur MOS – OP´s wie z.B. TL084 bringen

hier kein zufriedenstellendes Ergebnis.

Im LM358 sind zwei dieser Op´s ineinemGehäuse. Einer wird fürdenPWM– Komparator

(siehe Abb. 3.4.4.1) und der zweite für eine Spitzenstrombegrenzung (siehe Kap. 3.4.7) zum

Schutz der integrierten H – Brücke L293B [8] benötigt.

Abb. 3.4.4.1 Schaltung des PWM – Komparators

_________________________________________________________________________________

Fachhochschule Mannheim Seite 22

Hochschule für Technik und Gestaltung


Aufbau und Inbetriebnahme eines Steuerungssystems zur Navigation und Beobachtung eines autonomen

Fahrzeugs

__________________________________________________________________________________________

Der Ausgang dieser Schaltung soll an den PWM – Logikeingang der integrierten H – Brücke

L293B gelegt werden. Dieser benötigt im Normalfall eine Eingangsspannung von ca. 5V.

Somit läge es nahe die Versorgungsspannung des PWM – Komparators an 5V zu legen. Beim

Anschluß des OP´s an eine Spannung von 5V arbeitet dieser nicht.

Die Versorgungsspannung des OP´s wird somit an den 8V Spannungsregler, der schon den

Dreieckgenerator und die Sollwertanpassung versorgt, angeschlossen. Damit hat das PWM –

Signal eine Ausgangsspannung von ca. 6.5V um den Logikeingang der integrierten H –

Brücke anzusteuern. Dessen max. Eingangsspannung liegt bei 7V (siehe Datenblatt [8] S. 4).

3.4.5 Integrierte H – Brücke L293B

Zur direkten Ansteuerung der Antriebsmotoren wird die integrierte H – Brücke L293B [8]

gewählt. In diesem IC sind zwei H – Brücken zum Ansteuern beider Antriebsmotoren

vorhanden. Die Motoren benötigen bei max. Geschwindigkeit des Fahrzeugs ca. 600 mA

Strom. Die H – Brücke kann mit 1A dauerbelastet werden. In Abb. 3.4.5.1 ist das

Prinzipschaltbild für die Ansteuerung eines der beiden DC – Motoren und in Abb. 3.4.5.2 die

Pinbelegung des L293B dargestellt.

Abb. 3.4.5.1 Prinzipschaltbild L293B für einen Motor

_________________________________________________________________________________

Fachhochschule Mannheim Seite 23

Hochschule für Technik und Gestaltung


Aufbau und Inbetriebnahme eines Steuerungssystems zur Navigation und Beobachtung eines autonomen

Fahrzeugs

__________________________________________________________________________________________

Abb. 3.4.5.2 Pinbelegung des L293B

Am Anschluß Vss (Pin 16) wird die Versorgungsspannung der Logikeingänge (5V) angelegt.

Die Versorgungsspannung der Motoren (12V) ist an Pin 8 anzuschließen. In die GND

Rückleitungen (Pin 4, 5 für Motor 1 und Pin 12, 13 für Motor 2 ) wird jeweils ein

Shunt – Widerstand R31 und R32 (siehe Schaltplan Kap. 7.3 S. 136) zur Messung des

Motorstroms eingebaut. Die vier Dioden dienen zur Unterdrückung von Induktionsspitzen.

Zur Störungsunterdrückung wird an jedem Motor, direkt an den Motoranschlüssen ein

Keramikkondensator mit einem Wert von 100nF angelötet.

Jede H – Brücke hat drei Logikeingänge, die mit TTL – Pegel oder max. 7V angesteuert

werden können.

Vinh (Pin 1, 9) = Freigabe der H – Brücke

C (Pin 7, 10) = Ansteuerung Motor Rechtslauf

D (Pin 2, 15) = Ansteuerung Motor Linkslauf

Die Funktion der Logikeingänge ist in folgender Tabelle aufgeschlüsselt:

Vinh =H

Eingänge Funktion

C = H ; D = L Motor Rechtslauf

C = L ; D = H Motor Linkslauf

C = D Motor Schnellstop

Vinh = L C = X ; D = X Motor läuft frei aus

H=High(+5V)

L = Low (0V)

X=HoderL

Das erzeugte PWM – SignalwirdandenVinh Eingang gelegt und zur Wahl der Drehrichtung

werden die Eigänge C und D benutzt.

_________________________________________________________________________________

Fachhochschule Mannheim Seite 24

Hochschule für Technik und Gestaltung


Aufbau und Inbetriebnahme eines Steuerungssystems zur Navigation und Beobachtung eines autonomen

Fahrzeugs

__________________________________________________________________________________________

3.4.6 Fahrtrichtungsumkehr

Um die Fahrtrichtung eines Motors umzukehren, soll ein Ausgang des Steuerrechners für

jeden Motor verwendet werden (siehe Abb. 3.2.2 S. 13 Port E Bit 4, 5). Wobei bei

Low – Signal die Fahrtrichtung vorwärts und bei High – Signal die Fahrtrichtung rückwärts

eingestellt werden soll. Der Schnellstop des Motors muß bei diesem Fahrzeug nicht benutzt

werden, da durch das Getriebe, bei einem freien Auslaufen der Motoren das Fahrzeug schnell

genug anhält. Die Eingänge C (Pin 7, 10) und D (Pin 2, 15) müssen also antivalent

angesteuert werden. Die Schaltung dazu ist in Abb. 3.4.6.1 wiedergegeben und muß hier nicht

näher erläutert werden.

Abb. 3.4.6.1 Schaltung zur Fahrtrichtungsumkehr

Direktes ansteuern des L293B mit einem digitalen Ausgang der Fahrzeugsteuerrechners ist

nicht möglich, deshalb werden noch die zwei Inverter A und B dazugeschaltet. Somit werden

alle 6 Inverter des IC´s [17] für beide Kanäle ausgenutzt.

3.4.7 Strombegrenzung

Da die integrierte H – Brücke L293B nur einen Spitzenstrom von 2A für 5ms verkraftet, ist es

unbedingt nötig, Stromspitzen die beim Anfahren des Fahrzeugs oder bei eventuellen

Reversieren der Motoren bei voller Fahrt entstehen können, zu unterdrücken bzw. zu

begrenzen. Die dazugehörige Schaltung ist in Abb. 3.4.6.1 wiedergegeben.

_________________________________________________________________________________

Fachhochschule Mannheim Seite 25

Hochschule für Technik und Gestaltung


Aufbau und Inbetriebnahme eines Steuerungssystems zur Navigation und Beobachtung eines autonomen

Fahrzeugs

__________________________________________________________________________________________

Abb. 3.4.7.1 Schaltung der Strombegrenzung

Die Schaltung besteht im wesentlichen wieder aus einem Komparator. Mit R23 und V5 wird

eine Referenzspannung erzeugt, die über R26 auf den invertierenden Eingang des OP´s gelegt

wird. Am nichtinvertierenden Eingang liegt die Spannung des Messwiderstandes R31 an

(siehe Schaltplan Kap. 7.3 S. 136). Übersteigt die Spannung am Messwiderstand die

eingestellte Referenzspannung, wird über die Diode V6 das PWM – Signal abgeschaltet. Die

Kondensatoren C13 und C14 dienen zu einer Glättung bzw. zeitlichen Verzögerung des

Begrenzungssignals. Dadurch werden unzulässige Stromspitzen zuverlässig verhindert.

Eingestellt wird ein max. Strom von 1.8A. Dazu wird am invertierenden Eingang des OP´s

Eine Spannung von 0.27V eingestellt, die sich folgendermaßen errechnet:

Ueinst =Imax *R31

3.5 Zählerkarte

Wie in Kap. 3.1 S. 10 erwähnt, ist der Fahrzeugsteuerrechner nicht in der Lage die hohe

Pulsfrequenz der beiden Pulsgeber direkt einzulesen. Deshalb wird dies hardwaremäßig

realisiert. Da bei max. Geschwindigkeit und einer Abtastzeit von 5ms, 41 Impulse pro

Zeiteinheit gezählt werden würde ein 6 Bit Zähler hierfür ausreichen. In dieser Schaltung

werden zwei 8 Bit Zähler verwendet, um bei einer eventuellen Geschwindigkeitserhöhung des

Fahrzeugs noch Reserven zu haben.

Bei einem Reglerinterrupt werden die gezählten Impulse über die Ports C und D in den

Rechner eingelesen und die Zähler dann sofort wieder zurückgesetzt. Somit hat man einen

proportionalen Zusammenhang zwischen den gezählten Impulsen und der Istdrehzahl der

Motoren. In Abb. 3.5.1 ist das Prinzipschaltbild für einen Kanal dargestellt.

_________________________________________________________________________________

Fachhochschule Mannheim Seite 26

Hochschule für Technik und Gestaltung


Aufbau und Inbetriebnahme eines Steuerungssystems zur Navigation und Beobachtung eines autonomen

Fahrzeugs

__________________________________________________________________________________________

Abb. 3.5.1 Prinzipschaltbild der Hardwarezähler

3.5.1 Pulsaufbereitung

Die Pulsaufbereitung dient zur Unterdrückung von Störimpulsen und zur Aufbereitung der

Pulsflanken der Geber. Dazu wird ein vierfach RS – 422 Empfängerbaustein SN75173 [20]

verwendet. Die Signale bzw. Anschlüsse der Pulsgeber, die verwendet werden sind im

folgenden aufgeführt:

Signal A = Pulse

Signal A negiert = Pulse invertiert

Signal B = 90° versetzte Pulse

Signal B negiert = 90° versetzte Pulse invertiert

5V DC = Versorgungsspannung 5V

GND = Bezugsleitung

Die restlichen Signale der Pulsgeber werden hier nicht benötigt, deshalb sind vier RS – 422

Empfänger für beide Pulsgeber ausreichend. Durch die negierten Signale und den Vergleich

dieser, werden Störungen, die über die Geberleitung induziert werden, ausgefiltert (siehe Abb.

3.5.1.1).

Abb. 3.5.1.1 Ausgangssignal nach Pulsaufbereitung

_________________________________________________________________________________

Fachhochschule Mannheim Seite 27

Hochschule für Technik und Gestaltung


Aufbau und Inbetriebnahme eines Steuerungssystems zur Navigation und Beobachtung eines autonomen

Fahrzeugs

__________________________________________________________________________________________

Der Anschluß der Gebersignale eines Gebers an den Empfängerbaustein ist in Abb. 3.5.1.2

dargestellt.

Abb. 3.5.1.2 Anschluß eines Gebers an den Empfängerbaustein SN75173

Die Kombination der Widerstände und Kondensatoren an den Eingängen des SN75173 ist

eine Empfehlung der Geberhersteller.

An den Ausgängen liegen die entstörten und aufbereiteten Signale eines Gebers an, die nun

der Impulsverdopplerschaltung zugeführt werden.

3.5.2 Impulsverdoppelung

Jeder Pulsgeber liefert 5000 Impulse pro Umdrehung und ein um 90° Phasenverschobenes

Signal. Mit diesen zwei Signalen kann die Pulszahl über eine einfache Logikschaltung

verdoppelt werden. Dazu werden die zwei Signale A und B einem Exklusiv – Oder – Gatter

zugeführt. Am Ausgang kann dann ein Signal mit doppelter Frequenz entnommen werden,

das den Zählern zugeführt wird. Wegen der Einfachheit der Schaltung wird diese hier nicht

explizit dargestellt, ist aber im Gesamtschaltplan Kap. 7.4 S. 138 enthalten.

_________________________________________________________________________________

Fachhochschule Mannheim Seite 28

Hochschule für Technik und Gestaltung


Aufbau und Inbetriebnahme eines Steuerungssystems zur Navigation und Beobachtung eines autonomen

Fahrzeugs

__________________________________________________________________________________________

3.5.3 Zähler

Die verdoppelten Pulse werden nun noch auf einen 8 Bit Zähler gelegt, der wiederum die

gezählten Impulse dem Fahrzeugsteuerrechner übergibt und vom Rechner einen Resetimpuls

bekommt. Der 8 Bit Zähler wird aus zwei kaskadierten 4 Bit Zählern [19] aufgebaut (siehe

Abb. 3.5.3.1).

Abb. 3.5.3.1 Schaltung des 8Bit Zählers

3.5.4 Totmannschaltung

Bei der Inbetriebnahme des Fahrzeugs ist es des öfteren passiert, daß derSteuerrechneraus

unbekannten Gründen abgestürzt ist. Dabei wird das Steuerungsprogramm nicht mehr

bearbeitet. Bleibt die Versorgungsspannung am Rechner anstehen, behalten alle Ausgänge

ihren augenblicklichen Zustand bei. Sollte dies bei einer Fahrt des Fahrzeug vorkommen,

bleiben sowohl die Sollwertspannungen an den D/A – Wandlern, sowie die Pegel der

Pulsfreigaben für den Antrieb erhalten, d.h. das Fahrzeug fährt auf das nächste Hindernis

ungebremst auf !

_________________________________________________________________________________

Fachhochschule Mannheim Seite 29

Hochschule für Technik und Gestaltung


Aufbau und Inbetriebnahme eines Steuerungssystems zur Navigation und Beobachtung eines autonomen

Fahrzeugs

__________________________________________________________________________________________

Da ein Rechnerabsturz auch bei dem jetzt funktionierenden Steuerungsprogramm nie

ausgeschlossen werden kann, ist eine Schutzschaltung, die den Programmzyklus kontrolliert

und bei Bedarf die Pulsfreigaben des Antriebs abschaltet, unumgänglich. Dazu muß vom

Rechner, über einen Ausgang ein sogenannter Lebenstakt ausgegeben werden. Mit einem

Monoflop [16] wird dieser kontrolliert und schaltet über UND – Gatter [15] die Pulsfreigaben

vom Rechner zum Antrieb durch oder sperrt diese. Die entsprechende Schaltung ist in Abb.

3.5.4.1 dargestellt.

Abb. 3.5.4.1 Totmannschaltung fürNot– Halt des Fahrzeugs

Der Lebenstakt des Rechners wird durch einen Softwareinterrupt (IRQ 28) erzeugt und

kommt im Normalfall alle 55ms, d.h. eine Periode des Signals beträgt 110ms. In Abb. 3.5.4.2

ist dieser Fall dargestellt. CH1 stellt den Ausgang des Monoflops SN 74123 dar und CH2 den

Lebenstakt des Rechners.

_________________________________________________________________________________

Fachhochschule Mannheim Seite 30

Hochschule für Technik und Gestaltung


Aufbau und Inbetriebnahme eines Steuerungssystems zur Navigation und Beobachtung eines autonomen

Fahrzeugs

__________________________________________________________________________________________

Abb. 3.5.4.2 Lebenstakt des Rechners und Ausgang des Monoflops

Da der Softwareinterrupt eine sehr niedrige Priorität hat, kann es sein, daß die Periodendauer

des Lebenstakts sich sporadisch erhöht. Aus diesem Grund wird der Monoflop auf eine

Verzögerungszeit von 150ms eingestellt, um keine ungewollten Ausfälle des PWM – Signals

zu bekommen. Zum einstellen der Schaltung wird am Eingang X8/1 ein Rechtecksignal mit

einer Periodendauer > 150ms angelegt, und mit R13 der Monoflop auf eine Verzögerungszeit

von 150 ms eingestellt. Somit hält nach Absturz des Rechners das Fahrzeug nach 150ms an.

Abb. 3.5.4.3 zeigt die Einstellung der Totmannschaltung. CH1 ist der Ausgang des

Monoflops und CH2 ein Rechtecksignal eines Funktionsgenerators.

Abb. 3.5.4.3 Einstellung der Totmannschaltung

_________________________________________________________________________________

Fachhochschule Mannheim Seite 31

Hochschule für Technik und Gestaltung


Aufbau und Inbetriebnahme eines Steuerungssystems zur Navigation und Beobachtung eines autonomen

Fahrzeugs

__________________________________________________________________________________________

3.6 Ultraschallsensoren

Zur Kollisionsüberwachung des Fahrzeugs und für die Referenz- bzw. Parkfahrt werden zwei

Ultaschallsensoren (UC2000-30GM-IUR2-V15 der Firma Pepperl & Fuchs) verwendet (siehe

auch Kap. 2 S. 8 und Kap. 3.1 S. 11). Diese Ultraschallsensoren werden deshalb benutzt, weil

sie unabhängig von Materialeigenschaften und Lichtverhältnissen, zuverlässig Hindernisse

erkennen können. Die verwendeten Sensoren besitzen integrierte Microcontroller, welche die

Auswertung der Schalllaufzeiten, Temperaturkompensation, Synchronisation mehrerer

Sensoren sowie die Umrechnung der gemessenen Entfernung in eine Analoge Spannung,

übernehmen. Dadurch wird der Fahrzeugsteuerrechner durch die Messungen nicht belastet.

Die zwei Sensoren sind am Fahrzeug in einer Entfernung von ca. 30 cm voneinander

angebracht. Dadurch werden Hindernisse über die gesamte Breite des Fahrzeugs gut erkannt.

Um bei der Park- bzw. Referenzfahrt das Fahrzeug winkelig auf eine Platte auszurichten, sind

die Schallaustrittsflächen parallel zu den Radvorderkanten ausgerichtet (siehe Abb. 3.6.1).

Abb. 3.6.1 Mechanischer Anbau der Ultraschallsensoren (Draufsicht)

_________________________________________________________________________________

Fachhochschule Mannheim Seite 32

Hochschule für Technik und Gestaltung


Aufbau und Inbetriebnahme eines Steuerungssystems zur Navigation und Beobachtung eines autonomen

Fahrzeugs

__________________________________________________________________________________________

Die Ultraschallsensoren haben einen Erfassungsbereich von 80mm bis 2m. Die gemessene

Entfernung zum Hindernis wird proportional über eine Analoge Spannung (0V bis 10V) von

den Sensoren ausgegeben. Dabei ist es möglich die Spannung als steigende Rampe (0V = nah

bis 10V = fern) oder als fallende Rampe (0V = fern bis 10V = nah) zu parametrieren. In

diesem Fall wird eine steigende Rampe eingestellt. Die restlichen Parameter bleiben im

Originalzustand (genaue Beschreibung siehe Datenblatt [21] S. 2).

Bei Vorwärtsfahrt kontrollieren beide Sensoren den Raum vor dem Fahrzeug auf Hindernisse.

Kommt ein Hindernis dem Fahrzeug zu nahe, wird das Fahrzeug sofort zum anhalten

gebracht, bis sich das Hindernis entfernt oder entfernt wird. Da eine Analoge Spannung von

den Sensoren ausgegeben wird, kann bei eintreten eines Hindernisses in den

Erfassungsbereich die Geschwindigkeit des Fahrzeugs proportional zur Entfernung, bis zum

Stillstand verringert werden.

Für die Park- bzw. Referenzfahrt an den Zielstationen müssen zwei Platten im rechten Winkel

zueinander aufgestellt werden, um das Fahrzeug auf Entfernung und Winkeligkeit zu diesen

auszurichten. Dazu fährt das Fahrzeug im Schleichgang auf die erste Platte zu und wird bei

der richtigen Entfernung zu dieser angehalten. Dafür wird nur einer der beiden Sensoren

benutzt. Danach muß das Fahrzeug Parallel zur Platte ausgerichtet werden. Fürdiesen

Vorgang werden beide Sensoren eingesetzt. Das Fahrzeug wird solange auf der Stelle gedreht,

bis beide Sensoren den gleichen Spannungswert liefern. Nun wird nochmals eine

Positionierung auf die richtige Entfernung zur Platte vorgenommen. Danach erfolgt eine

Drehung um 90°,damit das Fahrzeug mit der Front zur zweiten Platte steht. Die gleiche

Ausrichtprozedur wird jetzt auf die zweite Platte angewendet. Mit einer weiteren Drehung um

90° steht das Fahrzeug in Ausgangsposition und die Park- bzw. Referenzfahrt ist beendet.

Die analoge Spannung der Sensoren wird dem Fahrzeugsteuerrechner über A/D – Wandler

zugeführt. Da die A/D – Wandler des Rechners nur eine Spannung von 0V bis 4.095V

erkennen, muß diese über einen Spannungsteiler angepasst werden. Dies hat zur Folge, daß

die Meßauflösung der Sensoren um ca. 60% sinkt, da der Bereich von 0V bis 10V auf 0V bis

4V eingeschränkt wird. Wie die praktischen Versuche zeigten, reicht die

Positioniergenauigkeit dennoch gut aus, um das Fahrzeug reproduzierbar genau zu

Positionieren. Bei einer Teststrecke von ca. 10m wurde eine Positioniergenauigkeit von

+- 1cm erreicht. Die Schaltung für die Sensoranpassung ist in Abb. 3.6.2 dargestellt.

Abb. 3.6.2 Anpassung der Ultraschallsensoren

_________________________________________________________________________________

Fachhochschule Mannheim Seite 33

Hochschule für Technik und Gestaltung


Aufbau und Inbetriebnahme eines Steuerungssystems zur Navigation und Beobachtung eines autonomen

Fahrzeugs

__________________________________________________________________________________________

Die Trimpotis der Anpassung werden so eingestellt, daß bei einer Eingangsspannung am

Spannungsteiler von 10V, eine Ausgangsspannung zum A/D – Wandler von 4,1V anliegt.

Sollte sich das Fahrzeug bei der Park- bzw. Referenzfahrt nicht richtig zu den Platten

ausrichten, kann dies am entsprechenden Trimpoti der Anpassung justiert werden.

3.7 Funkmodems

Zur bidirektionalen Datenübertragung vom Leitrechner zum Fahrzeug werden zwei

Funkmodems benutzt (genaue Funktionsbeschreibung siehe [6] ).

Die Hardware dieser Funkmodems stellt eine TTL – RS – 232 – Schnittstelle zur Verfügung.

Da der Leitrechner sowie der Fahrzeugsteuerrechner jeweils Schnittstellen mit

V24 – Pegeln besitzen, ist eine hardwaremäßige Anpassung der TTL – Schnittstellen

unbedingt erforderlich, da sonst die Eingänge der Funkmodems schaden nehmen, bzw. die

TTL – Ausgangspegel der Funkmodems, von den V24 – Eingängen der PC – Schnittstellen

nicht ausgewertet werden können.

Die TTL – Schnittstellen der Funkmodems sind so gehalten, daß die Pegel der einzelnen

Ein- bzw. Ausgänge genau invertiert sind. Zur Anpassung werden die integrierten RS – 232

Treiber MAX 232 [12] eingesetzt. Eines dieser IC´s enthält jeweils zwei Empfänger und zwei

Sender, die ein invertiertes Signal an den Ausgängen liefern (siehe Abb. 3.7.1).

Abb. 3.7.1 Prinzipbild des MAX 232 A

_________________________________________________________________________________

Fachhochschule Mannheim Seite 34

Hochschule für Technik und Gestaltung


Aufbau und Inbetriebnahme eines Steuerungssystems zur Navigation und Beobachtung eines autonomen

Fahrzeugs

__________________________________________________________________________________________

Vorteil dieses IC´s ist,daß keine separate Versorgungsspannung fürdenV24– Pegel (+-10V)

vonnötenist.Esgenügt eine 5V Versorgung, da die IC´s intern, über angeschaltete

Kondensatoren (C1 bis C5 siehe Abb. 3.7.1), diesen V24 – Pegel erzeugen. Da die

Funkmodems auch mit einer Spannung von 5V betrieben werden, ist die Versorgung der

Modems samt Anpaßschaltung kein Problem.

Die Funkmodems kommunizieren mit den PC – Schnittstellen über Hardwarehandshake. Die

benötigten Anschlüsse sind wie folgt:

Pin 1 = Antennenanschluß

Pin 2 = Betriebserde (GND)

Pin 3 = Versorgungsspannung 5V

Pin 4 = DCD (Ausgang)

Pin 5 = RTS (Eingang)

Pin 6 = RxD (Ausgang)

Pin 7 = TxD (Eingang)

Pin 8 = CTS (Ausgang)

Pin 9 = CS (Eingang)

Pin 10 = RSSI (Analogausgang)

Pin 9 wird direkt auf GND gelegt, da das Funkmodem immer in Betrieb sein soll. An Pin 10

kann die Empfangsfeldstärke gemessen werden. Dieser Anschluß wird hier nicht benutzt.

Für die Kommunikation mit den PC´s werdenalsodreiAusgänge (DCD, RxD, CTS) sowie

zwei Eingänge (RTS, TxD) benötigt. Da in einem MAX 232 nur zwei Empfänger und zwei

Sender vorhanden sind, müssen für jedes Funkmodem zwei MAX 232 eingesetzt werden. Die

Anpaßschaltung für ein Modem ist in Abb. 3.7.2 dargestellt.

Abb. 3.7.2 Anpaßschaltung für ein Funkmodem

_________________________________________________________________________________

Fachhochschule Mannheim Seite 35

Hochschule für Technik und Gestaltung


Aufbau und Inbetriebnahme eines Steuerungssystems zur Navigation und Beobachtung eines autonomen

Fahrzeugs

__________________________________________________________________________________________

Die Anschlüsse zur PC – Schnittstelle werden an eine 9 polige D – Sub – Buchse (X1) so

angeschlossen, daß ein normales 1:1 Kabel verwendet werden kann. Dies gilt fürden

Leitrechner sowie den Fahrzeugsteuerrechner.

Die Versorgungsspannung wird beim Leitrechner über ein separates Netzteil zugeführt und

beim Fahrzeug direkt mit an die Versorgungsleitung des Fahrzeugsteuerrechners geschlossen.

3.8 Spannungsregler

Zur Versorgung des Fahrzeugsteuerrechners, der Funkmodems mit Anpaßschaltung, der

Pulsgeber und der Bedieneinheit, werden 5V benötigt. Da zur Versorgung des Fahrzeugs ein

12V Akku vorhanden ist, wird für die 5V Versorgung der einstellbare Spannungsregler

LM 317 K eingesetzt, der einen Strom bis 1.5A liefern kann. Die beiden Pulsgeber und das

Bedienteil benötigen einen Gesamtstrom von ca. 250mA und werden mit einem

Spannungsregler betrieben. Der Fahrzeugsteuerrechner und das Funkmodem mit

Anpaßschaltung benötigen einen Strom von ca. 600mA und werden mit einem zweiten LM

317 K betrieben.

Die Schaltung eines Spannungreglers ist in Abb. 3.8.1 wiedergegeben.

Bild 3.8.1 Schaltung der 5V Versorgung

Das Trimpoti R1 wird so eingestellt, daß amAusgang Vout, 5V anliegen. Die Kondensatoren

C2 und C3 dienen zur Schwingungsunterdrückung des LM 317 K, C1 zur Glättung der

Eingangsspannung und C4 bis C6 zur Glättung der Ausgangsspannung. Zur Kühlung wird ein

Fingerkühlkörper verwendet.

_________________________________________________________________________________

Fachhochschule Mannheim Seite 36

Hochschule für Technik und Gestaltung


Aufbau und Inbetriebnahme eines Steuerungssystems zur Navigation und Beobachtung eines autonomen

Fahrzeugs

__________________________________________________________________________________________

4. Handhabung

In diesem Kapitel wird die Handhabung des Leitrechners und des Fahrzeugs beschrieben. Bei

der zur Verfügung stehenden Zeit für diese Diplomarbeit, war es nur möglich eine

Leitrechnerdemo – Software zu entwickeln, welche im Groben die Funktionen der

Funkmodems und die Auswertung der vom Fahrzeug gesendeten Daten zeigt. Es wurde auch

auf eine Fehlerbehandlung bei Falscheingaben verzichtet. Dadurch ist es möglich, daß

Laufzeitfehler auftreten, die das Programm abbrechen. Sollte dies der Fall sein, muß das

Programm neu gestartet werden.

Die Leitrechnerdemo ist komplett im Visual Basic (Version 6.0) geschrieben und auch auf

Rechnern mit Windows NT lauffähig.

4.1 Leitrechnerdemo

Beim Start der Leitrechnerdemo für den mobilen Roboter, stehen im Grundbild zwei Menüs

und mehrere Anzeigen zur Verfügung.

4.1.1 Menü Datei

Im pull – down – Menü Datei (siehe 1 Abb. 4.1.3.1 S. 40) gibt es drei Unterpunkte, die zur

Auswahl stehen:

- laden

- speichern

- beenden

Mit dem Punkt laden kann ein Fahrauftrag, sofern vorhanden, von der Festplatte geladen

werden. Dazu erscheint ein, von allgemeinen Windows – Programmen bekanntes Bild,

welches auch so zu handhaben ist (siehe Abb. 4.1.1.1). Dateien die Fahraufträge enthalten

sind mit der Endung .weg gekennzeichnet. Mit einem Doppelklick auf eine entsprechende

Datei erscheint diese im Dateifenster und bei Bestätigung mit dem ok – Button wird diese ins

Programm geladen.

Abb. 4.1.1.1 Bild zum Laden oder Speichern von Fahraufträgen

_________________________________________________________________________________

Fachhochschule Mannheim Seite 37

Hochschule für Technik und Gestaltung


Aufbau und Inbetriebnahme eines Steuerungssystems zur Navigation und Beobachtung eines autonomen

Fahrzeugs

__________________________________________________________________________________________

Mit dem Menüpunkt speichern kann ein Fahrauftrag, der von Hand eingegeben wurde auf die

Festplatte des Rechners gespeichert werden. Es erscheint das gleiche Bild wie im Menüpunkt

laden (siehe Abb. 4.1.1.1). Im Dateifenster muß nun der * durch den Namen des Fahrauftrags

ersetzt werden und mit dem ok – Button wird die Datei gespeichert.

Bei Auswahl des Menüpunktes beenden wird das Programm verlassen. Ein nicht

gespeicherter Fahrauftrag geht hierbei verloren (keine Sicherheitsabfrage!).

4.1.2 Menü Fahrzeug

Im pull – down – Menü Fahrzeug (siehe 1 Abb. 4.1.3.1 S. 40) gibt es drei Unterpunkte, die

zur Auswahl stehen:

- Wege eingeben

- Wege senden

- starten

Mit dem Menüpunkt Wege eingeben können Fahraufträge für das Fahrzeug geschrieben

werden. Ein Fahrauftrag besteht aus allen Wegen, Drehungen und Parkfahrten von der

Ladestation bis zu dieser zurück (siehe Abb. 2.2 S. 9). Dazu müssen die entsprechenden Wege

ausgemessen werden. Der letzte Weg vor einer Park- bzw. Referenzfahrt muß mindestens

50cm vor Platte 1 der Andokstation enden, damit die Kollisionskontrolle des Fahrzeugs nicht

anspricht. Sollte dies der Fall sein, bleibt das Fahrzeug stehen und die Parkfahrt wird nicht

ausgeführt. Wenn das bei der Inbetriebnahme eines neuen Fahrauftrags passiert, muß das

Fahrzeug ein Stück von der Platte entfernt werden bis der letzte Weg vor der Parkfahrt

beendet werden kann, ohne das die Kollisionskontrolle anspricht. Bei Aufruf des

Menüpunktes erscheint ein Fenster gemäß Abb. 4.1.2.1.

Bild 4.1.2.1 Fenster Wege eingeben

_________________________________________________________________________________

Fachhochschule Mannheim Seite 38

Hochschule für Technik und Gestaltung


Aufbau und Inbetriebnahme eines Steuerungssystems zur Navigation und Beobachtung eines autonomen

Fahrzeugs

__________________________________________________________________________________________

Angezeigt wird die aktuelle Wegnummer und ein Optionsfeld mit den Weginformationen.

Zuerst wird eine Wegoption ausgewählt. Entsprechend der gewählten Wegoption muß ein

Fahrweg in cm oder eine Drehung in Grad eingegeben werden. Ist die Option Parkfahrt

gewählt, ist keine weitere Eingabe nötig. Um den nächsten Fahrweg einzugeben muß der

Button nächster Weg betätigt werden. Die aktuelle Wegnummer erhöht sich und die nächsten

Wegangaben können gemacht werden. Zum abschließen eines Fahrauftrags muß die Option

Fahrt vorwärts gewählt und als Weg 0cm eingegeben werden.

Ist der Fahrauftrag komplettiert, wird mit dem Button ENDE die Fahrauftragseingabe beendet

und das Fenster Wege eingeben verschwindet. Bei erneutem Aufruf beginnt die Anzeige der

Wege und Wegoptionen bei Weg 1. Durch weiterschalten mit den Buttons nächster Weg und

vorheriger Weg, können sämtliche Eingaben editiert werden.

Bei dieser Demo Software ist bereits ein Fahrauftrag von der Ladestation bis zum

Hochregallager und zurück vorhanden. Die Datei liegt im Verzeichnis der Demo Software

unter dem Namen HREGAL.WEG.

Durch klicken auf den Menüpunkt Wege senden, wird der im Speicher befindliche

Fahrauftrag umgerechnet und über das Funkmodem zum Fahrzeug gesendet. Hat das

Fahrzeug die Daten empfangen, sendet es auf jeden Fall eine Rückmeldung, die im Fenster

Kommunikation zu sehen ist. Kommt keine oder eine negative Rückmeldung des Fahrzeugs,

muß das Senden der Daten wiederholt werden.

Als Rückmeldung gibt es zwei Möglichkeiten:

1.) ACK = positive Rückmeldung. Alle Daten korrekt empfangen.

2.) NAK = negative Rückmeldung. Daten nicht korrekt empfangen.

Befindet sich das Fahrzeug an der Ladestation, werden die Fahrauftragsdaten in den Speicher

des Fahrzeugs geschrieben. Sollte ein aktueller Fahrauftrag vom Fahrzeug gerade ausgeführt

werden, kommt zwar eine Rückmeldung (positiv oder negativ), aber die Daten werden nicht

in den Fahrauftragsspeicher des Fahrzeugs übernommen.

Während Daten über das Funkmodem zum Fahrzeug gesendet werden, erscheint eine

Fortschrittsanzeige (siehe 2 Abb. 4.1.3.1 S. 40) auf dem Bildschirm, welche die Dauer der

Datenübertragung zum Funkmodem anzeigt.

Mit dem Menüpunkt starten kann das Fahrzeug von den Andokstationen gestartet werden,

sofern ein gültiger Fahrauftrag im Speicher des Fahrzeugsteuerrechners steht. Auch hier wird

die Fortschrittsanzeige eingeblendet und eine Rückmeldung des Fahrzeugs gegeben. Sollte

keine Rückmeldung erfolgen, muß das Startsignal für das Fahrzeug erneut gesendet werden.

_________________________________________________________________________________

Fachhochschule Mannheim Seite 39

Hochschule für Technik und Gestaltung


Aufbau und Inbetriebnahme eines Steuerungssystems zur Navigation und Beobachtung eines autonomen

Fahrzeugs

__________________________________________________________________________________________

4.1.3 Statusanzeigen

Im Grundbild gibt es noch mehrere Statusanzeigen (siehe Abb. 4.1.3.1), die hier im einzelnen

erläutert werden.

Abb. 4.1.3.1 Grundbild mit Statusanzeigen

Bei der Anzeige Wegnummer (siehe 3 Abb. 4.1.3.1) wird die Nummer des gerade aktuell

gefahrenen Wegs des Fahrzeugs angezeigt. Damit kann das Fahrzeug am Bildschirm

„verfolgt“ werden.

Die Anzeige Statusflag Fahrzeug (siehe 4 Abb. 4.1.3.1) zeigt die internen Zustände des

Fahrzeugs an. Für die interne Kommunikation der Routinen im Fahrzeugsteuerrechner sind

Flagbits vorhanden, die Anzeigen, welche Programmzustände oder Störungen beim Fahrzeug

_________________________________________________________________________________

Fachhochschule Mannheim Seite 40

Hochschule für Technik und Gestaltung


Aufbau und Inbetriebnahme eines Steuerungssystems zur Navigation und Beobachtung eines autonomen

Fahrzeugs

__________________________________________________________________________________________

vorliegen. In der Fahrzeugsoftware sind hier 32 – Bit in einer Variable vorgesehen, die

zyklisch an den Leitrechner gesendet werden (Aufschlüsselung der Bits S. Kap 7.1.1 S. 100).

Der Status wird Hexadezimal angezeigt, wobei die Buchstaben A – F nicht als solche,

sondern numerisch Angezeigt werden, also A=10 – F=15. Die Halbbytes (Nibbles) werden

entsprechend ihrer Wertigkeit von rechts (niederwertigstes Nibble) nach links

(höchstwertigstes Nibble) angezeigt. Die Anzeige wird alle 10 Sekunden aktualisiert. Die

Rückmeldung die das Fahrzeug verlangt wird automatisch gesendet.

Mit dem Fenster Kommunikation (siehe 5 Abb. 4.1.3.1 S. 40) kann der Datenaustausch

zwischen Leit- und Fahrzeugsteuerrechner beobachtet werden. Die ankommenden Daten vom

Fahrzeug werden alle Byteweise dezimal angezeigt, außer eine positive Rückmeldung. Diese

wird als ACK erscheinen. Beim Senden der Daten wird nur eine positive oder negative

Rückmeldung zum Fahrzeug angezeigt als ACK zurück oder NAK zurück. Mit dem Button

Inhalt löschen kann der Inhalt des Fensters gelöscht werden.

Die Buttons ACK und NAK (siehe 6 Abb. 4.1.3.1 S. 40) senden entsprechend eine

Rückmeldung zum Fahrzeug, werden aber normalerweise nicht benutzt.

Der Button ENQ fordert ein Lebenszeichen (Rückmeldung) des Fahrzeugsteuerrechners an.

4.2 Fahrzeug

Die Ausgangsposition des Fahrzeugs, ist für jeden Fahrauftrag die Ladestation. Dort muß das

Fahrzeug entsprechend Abb. 4.2.1 aufgestellt werden. Die Schallaustrittsflächen der

Ultraschallsensoren müssen parallel zur Platte 1 gestellt werden. Sollten während der

Abarbeitung eines Fahrauftrags schwerwiegende Fehler, wie z.B. Absturz des Rechners oder

Ausfall der Versorgungsspannung eintreten, muß das Fahrzeug abgeschaltet, auf die

Ausgangsposition gestellt und neu gestartet werden.

Abb. 4.2.1 Ausgangsposition des Fahrzeugs an der Ladestation

_________________________________________________________________________________

Fachhochschule Mannheim Seite 41

Hochschule für Technik und Gestaltung


Aufbau und Inbetriebnahme eines Steuerungssystems zur Navigation und Beobachtung eines autonomen

Fahrzeugs

__________________________________________________________________________________________

Beim augenblicklichen Stand der Fahrzeugsoftware, läuft das Steuerungsprogramm des

Fahrzeugrechners noch nicht automatisch, nach Einschalten der Versorgungsspannung an.

Um das Fahrzeug in Betrieb zu nehmen, muß an einem PC das Hyper – Terminal – Programm

(HTP) gestartet werden. Die Einstellungen der Schnittstelle für dasHTPsindin[2]S.4

beschrieben. Das mitgelieferte Terminalkabel wird an der PC – Schnittstelle und an den

Stecker J10 (Console) angeschlossen. Nach Einschalten des Fahrzeugs am Hauptschalter

(siehe Abb. 4.2.1 S. 41), läuft der Fahrzeugrechner hoch. Nach dem Hochlauf wird in das

Laufwerk C gewechselt und das Steuerungsprogramm fts.exe gestartet. Wenn die grüne LED

am Bedienteil blinkt, kann das Terminalkabel vom Stecker J10 entfernt werden. Das Fahrzeug

ist nun Betriebsbereit. Jetzt muß noch die Leitrechnerdemo gestartet werden.

Das Fahrzeug sendet zyklisch seinen Status zum Leitrechner. Ist der Leitrechner nicht

Betriebsbereit, kann folglich auch kein ACK zum Fahrzeug zurückgesendet werden. Das

Fahrzeug sendet bei nicht erhalten eines ACK, den anstehenden Datensatz bis zu 10 mal.

Sollte nach dem 10. mal immer noch kein ACK vom Leitrechner eingegangen sein, bricht das

Fahrzeug das zyklische Senden des Status ab und wartet auf eine Anforderung des

Leitrechners. Diese Anforderung kann mit dem Button ENQ (siehe 6 Abb. 4.1.3.1 S. 40) vom

Leitrechner aus gesendet werden. Wenn ein ACK vom Leitrechner zurückgeschickt wird,

sendet das Fahrzeug wieder zyklisch seine Daten.

Dem Fahrzeug kann jetzt ein Fahrauftrag gesendet und entweder mit dem Leitrechner oder

der Taste auf dem Bedienfeld gestartet werden.

Die grüne LED am Bedienteil zeigt an, daß das Fahrzeug einen Startbefehl erwartet. Dies ist

nach jeder abgeschlossenen Parkfahrt oder nach einem Neustart des Rechners der Fall.

Die rote LED ist als Fehleranzeige konzipiert, ist aber beim derzeitigen Stand der

Fahrzeugsoftware noch nicht in Betrieb, da noch keine Fehlerdiagnose programmiert ist.

4.3 Datenübertragung

Die Datenübertragung zwischen dem Leitrechner und Fahrzeugrechner geschieht Byteweise.

Damit ankommende Daten vom Leitrechner zum Fahrzeug bzw. umgekehrt eindeutig

zugeordnet und Fehler festgestellt werden können, müssen die Daten in sogenannten Frames

übertragen werden. Ein Frame besteht hier im wesentlichen aus drei Teilen:

1.) Framebeginn

2.) Nutzdaten

3.) Frameende

Das Fahrzeug wertet 5 gültige Frames, die vom Leitrechner gesendet werden aus und sendet

bei korrektem Empfang eine positive Rückmeldung (ACK)zurück. Die Frames sehen

folgendermaßen aus:

_________________________________________________________________________________

Fachhochschule Mannheim Seite 42

Hochschule für Technik und Gestaltung


Aufbau und Inbetriebnahme eines Steuerungssystems zur Navigation und Beobachtung eines autonomen

Fahrzeugs

__________________________________________________________________________________________

Lebenszeichen von LR

Dieser Frame wird vom LR zum Fahrzeug gesendet, wenn dieses z.B. aufgrund fehlender

Rückmeldungen, die automatische Datenübertragung zum LR eingestellt hat. Dieser Befehl

hat sonst keine Wirkung.

Fahrauftrag starten

Mit diesem Datensatz wird ein vorhandener Fahrauftrag im Fahrzeug gestartet bzw. das

Fahrzeug während der Abarbeitung eines Fahrauftrags von einer Andokstation gestartet.

Status vom Fahrzeug anfordern

Der Befehl fordert den Status des Fahrzeugs an bzw. ist hier kombatibel zum Befehl

Lebenszeichen von LR.

Fahrzeug stoppen

Durch diesen Befehl soll das Fahrzeug gestoppt werden. Er wird zwar als gültig erkannt, ist

jedoch beim jetzigen Stand der Software wirkungslos.

Fahrauftrag

Bei diesem Frame wird nach dem Befehlsbyte die Anzahl der Bytes übertragen, die als

Wegdaten gesendet werden. Pro Verfahrweg sind dies 3 Bytes. Da die Funkmodems einen

internen CRC – Check dürchführen und bei einem Übertragungsfehler, das falsch gesendete

Byte einfach nicht zur PC – Schnittstelle des Empfängers übertragen wird, kann über die

Anzahl der übertragenen Bytes ein Fehler relativ einfach erkannt werden.

_________________________________________________________________________________

Fachhochschule Mannheim Seite 43

Hochschule für Technik und Gestaltung


Aufbau und Inbetriebnahme eines Steuerungssystems zur Navigation und Beobachtung eines autonomen

Fahrzeugs

__________________________________________________________________________________________

Vom Fahrzeug zum Leitrechner werden momentan nur 2 Frames gesendet:

Der Fahrzeugstatus ist in einer 32 – Bit – Variablen abgelegt. Der Wert muß in vier Bytes

zerlegt und an den Leitrechner gesendet werden.

Aktuelle Wegnummer an LR

Dieser Frame sendet den aktuell bearbeiteten Weg zum Leitrechner zurück, um eine

Fahrzeugverfolgung am Bildschirm zu ermöglichen.

Die Zeichen für Framebeginn, Frameende, Befehl Lebenszeichen und die

Quittierungszeichen, stammen aus dem ASCII – Code und sind zur Steuerung der

Datenübertragung reserviert (siehe [5] S. 130). Die Zeichen für die restlichen Befehle sind

ebenfalls ASCII – Zeichen und haben keinen üblichen Standard, sondern sind eine

Eigenkreation. Alle Framezeichen können im Definitionsteil des Fahrzeugprogramms

jederzeit geändert werden, müssen dann aber gleichzeitig im Leitrechnerprogramm angepasst

werden.

Die Framezeichen sind folgendermaßen aufgeschlüsselt:

Zeichen DEZ HEX Bezeichnung

ACK 6 06 Positive Rückmeldung

BSTART (s) 115 73 Befehl START

BSTOP (h) 104 68 Befehl STOP

BVW (V) 86 56 Befehl Verfahrweg kommt

ENQ 5 05 Stationsanforderung

ETB 23 17 Ende des Übertragungsblocks

NAK 21 15 Negative Rückmeldung

SOH 1 01 Kopfzeilenbeginn

STATUS (S) 83 53 Befehl Status kommt

WE (W) 87 57 Befehl aktuelle Wegnummer kommt

_________________________________________________________________________________

Fachhochschule Mannheim Seite 44

Hochschule für Technik und Gestaltung


Aufbau und Inbetriebnahme eines Steuerungssystems zur Navigation und Beobachtung eines autonomen

Fahrzeugs

__________________________________________________________________________________________

5. Software

Nach der Beschreibung der Hardware und der Funktion des Fahrzeugs und der Leitrechner

Demo wird in diesem Kapitel die nötige Software vorgestellt. Auf eine detaillierte

Darstellung der mitgelieferten Routinen für die D/A- bzw. A/D – Wandler des

Fahrzeugsteuerrechners, wird hier nicht eingegangen. Alle selbst entwickelten Routinen sind

in diesem Kapitel beschrieben und dargestellt.

Eine komplette Auflistung der verwendeten Programmroutinen für das Fahrzeug ist im

Kapitel 7.1 ab S. 100 und für die Leitrechner Demo im Kapitel 7.2 ab S. 122 zu finden.

5.1 Fahrzeugsoftware

Der Fahrzeugsteuerrechner enthält als Betriebssystem XDOS, das kompatibel zum MS – DOS

3.3 ist. Aus diesem Grund wird die Software in C++ für DOS geschrieben. Als

Entwicklungsumgebung wird das vom Rechnerhersteller, auf einer CD – ROM mitgelieferte

Borland C++ Version 4.52 verwendet. Die nötigen Bibliotheken und Routinen zum Ansteuern

des Multi I/O – Boards sind ebenfalls auf dieser CD enthalten.

Die Entwicklungsumgebung ist auf einem Windows NT Rechner nicht zum Laufen gebracht

worden, deshalb wurde die Programmierung auf einem Laptop mit dem Betriebssystem

Windows 95 vorgenommen.

Ein in C geschriebenes Programm muß Compiliert und als EXE File in den Fahrzeugrechner,

über das HTP eingespielt werden (genaue Beschreibung [2] ab S. 4 – 6 und S. 20). Dadurch

ist ein Debugging der Software am Fahrzeugrechner so gut wie unmöglich. Das macht eine

Fehlersuche im Programm relativ schwierig. Die Programmteile, die mit der Regelung bzw.

den A/D- und D/A – Wandlern zusammenhängen sind auf dem normalen PC, der fürdie

Programmierung benutzt wird, nicht lauffähig, da die Hardwarevoraussetzungen fehlen.

Deshalb können diese Programmteile auch nicht auf einem normalen PC getestet werden. Um

die Regelung des Fahrzeugs einzustellen, ist es notwendig, nach Änderung eines

Reglerparameters den EXE File neu zum Fahrzeugrechner zu senden. Da dies einen sehr

hohen Zeitaufwand bedeutet, ist es sinnvoll, die Regelung zur Grobeinstellung zu simulieren.

Dies wurde hier mit eienm Basicprogramm realisiert, unter der Annahme, daß die Strecke ein

PT1 Verhalten zeigt. Das Simulationsprogramm ist auf der Dokumentations – CD enthalten.

Die Einstellungen der Simulation waren relativ zufriedenstellend.

Die Programmteile die mit der Funkdatenübertragung zusammenhängen können extrahiert

und mit zwei normalen PC´s getestet werden, da die seriellen Schnittstellen des

Fahrzeugrechners voll PC – AT kompatibel sind.

_________________________________________________________________________________

Fachhochschule Mannheim Seite 45

Hochschule für Technik und Gestaltung


Aufbau und Inbetriebnahme eines Steuerungssystems zur Navigation und Beobachtung eines autonomen

Fahrzeugs

__________________________________________________________________________________________

5.1.1 Überblick

Das Betriebsprogramm des Fahrzeugs besteht im wesentlichen aus 4 Routinen und deren

Unterprogramme, die über Softwareschnittstellen (Flags und Variablen) miteinander

verbunden sind.

1.) main() (Hauptprogramm): Startet die Initialisierungsroutine und bildet eine

Endlosschleife, die zur zyklischen Abarbeitung der Unterprogramme dient.

2.) time_int (ISR Laufzeiten): Zählt im Interrupt Variablen hoch, die als Laufzeiten benötigt

werden.

3.) regler() (ISR Regelung): Timerinterruppt für die Drehzahlregelung und

Positionierungssteuerung des Fahrzeugs.

4.) irq4() (ISR Schnittstelle 1): Interruptroutine Datenempfang. Wertet die empfangenen

Daten aus und setzt entsprechend Flags zur Weiterverarbeitung.

5.1.2 main() (Hauptprogramm)

Im Hauptprogramm werden über eine Schleife zyklisch Unterprogramme aufgerufen. Dabei

werden die internen Schnittstellen abgefragt bzw. entsprechend gesetzt. Die Struktur des

Hauptprogramms und dessen Unterprogramme ist in Abb. 5.1.2.1 und deren

Schnittstellenbelegung in Abb. 5.1.2.2 dargestellt.

Abb. 5.1.2.1 Struktur des Hauptprogramms main()

Die Initialisierungsroutine wird 1 mal am Anfang

durchlaufen. Danach werden in einer Endlosschleife die

angehängten Unterprogramme zyklisch aufgerufen und

abgearbeitet. Alle hier gezeigten Routinen werden

nacheinander genau beschrieben.

_________________________________________________________________________________

Fachhochschule Mannheim Seite 46

Hochschule für Technik und Gestaltung


Aufbau und Inbetriebnahme eines Steuerungssystems zur Navigation und Beobachtung eines autonomen

Fahrzeugs

__________________________________________________________________________________________

Routine main()

Zugriff Flag1 Bits comflag Bits comflag1 Bits

schreibend

--- 0; 1; 9; 12

Variablen

0; 1; 13

empfzei; com1fz; anzsend; sendpuf[]; com1fz3; oldfunc; oldirq10;

oldportisr

Peripherie

Port (Hex) Bit Nr.

21 2; 4

A1 2

64 1; 2

lesend

Zugriff Flag1 Bits comflag Bits comflag1 Bits

--- 7; 8; 9; 13

Variablen

0; 1; 2

timer6; timer7; com1fz3

Peripherie

Port (Hex) Bit Nr.

--- ---

Abb. 5.1.2.2 Schnittstellenbelegung des Hauptprogramms

Das Hauptprogramm besteht im wesentlichen aus drei Teilen. Teil 1 ruft beim Programmstart

einmalig die Initialisierungsroutine auf, danach geht das Programm in die eigentliche

Bearbeitungsschleife. Diese Schleife kann durch einen Tastendruck verlassen werden, sofern

ein PC mit dem HTP an COM 2 (Console) angeschlossen ist.

// Hauptprogramm

int main(void)

{

init(); // Initialisierungsroutine aufrufen

while(!kbhit()) // Schleife solange keine Taste gedrückt wird

{

.

.

.

}

Im zweiten Teil (Hauptteil) werden zyklisch die wichtigen Bearbeitungsroutinen aufgerufen,

die für den normalen Betrieb benötigt werden.

_________________________________________________________________________________

Fachhochschule Mannheim Seite 47

Hochschule für Technik und Gestaltung


Aufbau und Inbetriebnahme eines Steuerungssystems zur Navigation und Beobachtung eines autonomen

Fahrzeugs

__________________________________________________________________________________________

{

fahren(); //Zyklischer Aufruf des Unterprg. "fahren"

blinker(); //Zyklischer Aufruf des Unterprg. "blinker"

taste_lampe(); //Zyklischer Aufruf des Unterprg. "taste_lampe"

senden(&comflag,anzsend,sendpuf,&sendpufzeig); //Senderoutine zyklisch aufr.

senden1(); //zweite Senderoutine zyklisch aufrufen

Für den Datenempfang müssen noch Statusbits abgefragt werden, um in bestimmte Routinen

zu verzweigen. So darf z.B. die Datenkontrollroutine nur ablaufen, wenn alle Daten vom LR

komplett empfangen sind.

//Abfragen bei Datenempfang

if(comflag&0x100) kontroll(); //Wenn Daten von LR komplett empf.

Erkennen die Funkmodems einen Fehler im CRC – Check, so wird das empfangene Byte

nicht zum Rechner übertragen. Ein fehlendes Byte führt dazu, daß der Datenempfang nicht zu

Ende geführt wird. Um dies zu erkennen, läuft eine Überwachungszeit (ca. 1s) im

Hintergrund, die länger ist als der längste zu übertragende Datenblock dauert. Ist ein Fehler

dadurch erkannt, muß ein NAK zum LR gesendet werden um die Daten nochmals zu

bekommen. Die Überwachungszeit ist in der Definition LFZCOM1 abgelegt und dieser Wert

muß mit 55ms multipliziert werden, um die Zeit in s zu erhalten.

if((comflag&0x80) && (timer6 >=LFZCOM1)) //wenn Überwachungszeit abgelaufen

{ //und Datenempfang nicht komplett abgeschlossen ist...

comflag=comflag&0x03; //alle Schrittflags löschen

comflag=comflag|0x200; //Flag LFZ gekommen setzen

empfzei=0; //Zeiger f. Empfangspuffer zurücksetzen

com1fz=0; //Fehlerzähler1 zurücksetzen

}

if(comflag&0x200) //Wenn LFZ Flag gesetzt ist...

{ //NAK an LR senden

anzsend=1; //Anzahl der zu sendenden Bytes festlegen

sendpuf[1]=NAK; //NAK in Sendepuffer schreiben

comflag=comflag|0x01; //und über Modem senden

comflag=comflag|0x1000; //Rückmeldung nach Datenempfang läuft

comflag=comflag&~0x200; //und LFZ Flag zurücksetzen

}

Sind die vom LR gesendeten Daten richtig empfangen worden, wird ein Datenfilter

aufgerufen, der die empfangenen Daten entsprechend umrechnet und in die richtigen

Variablen legt bzw. entsprechende Flags setzt oder löscht.

_________________________________________________________________________________

Fachhochschule Mannheim Seite 48

Hochschule für Technik und Gestaltung


Aufbau und Inbetriebnahme eines Steuerungssystems zur Navigation und Beobachtung eines autonomen

Fahrzeugs

__________________________________________________________________________________________

if(comflag1&0x04) //wenn Empfangene Daten ohne Fehler

{

datfilt(); //dann Datenfilter und Sortierroutine aufrufen

}

Nachdem Daten zum LR gesendet wurden, wird eine Rückmeldung vom LR erwartet. Sendet

der LR keine Rückmeldung nach einer Überwachungszeit oder ein NAK, dannwerdendieim

Sendepuffer stehenden Daten nochmal zu LR geschickt. Ist nach dem zehnten Sendeversuch

immer noch kein ACK gekommen, wird ein Fehlerflag gesetzt und die Sendeversuche zum

LR werden so lange eingestellt, bis ein gültiger Datensatz vom LR zum Fahrzeug gesendet

wird. Die Überwachungszeit fürdieRückmeldung dauert ca. 4s und ist in der Definition

LFZCOM1_RM abgelegt.

//Abfragen nach senden der Daten

if((comflag&0x2000) && (timer7 >= LFZCOM1_RM) && (comflag1&0x02)==0)

//Wenn nach Überwachungszeit keine

{ //Rückmeldung kommt oder

comflag1=comflag1|0x01; //Flag NAK gek. setzen

com1fz3 ++; //Sendeversuchszähler erhöhen

if(com1fz3>=NAKMAX) //sind maximale Sendeversuche erreicht dann...

{

comflag1=comflag1|0x02; //Flag kein ACK nach NAKMAX-Versuchen setzen

comflag1=comflag1&~0x01; //Flag NAK gekommen löschen

com1fz3=0; //Sendeversuchszähler löschen

comflag=comflag&~0x2000; //Flag warten auf Rückmeldung löschen

}

}

if(comflag1&0x01) //wenn flag NAK gekommen da...

{

comflag1=comflag1&~0x01; //Flag NAK gekommen löschen

comflag=comflag&~0x2000; //Flag warten auf Rückmeldung löschen

comflag=comflag|0x01; //Daten nochmal senden

}

Der dritte Teil des Hauptprogramms ist fürdasRücksetzen der Interrupt Zeiger auf das

Betriebssystem und das Löschen der Pulsfreigaben des Antriebs, um dann wieder in XDOS

zurückzukehren.

_dos_setvect(28,oldfunc); //geklauten IRQ-Vektor an System zurückgeben

//Systemtimer (Softwareinterrupt)

disable(); //Interrupts sperren

setvect(IRQ10,oldirq10); //IRQ-Vektor von Timer1 an System zurückgeben (386EX)

setvect(VEK1,oldportisr); //alten Vektor von IRQ4 zur ckgeben

outportb(0x21,inportb(0x21)|SPERR1); //IRQ4 sperren

outportb(0xA1,inportb(0xA1) | 0x04 ); //IRQ10 in PIC2 sperren Counter1

_________________________________________________________________________________

Fachhochschule Mannheim Seite 49

Hochschule für Technik und Gestaltung


Aufbau und Inbetriebnahme eines Steuerungssystems zur Navigation und Beobachtung eines autonomen

Fahrzeugs

__________________________________________________________________________________________

outportb(0x21,inportb(0x21) | 0x04 ); //IRQ2 sperren d.h. PIC2 IRQ sperren

enable(); //Interrupts freigeben

outportb(PORT_E,inport(PORT_E)|0x04); //Hardwarezaehler Pulscoder freigeben

outportb(PORT_E,inportb(PORT_E)&~ 0x03);//Pulsfreigaben Antrieb wegnehmen

return 0; //Rücksprung zum DOS

}

5.1.2.1 init() (Initialisierungsroutine)

In der Initialisierungsroutine werden die Hard – und Softwarekomponenten die fürden

Betrieb des Fahrzeugs wichtig sind, entsprechend eingestellt. Die Schnittstellenbelegung ist in

Abb. 5.1.2.1.1 dargestellt.

Routine init()

Zugriff Flag1 Bits comflag Bits comflag1 Bits

schreibend alle ---

Variablen

--zeichen;

a1; b1; a2; b2; a3; b3; flag1; oldfunc; oldirq10

Peripherie

Port (Hex) Bit Nr.

21 2; 4

A1 2

65 0; 1; 4; 7

3F9 alle

3FB alle

3FC alle

F041 alle

F043 4; 5; 6

F834 2; 3

lesend

Zugriff flag1 Bits comflag Bits comflag1 Bits

--- ---

Variablen

---

Peripherie

---

Port (Hex) Bit Nr.

3F8 alle

3FA alle

3FE alle

Abb. 5.1.2.1.1 Schnittstellenbelegung der Routine init()

_________________________________________________________________________________

Fachhochschule Mannheim Seite 50

Hochschule für Technik und Gestaltung


Aufbau und Inbetriebnahme eines Steuerungssystems zur Navigation und Beobachtung eines autonomen

Fahrzeugs

__________________________________________________________________________________________

Als erstes wird in dieser Routine der Zeiger des Systemtimer – Interrupts auf die ISR

time_int() gestellt, mit der die internen Laufzeiten erzeugt werden. Die lokale Variable

zeichen wird zum Leerlesen von COM – Schnittstellenregistern benötigt.

void init() //Initialisierungsroutine

{

unsigned char zeichen; //Dummy zum leerlesen von Registern

oldfunc=_dos_getvect(28); //IRQ-Vektor von Echtzeituhr zwischenspeichern

_dos_setvect(28,time_int); //IRQ-Vektor auf Timer-Routine stellen

Der Prozessortimer 1 wird in dieser Software als Timer für die Abtastregelung benutzt. Dazu

wird dieser freigeschaltet und an den internen Taktgeber, der eine Frequenz von 1,19 MHz hat

gelegt. Danach wird der Teilerwert in den Timer geschrieben, der eine Ausgangsfrequenz von

200 Hz an diesem ergibt. Dies entspricht einem zeitlichen Interrupt von 5ms fürdie

Abtastregelung(sieheauch[1]Kap.10abS.10-2).

outportb(TMRCFG,inportb(TMRCFG) & 0xF7); //Gate1 an Vcc legen (immer frei)

outportb(TMRCFG,inportb(TMRCFG) | 0x04); //CLKIN1 an TMRCLK1 (1.19 MHz)

outportb(TMRCON,0x70); //r/w LSB -> MSB,Mode0,counter1

outportb(TMR1, 0x3E); // LSB als Zaehlwert schreiben

outportb(TMR1, 0x17); // MSB als Zaehlwert schreiben

//Gesamtteiler 173Eh=5950d=1.19MHz/5950=200Hz

//200Hz = 5ms Abtastzeit der Regelung

Um die Timer – Interrupts freizugeben, müssen alle Interrupts erst gesperrt werden, um

Überschneidungen vorzubeugen. Danach wird der IRQ – Vector vom IRQ 10, den der

Prozessortimer 1 auslöst, auf die ISR – Regler gestellt. Der Interrupt benutzt PIC 2 des

Prozessors, also werden zuerst die Interrupts von PIC 2 an PIC 1 aktiviert, dann der IRQ 10

von PIC 2.

disable(); //Interrupts sperren

oldirq10=getvect(IRQ10); //IRQ-Vektor zwischenspeichern

setvect(IRQ10,regler); //neuen IRQ-Vektor auf ISR-Regler stellen

outportb(0x21,inportb(0x21)&~0x04); //IRQ2 freigeben d.h. PIC2 IRQ zulassen

outportb(0xA1,inportb(0xA1)&~0x04); //IRQ10 in PIC2 freigeben Counter1

Der nächste Schritt ist die Einstellung der RS – 232 – Schnittstelle COM1. Der

Schnittstellenbaustein in der CPU ist mit dem 16450 kompatibel, der in den meisten PC´s

angewendet wird. Hier wird die Schnittstelle direkt über die Register des Bausteins

parametriert(sieheauch[1]Kap.11abS.11-1).Für die Kommunikation mit dem

Funkmodem werden zuerst die Übertragungsparameter programmiert. Dazu wird eine

Baudrate von 9600 Baud, 8 Datenbit, 1 Stoppbit und keine Parität eingestellt. Um keine

_________________________________________________________________________________

Fachhochschule Mannheim Seite 51

Hochschule für Technik und Gestaltung


Aufbau und Inbetriebnahme eines Steuerungssystems zur Navigation und Beobachtung eines autonomen

Fahrzeugs

__________________________________________________________________________________________

unerwünschten Interruptauslösungen zu bekommen, muß der Eingangspuffer und das

Anzeigeregister noch „leergelesen“ werden. Der Schnittstellenbaustein wird nun noch auf

eine Interruptauslösung bei Änderung des Empfangspuffers eingestellt. Der Interruptvektor

desIRQ4wirdaufdieISRirq4() gestellt und am PIC1 freigeschaltet. Da die Kommunikation

mit dem Funkmodem über Hardwarehandshake läuft, muß noch das RTS – Signal gelöscht

und das Modemstatusregister „leergelesen“ werden.

outportb(X1+3,0x80); //Zugriff auf Baudratengenerator erlauben DLAB=1

outportb(X1+1,0);outportb(X1+0,12); //Baudrate 9600 einstellen

outportb(X1+3,0x03); //8,1,no einstellen und DLAB=0

zeichen=inportb(X1+0); //Eingangspuffer leeren

outportb(X1+1,0x01); //Interruptauslösung für Empfangsdaten setzen

outportb(X1+4,0x08); //Interrupt freigeben

zeichen=inportb(X1+2); //Anzeigeregister leerlesen

oldportisr=getvect(VEK1); //alten IRQ4 Vektor sichern

setvect(VEK1,irq4); //IRQ4 Vektor auf irq4 Routine stellen

outportb(0x21,inportb(0x21)&FREI1); //PIC freigeben

outportb(X1+4,inportb(X1+4)&~0x02);//RTS löschen

zeichen= inportb(X1+6); //Modemstatusreg löschen

Jetzt können die Interrupts wieder freigegeben werden. Die digitalen Ein- bzw. Ausgänge

müssen nun entsprechend ihrer Funktion mit dem Konfigurationsregister parametriert werden

(siehe auch [2] ab S. 8). Zuletzt werden noch die Konstanten aus den Reglerparametern

errechnet und auf Variablen zugewiesen, damit dies nicht bei jedem Regleraufruf geschieht.

enable(); //Interrupts wieder freigeben

outportb(0x65,inportb(0x65)|0x90); //Port E als Ausgänge setzen

outportb(0x65,inportb(0x65)&~0x01); //Port A als Eingänge setzen

outportb(0x65,inportb(0x65)|0x02); //Port B als Ausgänge setzen

a1=A1; //Konstanten für Stellungsalgorithmus ber.

b1=B1; // "

a2=A2; // "

b2=B2; // "

a3=A3; // "

b3=B3; // "

}

_________________________________________________________________________________

Fachhochschule Mannheim Seite 52

Hochschule für Technik und Gestaltung


Aufbau und Inbetriebnahme eines Steuerungssystems zur Navigation und Beobachtung eines autonomen

Fahrzeugs

__________________________________________________________________________________________

5.1.2.2 fahren() (Unterprogramm Wege abfahren)

Die Struktur dieses Unterprogramms ist in Abb. 5.1.2.1 S. 46 und die Schnittstellenbelegung

in Abb. 5.1.2.2.1 dargestellt.

Routine fahren()

Zugriff flag1 Bits comflag Bits comflag1 Bits

schreibend 0; 1; 2; 3; 4; 5; 6; 7; 8; 11 ---

Variablen

3

fwzeig; sollwegp; weg1; weg2; timer1; timer2

Peripherie

Port (Hex) Bit Nr.

64 0; 1; 4; 5

lesend

Zugriff flag1 Bits comflag Bits comflag1 Bits

0; 1; 2; 7 ---

Variablen

--weganz;

fwzeig; weginfo[]; entf1; entf2; timer1; timer2

Peripherie

Port (Hex) Bit Nr.

--- ---

Abb. 5.1.2.2.1 Schnittstellenbelegung der Routine fahren()

Diese Routine besteht aus drei Teilen. Im ersten Teil wird geprüft,obeinFahrauftragläuft. Ist

dies nicht der Fall, wird diese Routine umsprungen. Läuft gerade eine Park- bzw.

Referenzfahrt, so wird die entsprechende Routine aufgerufen, und der Rest ignoriert.

void fahren(void)

{

if(flag1 & 0x01) //Startflag gesetzt? wenn nein -> Ende

{ //Wenn ja ->

if(flag1&0x80) //wenn Parkfahrt läuft dann Routine Parkfahrt

{

parkfahrt(); //aufrufen

}

Im zweiten Teil wird geprüft, ob eine Positionierung des Fahrzeugs im Gange ist. Ist dies der

Fall wird, solange der aktuell bearbeitete Weg noch nicht fertig gefahren ist, auf Teil 3

verzweigt. Ist der aktuelle Weg fertig gefahren, wird der Fahrwegzeiger des

Fahrauftragsspeichers erhöht und je nach den Wegoptionen, die neuen Einstellungen fürdas

Fahrzeug, über Flags bzw. direkt über die Peripherie eingestellt.

_________________________________________________________________________________

Fachhochschule Mannheim Seite 53

Hochschule für Technik und Gestaltung


Aufbau und Inbetriebnahme eines Steuerungssystems zur Navigation und Beobachtung eines autonomen

Fahrzeugs

__________________________________________________________________________________________

Sind alle Wege des Fahrauftrags abgearbeitet, wird der Fahrwegzeiger zurückgestellt und das

Flag, das anzeigt ob der Fahrauftrag läuft, zurückgesetzt.

else //ansonsten

{

if(flag1 & 0x02) //Positionierung fertig ? wenn nein -> *

{ //Wenn ja ->

if(weganz != fwzeig) //Alle Wege abgefahren ? Wenn ja **

{

fwzeig ++; //Wenn nein -> Fahrwegzeiger +1

comflag1=comflag1|0x08; //Flag Wegnummer senden setzen

outportb(PORT_E,inportb(PORT_E)&~0x30); //Beide Räder auf Vorwärtsfahrt

if(weginfo[fwzeig] & 0x01) //Rückwärtsfahrt angefordert ?

{ //Wenn ja ->

outportb(PORT_E,inportb(PORT_E)|0x30); //Beide Räder auf Rückwärtsf.

}

if(weginfo[fwzeig] & 0x02) //Drehung rechts angefordert ?

{ //Wenn ja ->

outportb(PORT_E,inportb(PORT_E)|0x10); //Rad rechts auf Rückwärtsf.

}

if(weginfo[fwzeig] & 0x04) //Drehung links angefordert ?

{ //Wenn ja ->

outportb(PORT_E,inportb(PORT_E)|0x20); //Rad links auf Rückwärtsf.

}

if(weginfo[fwzeig] & 0x80) //Parkfahrt angefordert

{

flag1=flag1|0x80; //Flag "Parkfahrt" setzen

flag1=flag1|0x800; //Flag "Fahrt auf Platte1" setzen

flag1=flag1|0x100; //Flag "Sonarpositionierung" setzen

}

outportb(PORT_E,inportb(PORT_E)|0x03); //Pulsfreigaben setzen

flag1=flag1&~0x18; //Positionierflags rückwärts löschen (redundant)

sollwegp=fahrweg[fwzeig]; //Sollweg an Regler übergeben

weg1=0; //Wegzähler nullen(redundant)

weg2=0; // " " "

flag1=flag1&~0x60; //Räder positioniert Flags löschen !!!

flag1=flag1 &~0x02; //Weg fertig Flag löschen

}

else

{

flag1=flag1 &~0x01; //** Startflag zurücksetzen -> alle Wege

//abgefahren

fwzeig=0; //Fahrwegzeiger löschen

}

}

Der dritte Teil ist für die Kollisionsüberwachung des Fahrzeugs vorhanden. Dazu wird das

Weginfo – Byte des aktuellen Fahrwegs kontrolliert, ob die Option Vorwärtsfahrt vorhanden

ist. Ist dies der Fall wird die Kollisionsüberwachung aktiviert. Dafür werden beide

Analogwerte der Ultraschallsensoren abgefragt und wenn ein Analogwert 800 (entspricht

40cm) unterschreitet, werden nach einer Glättungszeit von ca. 55ms die Pulsfreigaben der

Antriebe abgeschaltet. Ist das Hindernis aus dem Auslösebereich, werden nach einer

Wiederanlaufzeit von ca. 1,6s die Pulsfreigaben für den Antrieb wieder gesetzt.

_________________________________________________________________________________

Fachhochschule Mannheim Seite 54

Hochschule für Technik und Gestaltung


Aufbau und Inbetriebnahme eines Steuerungssystems zur Navigation und Beobachtung eines autonomen

Fahrzeugs

__________________________________________________________________________________________

Der Wert fürdieGlättungszeit steht in der Definition LFZ1 und der Wert fürdie

Wiederanlaufverzögerung in der Definition LFZ2.

else

{

if(weginfo[fwzeig]==0) //Wenn Vorwärtsfahrt läuft dann Kollisions-

{ //überwachung durchlaufen

if((entf1 LFZ2) //nach Ablauf der Wiederanlaufzeit

{ //Pulsfreigaben setzen und Flag Objekt

outportb(PORT_E,inportb(PORT_E)|0x03); //in Erfassungsber.

flag1=flag1 &~0x04; //registriert zurücksetzen

}

}

}

}

}

_________________________________________________________________________________

Fachhochschule Mannheim Seite 55

Hochschule für Technik und Gestaltung


Aufbau und Inbetriebnahme eines Steuerungssystems zur Navigation und Beobachtung eines autonomen

Fahrzeugs

__________________________________________________________________________________________

5.1.2.3 parkfahrt() (Unterprogramm Park- bzw. Referenzfahrt)

Dieses Unterprogramm ruft zu den richtigen Zeitpunkten die für die Park- bzw. Referenzfahrt

nötigen Unterroutinen auf. Die Struktur ist in Abb. 5.1.2.1 S. 46 und die

Schnittstellenbelegung in Abb. 5.1.2.3.1 dargestellt.

Routine parkfahrt()

Zugriff flag1 Bits comflag Bits comflag1 Bits

schreibend 13

fzaehl

---

Variablen

Peripherie

---

Port (Hex) Bit Nr.

--- ---

lesend

Zugriff flag1 Bits comflag Bits comflag1 Bits

8; 9; 10; 11 ---

Variablen

---

Peripherie

---

Port (Hex) Bit Nr.

--- ---

Abb. 5.1.2.3.1 Schnittstellenbelegung der Routine parkfahrt()

Entsprechend den Anforderungsflags werden die Unterroutinen zur Parkfahrt abgearbeitet. Ist

die Parkfahrt beendet, wird das dafür vorgesehene Flag gesetzt.

//Unterprg. Parkfahrt ausführen

void parkfahrt(void)

{

if(flag1&0x400) //90 Grad Drehung rechts angrfordert ??

{

drehung(); //wenn ja -> Unterprg. "drehung" aufrufen

}

if(flag1&0x200) //soll Fahrzeug winkelig ausgerichtet werden ??

{

winkel(); //wenn ja -> Unterprg. "winkel" aufrufen

}

if(flag1&0x100) //soll Positionierung mit Sonar erfolgen ??

{

sonarpos(); //wenn ja -> Unterprg. "sonarpos" aufrufen

}

if((flag1&0x800)==0&&(flag1&0x1000)==0) //Parkfahrt in Andokstation fertig ??

{

_________________________________________________________________________________

Fachhochschule Mannheim Seite 56

Hochschule für Technik und Gestaltung


Aufbau und Inbetriebnahme eines Steuerungssystems zur Navigation und Beobachtung eines autonomen

Fahrzeugs

__________________________________________________________________________________________

}

flag1=flag1|0x2000; //wenn ja -> Flag "Parkfahrt beendet" setzen und

fzaehl=0; //Fahrtenzähler f. Sonarpos. löschen

}

5.1.2.4 sonarpos() (Unterprogramm Positionierung mit Ultraschallsensoren)

Für die Park- bzw. Referenzfahrt werden drei Routinen benutzt die folgendermaßen

hintereinander ablaufen müssen:

1.) Positionierung auf Abstand zur Platte 1 (sonarpos())

2.) ausrichten des Fahrzeugs parallel zur Platte 1 (winkel())

3.) nochmaliges positionieren auf Abstand zur Platte 1 (sonarpos())

4.) Drehung des Fahrzeugs um 90° nach rechts, zur Platte 2 (drehung())

5.) Positionierung auf Abstand zur Platte 2 (sonarpos())

6.) ausrichten des Fahrzeugs parallel zur Platte 2 (winkel())

7.) nochmaliges positionieren auf Abstand zur Platte 2 (sonarpos())

8.) Drehung des Fahrzeugs um 90° nach rechts, zur Startposition von der Andokstation

(drehung())

Daraus läßt sich erkennen, daß die Routine sonarpos() vier mal und die restlichen Routinen

zwei mal aufgerufen werden müssen.

Die Schnittstellenbelegung der Routine sonarpos() ist in Abb. 5.1.2.4.1 wiedergegeben.

Routine sonarpos()

Zugriff flag1 Bits comflag Bits comflag1 Bits

schreibend 1; 3; 4; 5; 6; 8; 9; 10 ---

Variablen

--yp;

fzaehl; weg1; weg2; sollwegp

Peripherie

Port (Hex) Bit Nr.

64 0; 1; 4; 5

lesend

Zugriff flag1 Bits comflag Bits comflag1 Bits

--entf2;

fzaehl

---

Variablen

Peripherie

---

Port (Hex) Bit Nr.

--- ---

Abb. 5.1.2.4.1 Schnittstellenbelegung der Routine sonarpos()

_________________________________________________________________________________

Fachhochschule Mannheim Seite 57

Hochschule für Technik und Gestaltung


Aufbau und Inbetriebnahme eines Steuerungssystems zur Navigation und Beobachtung eines autonomen

Fahrzeugs

__________________________________________________________________________________________

Für die Positionierung auf die Platten wird nur ein Ultraschallsensor verwendet. Im ersten

Teil der Routine wird solange auf die Platte zugefahren bis der vordefinierte Entfernungswert

von 600, dies entspricht 30cm (in Definition ABST) erreicht wird. Hierbei wird als

Positioniergeschwindigkeit ein fester Wert vorgegeben (in Definition POSDRZ).

//Unterprg. Positionierung mit Sonarbero

void sonarpos (void)

{

if(entf2 > ABST) //Abstand von Platte zu gross ??

{

outportb(PORT_E,inportb(PORT_E)&~0x30); //Beide Räder vorwärtsfahrt

yp=POSDRZ; //DRZ = Schleichgang

outportb(PORT_E,inportb(PORT_E)|0x03); //Pulsfreigaben setzen

}

if(entf2 < ABST) //Abstand von Platte zu klein ??

{

outportb(PORT_E,inportb(PORT_E)|0x30); //Beide Räder rückwärts

yp=POSDRZ; //DRZ = Schleichgang

outportb(PORT_E,inportb(PORT_E)|0x03); //Pulsfreigaben setzen

}

Ist der Abstand von der Platte richtig, wird ein Fahrtenzähler erhöht, der angibt welche

Positionierfahrt ausgeführt wurde. Es werden bei einer Parkfahrt vier Positionierfahrten

ausgeführt. Aus der Nummer der Positionierfahrt kann der nächste Schritt eingeleitet werden.

Nach Fahrt 1 oder 3, muß der nächste Schritt ein Ausrichten des Fahrzeugs parallel zur Platte

sein, nach Positionierfahrt 2 oder 4 muß der nächste Schritt eine Rechtsdrehung um 90° sein.

Die entsprechenden Flags und Ausgänge werden gesetzt.

if (entf2 == ABST)

{

//Abstand von Platte ok ??

outportb(PORT_E,inportb(PORT_E)&~0x33); //Pulsfr. löschen u. beide Räder vorw.

yp=0; //DRZ Sollwert löschen

fzaehl++; //Fahrzähler um 1 erhöhen

if((fzaehl==1)||(fzaehl==3))

{

//nächster Schritt Winkel ausrichten ??

flag1=flag1|0x200; //wenn ja -> Flag "Winkel ausrichten"

flag1=flag1&~0x100;

}

//setzen u.Flag "Sonarpos." löschen

if((fzaehl==2)||(fzaehl==4))

{

//nächster Schritt Drehung um 90 grad ??

flag1=flag1&~0x100; //wenn ja -> Flag "Sonarpos." löschen

flag1=flag1|0x400; //Flag "90 grad Drehung" setzen

outportb(PORT_E,inportb(PORT_E)|0x03); //Pulsfreigaben setzen

flag1=flag1&~0x18; //Pos. Flags "rückwärts" löschen

outportb(PORT_E,inportb(PORT_E)|0x10); //Rad rechts rücklauf

outportb(PORT_E,inportb(PORT_E)&~0x20); //Rad links vorlauf

weg1=0; //Wegzähler löschen

weg2=0; // " "

flag1=flag1&~0x60; //Räder pos. Flags löschen

_________________________________________________________________________________

Fachhochschule Mannheim Seite 58

Hochschule für Technik und Gestaltung


Aufbau und Inbetriebnahme eines Steuerungssystems zur Navigation und Beobachtung eines autonomen

Fahrzeugs

__________________________________________________________________________________________

sollwegp=WI90; //Sollweg = 90 grad

flag1=flag1&~0x02; //Flag "weg fertig" löschen

}

}

}

5.1.2.5 winkel() (Unterprogramm Fahrzeug parallel auf Platte ausrichten)

Nach der Positionierung auf eine Platte, wird das Fahrzeug parallel auf diese ausgerichtet. Die

Schnittstellenbelegung dieser Ausrichtroutine ist in Abb. 5.1.2.5.1 wiedergegeben.

Routine winkel()

Zugriff flag1 Bits comflag Bits comflag1 Bits

schreibend 8; 9

Yp

---

Variablen

Peripherie

---

Port (Hex) Bit Nr.

64 0; 1; 4; 5

lesend

Zugriff flag1 Bits comflag Bits comflag1 Bits

--entf1;

entf2

---

Variablen

Peripherie

---

Port (Hex) Bit Nr.

--- ---

Abb. 5.1.2.5.1 Schnittstellenbelegung der Routine winkel()

Das Ausrichten wird unabhängig vom Abstand zur Platte mit beiden Ultraschallsensoren

ausgeführt. Das Fahrzeug wird solange gedreht, bis beide Sensoren den gleichen

Spannungswert liefern. Dann werden die Pulsfreigaben des Antriebs zurückgesetzt und das

Flag zur Nachpositionierung gesetzt.

//Unterprg. Fahrzeug parallel auf Platten ausrichten

void winkel (void)

{

if(entf2 < entf1)

{

outportb(PORT_E,inportb(PORT_E)&~0x10); //Rad re. vorwärts

outportb(PORT_E,inportb(PORT_E)|0x20); //Rad li. rückwärts

yp=POSDRZ; //DRZ = Schleichdrehzahl

_________________________________________________________________________________

Fachhochschule Mannheim Seite 59

Hochschule für Technik und Gestaltung


Aufbau und Inbetriebnahme eines Steuerungssystems zur Navigation und Beobachtung eines autonomen

Fahrzeugs

__________________________________________________________________________________________

outportb(PORT_E,inportb(PORT_E)|0x03); //Pulsfreigaben setzen

}

if(entf2 > entf1)

{

outportb(PORT_E,inportb(PORT_E)|0x10); //Rad re. rückwärts

outportb(PORT_E,inportb(PORT_E)&~0x20); //Rad li. Vorwärts

yp=POSDRZ; //DRZ = Schleichdrehzahl

outportb(PORT_E,inportb(PORT_E)|0x03); //Pulsfreigaben setzen

}

if(entf2 == entf1)

{

yp=0;

outportb(PORT_E,inportb(PORT_E)&~0x10); //Pulsfreigaben löschen

outportb(PORT_E,inportb(PORT_E)&~0x30); //Beide Räder vorwärts

flag1=flag1&~0x200; //Flag "auf Winkel ausrichten" löschen

flag1=flag1|0x100; //Flag "Sonarpos." setzen

}

}

5.1.2.6 drehung() (Unterprogramm 90° rechts Drehung)

Mit diesem Unterprogramm wird die Drehung zur Platte 2 bzw. zur neuen Startposition an

der Andokstation ausgeführt. Die Schnittstellenbelegung dieser Routine ist in Abb. 5.1.2.6.1

dargestellt.

Routine drehung()

Zugriff flag1 Bits comflag Bits comflag1 Bits

schreibend 8; 10; 11; 12 ---

Variablen

---

Peripherie

---

Port (Hex) Bit Nr.

--- ---

lesend

Zugriff flag1 Bits comflag Bits comflag1 Bits

1; 11 ---

Variablen

---

Peripherie

---

Port (Hex) Bit Nr.

--- ---

Abb. 5.1.2.6.1 Schnittstellenbelegung der Routine drehung()

Ist die vorherige Positionierung abgelaufen und läuft gerade noch die Fahrt auf Platte 1, dann

ist der nächste Schritt die Positionierung auf die Platte 2, ansonsten ist die Parkfahrt beendet,

_________________________________________________________________________________

Fachhochschule Mannheim Seite 60

Hochschule für Technik und Gestaltung


Aufbau und Inbetriebnahme eines Steuerungssystems zur Navigation und Beobachtung eines autonomen

Fahrzeugs

__________________________________________________________________________________________

wenn die Drehung ausgeführt ist. Die nötigen Positionierungsdaten für die Drehung werden

von der Routine sonarpos() eingestellt. Die Parkfahrt ende Erkennung wird mit der Routine

parkfahrt() ausgewertet.

//Unterprg. Drehung um 90 grad

void drehung (void)

{

if(flag1&0x02) //Flag "Weg fertig" da ??

{ //wenn ja ->

if(flag1&0x800) //Flag "Fahrt auf Platte1" da ??

{ //wenn ja -> **

flag1=flag1&~0x800; //Flag "Fahrt auf Platte1" löschen

flag1=flag1|0x1000; //Flag "Fahrt auf Platte2" setzen

flag1=flag1|0x100; //Flag "Sonarposi." setzen

flag1=flag1&~0x400; //Flag "Drehung um 90 grad" löschen

}

else //wenn nein -> **

{

flag1=flag1&~0x400; //Flag "Drehung um 90 grad" löschen

flag1=flag1&~0x1000; //Flag "Fahrt auf Platte2" löschen

}

}

}

5.1.2.7 blinker() (Unterprogramm Blinkbit für LED erzeugen)

Diese Routine erzeugt zyklisch ein Blinkbit, das hier zur Ansteuerung einer LED benutzt

wird. Die Schnittstellenbelegung ist in Abb. 5.1.2.7.1 dargestellt.

Routine blinker()

Zugriff flag1 Bits comflag Bits comflag1 Bits

schreibend 14

timer3; timer4

---

Variablen

Peripherie

---

Port (Hex) Bit Nr.

--- ---

lesend

Zugriff flag1 Bits comflag Bits comflag1 Bits

--- --- ---

Variablen

timer3; timer4

Peripherie

Port (Hex) Bit Nr.

--- ---

Abb. 5.1.2.7.1 Schnittstellenbelegung der Routine blinker()

_________________________________________________________________________________

Fachhochschule Mannheim Seite 61

Hochschule für Technik und Gestaltung


Aufbau und Inbetriebnahme eines Steuerungssystems zur Navigation und Beobachtung eines autonomen

Fahrzeugs

__________________________________________________________________________________________

Die Blinkfrequenz wird über mitlaufende Zähler des Systemtimer – Interrupts gesteuert.

Damit wird ein Blinkflag (flag1 Bit 14) erzeugt. Die Zeit, solange das Bit High ist, steht in

der Definition BLZAN und muß mit 55ms multipliziert werden um den Wert in s zu

bekommen. Die Low Zeit des Bits ist in der Definition BLZAUS festgelegt.

//Unterroutine Blinkbit an/aus

void blinker (void)

{

if(timer3 < BLZAN) //Leuchtzeit kleiner Wert ??

{

flag1=flag1|0x4000; //dann Blinkflag setzen und Timer für

timer4=0; //Dunkelzeit löschen

}

if((timer4 < BLZAUS)&&(timer3>BLZAN)) //Leuchtzeit abgelaufen und Dunkelzeit

{ //noch aktiv ??

flag1=flag1&~0x4000; //dann Blinkflag löschen

}

if(timer4>BLZAUS) timer3=0; //Dunkelzeit abgelaufen ??

//dann Timer für Leuchtzeit löschen

}//** Timervariablen werden im Systemzeitinterrupt alle 55ms um 1 erhöht

5.1.2.8 taste_lampe() (Unterprogramm Bedienteil)

Mit dieser Routine wird das Bedienteil des Fahrzeugs versorgt. Die Schnittstellenbelegung ist

Abb. 5.1.2.8.1 zu entnehmen.

Routine taste_lampe()

Zugriff flag1 Bits comflag Bits comflag1 Bits

schreibend 0; 7; 13; 16; 17 ---

Variablen

---

Peripherie

---

Port (Hex) Bit Nr.

61 0

lesend

Zugriff flag1 Bits comflag Bits comflag1 Bits

0; 13; 14; 15; 16; 17 ---

Variablen

---

Peripherie

---

Port (Hex) Bit Nr.

60 0

Abb. 5.1.2.8.1 Schnittstellenbelegung der Routine taste_lampe()

_________________________________________________________________________________

Fachhochschule Mannheim Seite 62

Hochschule für Technik und Gestaltung


Aufbau und Inbetriebnahme eines Steuerungssystems zur Navigation und Beobachtung eines autonomen

Fahrzeugs

__________________________________________________________________________________________

Im ersten Teil wird die Taste des Bedienteils abgefragt. Diese ist zum Start des Fahrzeugs,

nach einer Parkfahrt von einer Andokstation vorhanden. Die Taste zeigt nur dann Wirkung,

wenn das Fahrzeug an der Ladestation steht, der Fahrauftrag noch nicht gestartet ist, eine

Parkfahrt voll beendet ist und kein Sammelfehler ansteht. Die Taste ist auch zum Löschen

von Fahrzeugfehlern gedacht, aber wegen Zeitmangel konnte keine Fehlerdiagnose

programmiert werden. Deshalb wird auch die rote Lampe des Bedienteils (Fehleranzeige)

nicht berücksichtigt.

//Unterprg. Start-/Resettaste und Status LED

void taste_lampe(void)

{

if((inportb(PORT_A)&0x01)&&(flag1&0x01)==0&&(flag1&0x2000)==0&&(flag1&0x8000)

==0) // Wenn Taste gedrückt u. Pos. nicht gestartet u. Parken beendet

{ //u. kein Sammelfehler -> dann

flag1=flag1|0x01; //Pos. starten v. Ladest.

}

Der zweite Fall berücksichtigt den Start von einer Andokstation, die nicht die Ladestation ist.

if((inportb(PORT_A)&0x01)&&(flag1&0x01)&&(flag1&0x2000)&&(flag1&0x8000)==0)

{ //wenn Taste gedr. u. pos. läuft u. parken beendet u. k. Fehl.

flag1=flag1&~0x2080; //Start von Andokst.

}

Der zweite Teil versorgt die grüne Lampe des Bedienteils. Diese ist während der Abarbeitung

eines Fahrauftrags dunkel und blinkt, wenn das Fahrzeug von einer Andokstation gestartet

werden kann. Die Versorgung der Taste und der Lampen kann mit normalen

Logikverknüpfungen erstellt werden. Mann muß dazu nur die Schnittstellenbits in der

Variable flag1 miteinander verknüpfen und diese wie im Beispiel, direkt als if – Klauseln

eingeben. Hier werden die Lampenausgänge nur dann angesteuert, wenn eine Änderung des

Blinkerbits stattgefunden hat (Wischer). Dies ist aber nicht unbedingt notwendig und deshalb

können die Lampenroutinen auch einfacher programmiert werden.

if(((flag1&0x4000)&&(flag1&0x2000))||((flag1&0x4000)&&(flag1&0x01)==0)||

(flag1&0x8000)) //wenn Blinkbi=1 u.park.beendet o.Blinkb.=1

{ //u.kein.Pos. o.Fehler

flag1=flag1|0x10000; //Lampe ansteuern

}

else //ansonsten

{

flag1=flag1&~0x10000; // Lampe n. ansteuern

}

if((flag1&0x10000)&&(flag1&0x20000)==0) //wenn Lampe anst. u.Lampe ein

{

outportb(PORT_B,inportb(PORT_B)|0x01); //Lampe grün ein

_________________________________________________________________________________

Fachhochschule Mannheim Seite 63

Hochschule für Technik und Gestaltung


Aufbau und Inbetriebnahme eines Steuerungssystems zur Navigation und Beobachtung eines autonomen

Fahrzeugs

__________________________________________________________________________________________

flag1=flag1|0x20000; //Lampe ein setzen

}

if((flag1&0x10000)==0&&(flag1&0x20000)) //wenn Lampe n.ansteuern u.

{ //Lampe ein dann

outportb(PORT_B,inportb(PORT_B)&~0x01);//Lampe grün abschalten

flag1=flag1&~0x20000; //Lampe ein zurücksetzen

}

}

5.1.2.9 senden() (Unterprogramm Daten an Funkmodem senden)

Diese Routine sendet Daten an das Funkmodem und steuert den Hardwarehandshake. Die

Schnittstellenbelegung ist in Abb. 5.1.2.9.1 zu sehen.

Routine senden()

Zugriff flag1 Bits comflag Bits comflag1 Bits

schreibend

--- 0; 1; 12; 13

Variablen

--timer5;

timer7; sendpufzeig; comflag

Peripherie

Port (Hex) Bit Nr.

3F8 alle

3FC 1

lesend

Zugriff flag1 Bits comflag Bits comflag1 Bits

--- 0; 1; 12

Variablen

--timer5;

anzsend; sendpufzeig; sendpuf[]; comflag

Peripherie

Port (Hex) Bit Nr.

3FD alle

3FE alle

Abb. 5.1.2.8.1 Schnittstellenbelegung der Routine senden()

Diese Routine ist ein parametrierbares Unterprogramm mit folgenden Parametern:

Eingangsparameter: int anz; int byte[]

Ein-/Ausgangsparameter: int *flag; int *zeiger

Beim Aufruf wird für anz die Anzahl der zu sendenden Bytes, für byte[] einArrayindemdie

zu übertragenden Daten stehen, für *flag ein Speicherbereich in dem die Flagbits abgelegt

sind und für *zeiger einen Zeiger der auf die entsprechenden Daten im Sendepuffer zeigt. Die

beim Aufruf der Routine zugewiesenen Variablen, sind in Abb. 5.1.2.8.1 zu sehen.

_________________________________________________________________________________

Fachhochschule Mannheim Seite 64

Hochschule für Technik und Gestaltung


Aufbau und Inbetriebnahme eines Steuerungssystems zur Navigation und Beobachtung eines autonomen

Fahrzeugs

__________________________________________________________________________________________

Zum senden von Daten werden im Array sendpuf[x] die Bytes abgelegt, die nacheinander

zum Funkmodem geschickt werden. Das erste Byte liegt in sendpuf[1],der Zeiger

sendpufzeig muß auf 0 stehen und die Anzahl der zu übertragenden Bytes wird in die

Variable anzsend eingetragen. Zum Starten des Sendevorgangs wird nun noch das Bit 0 von

der Variable comflag gesetzt.

Zu Beginn der Routine werden lokale Variablen definiert, die als Zwischenspeicher fürdas

Leitungsstatus- und Modemstatusregister dienen, da diese beim Auslesen gelöscht werden.

void senden(unsigned int *flag,int anz,int byte[],int *zeiger)

{

int einl=0; //Zwischenspeicher Modemstatus

int einl1=0; //Zwischenspeicher Leitungsstatus

einl1=inportb(X1+5); //Leitungsstatus einlesen

einl=inportb(X1+6); //Modemstatusreg. einlesen

Ist das Flag zum Daten senden da, wird als erstes die RTS – Leitung gesetzt um dem Modem

mitzuteilen, daß Daten zu diesem geschickt werden. Kommt ein CTS – Signal vom Modem

zurück und ist das Senderegister leer, wird der Sendepufferzeiger erhöht und das zu sendende

Byte in das Senderegister geschrieben. Dadurch wird die serielle Übertragung des Bytes

automatisch durchgeführt. Dieser Vorgang wiederholt sich, bis alle Daten aus dem

Sendepuffer an das Modem übertragen sind. Ist dies der Fall, wird das Flag zum senden der

Daten gelöscht und ein Flag welches anzeigt, daß alle Daten zum Modem übertragen sind

gesetzt. Der Zeiger für den Sendepuffer wird gelöscht und eine Laufzeit von ca. 0,5s wird

gestartet. Erst danach darf die RTS – Leitung zurückgesetzt werden. Setzt man dieses Signal

zu früh zurück, werden nicht alle Bytes aus dem internen Datenpuffer des sendenden

Modems, an das empfangende Modem gesendet. Die Verzögerungszeit ist experimentell

ermittelt und findet in der technischen Dokumentation der Funkmodems keine

Berücksichtigung.

if(*flag&0x01) //Flag Daten senden da ?

{ //wenn ja ->

outportb(X1+4,inportb(X1+4)|0x02); //RTS setzen

if((einl&0x10)!=0 && (einl1&0x20)!=0) //ist CTS von Modem gekommen u. Sende-

{ //datenregister leer ? wenn ja ->

*zeiger=*zeiger+1; //Zeiger für Sendepuffer erhöhen

outportb(X1,byte[*zeiger]); //Byte von Sendepuffer ausgeben

if(anz!=*zeiger) return; //alle Daten gesendet wenn nein -> Ende

else //wenn ja ->

{

*flag=*flag&~0x01; //Sendeflag löschen

*flag=*flag|0x02; //Sendendeflag setzen

timer5=0; //Modempuffer Entleerungszeit starten

*zeiger=0; //Zeiger des Sendepuffers löschen

}

}

}

_________________________________________________________________________________

Fachhochschule Mannheim Seite 65

Hochschule für Technik und Gestaltung


Aufbau und Inbetriebnahme eines Steuerungssystems zur Navigation und Beobachtung eines autonomen

Fahrzeugs

__________________________________________________________________________________________

Ist die Laufzeit um den Modempuffer zu leeren abgelaufen, wird das RTS – Signal

zurückgesetzt. Waren die gesendeten Daten eine Rückmeldung zum Leitrechner, wird dieses

Flag gelöscht, waren die gesendeten Daten ein normaler Datensatz, wird ein Flag gesetzt,

welches anzeigt, daß eine Rückmeldung vom LR erwartet wird. Diese Flags steuern die

Empfangsroutine. Hier wird auch die Überwachungszeit fürdieRückmeldung des LR

gestartet.

if((*flag&0x02)!=0 && (timer5>=LFZSE)) //Senden Ende und entleerungszeit abgel.?

{

outportb(X1+4,inportb(X1+4)&~0x02); //RTS löschen

*flag=*flag&~0x02; //Senden Ende Flag löschen

if((*flag&0x1000)!=0) //nur Rückmeldung gesendet ?

{ //-> ja

*flag=*flag&~0x1000; //Rückmeldeflag löschen

} //-> nein

else

{

*flag=*flag|0x2000; //auf Rückmeldung warten Flag setzen

timer7=0; //LFZ Rückmeldung starten

}

}

5.1.2.10 senden1() (Unterprogramm Status und Wegnummer senden)

Mit dieser Routine wird der Status des Fahrzeugs und die aktuell bearbeitete Wegnummer des

Fahrauftrags zum LR gesendet. Die Schnittstellenbelegung der Routine ist in Abb. 5.1.2.10.1

wiedergegeben.

Routine senden1()

Zugriff flag1 Bits comflag Bits comflag1 Bits

schreibend

--timer8,

sendpuf[]; anzsend

0

Variablen

Peripherie

3; 4

Port (Hex) Bit Nr.

--- ---

lesend

Zugriff flag1 Bits comflag Bits comflag1 Bits

alle

fwzeig; flag1

9; 10; 11

Variablen

Peripherie

3; 4

Port (Hex) Bit Nr.

--- ---

Abb. 5.1.2.10.1 Schnittstellenbelegung der Routine senden1()

_________________________________________________________________________________

Fachhochschule Mannheim Seite 66

Hochschule für Technik und Gestaltung


Aufbau und Inbetriebnahme eines Steuerungssystems zur Navigation und Beobachtung eines autonomen

Fahrzeugs

__________________________________________________________________________________________

Der Status des Fahrzeugs wird zyklisch alle 10s an den Leitrechner gesendet. Die Zykluszeit

sollte 5,5s nicht unterschreiten, da es sonst zu Sendeüberschneidungen kommen kann und der

Datenaustausch zwischen Fahrzeug und Leitrechner unsicher wird. Die Mindestzykluszeit

(MZ) setzt voraus, daß die Summe aller Überwachungszeiten des Datentransfers, nicht

unterschritten wird.

MZ = LFZCOM1 + LFZCOM1_RM + LFZSE

Nachdem die Sendezykluszeit zum Senden des Fahrzeugstatus abgelaufen ist, wird das Flag

zum Status senden gesetzt und die Zeit neu gestartet.

//Unterprogramm Wegnummer und Status senden

void senden1(void)

{

if(timer8 >= STATUSSEND) //Zeit um Status zu senden abgelaufen ?

{

comflag1=comflag1|0x10; //Flag Status senden setzen

timer8=0; //Zeit neu starten

}

Ist durch das Flag „Wegnummer zurücksenden“, das in der Routine fahren() bei bedarf

gesetzt wird, das Senden der Wegnummer angefordert und keine Datentransfer Fehler

vorhanden, wird der Wegnummern – Frame in den Sendepuffer geschrieben und das Senden

des Datensatzes gestartet. Dabei wird das Anforderungsflag zurückgesetzt.

if(comflag1&0x08 && (comflag&0x31FF)==0) // soll Wegnummer gesendet werden

{ //u. keine Kommunikationsfehler

sendpuf[1]=1; //Wegnummer in Sendepuffer schreiben

sendpuf[2]=WE;

sendpuf[3]=fwzeig;

sendpuf[4]=ETP;

anzsend=4; //Byteanzahl setzen

comflag=comflag|0x01; //senden starten

comflag1=comflag1&~0x08; //Flag Wegnummer senden löschen

}

Wenn das Flag zum Senden des Fahrzeugstatus ansteht und nicht das Flag zum Senden der

Wegnummer und keine Datentransfer Fehler anstehen wird der Status gesendet. Das heißt,

daß das Senden der Wegnummer, Priorität vor dem Senden des Status hat. Dies hat den

Hintergrund das die Wegverfolgung des Fahrzeugs am LR schneller aktualisiert wird. Um den

Inhalt der Statusvariable flag1 übertragen zu können, muß die 32 – Bit – Variable in vier

Bytes zerlegt werden, da das Funkmodem die Daten Byteweise überträgt. Danach wir das

Senden der Daten gestartet und das Anforderungsflag zurückgesetzt.

_________________________________________________________________________________

Fachhochschule Mannheim Seite 67

Hochschule für Technik und Gestaltung


Aufbau und Inbetriebnahme eines Steuerungssystems zur Navigation und Beobachtung eines autonomen

Fahrzeugs

__________________________________________________________________________________________

if(comflag1&0x10 && (comflag1&0x08)==0 && (comflag&0x31FF)==0)

//Status senden angefordert

{ //u. Wegnummer gesendet o. n. angef. u. keine Kommunikationsfehler

sendpuf[1]=1; //Status in Bytes umrechnen

sendpuf[2]= STATUS; //und in Sendepuffer schreiben

sendpuf[7]=ETP;

anzsend=7;

sendpuf[3]=(flag1&0xFF000000) >> 24;

sendpuf[4]=(flag1&0xFF0000) >> 16;

sendpuf[5]=(flag1&0xFF00) >> 8;

sendpuf[6]=flag1&0xFF;

comflag=comflag|0x01; //senden starten

comflag1=comflag1&~0x10; //Status senden angef. Flag löschen

}

5.1.2.11 kontroll() (Unterprogramm zur Kontrolle der empfangenen Daten)

Mit dieser Routine wir nach dem Empfang von Daten kontrolliert ob ein Empfangsfehler

vorliegt und entsprechend eine Rückmeldung zum Leitrechner gesendet. Die

Schnittstellenbelegung ist in Abb. 5.1.2.11.1 abgebildet.

Routine kontroll()

Zugriff flag1 Bits comflag Bits comflag1 Bits

schreibend

--com1fz;

com1fz2; empfzei

0; 8; 9; 10; 11; 12 2

Variablen

Peripherie

Port (Hex) Bit Nr.

--- ---

lesend

Zugriff flag1 Bits comflag Bits comflag1 Bits

--com1fz;

com1fz2

---

Variablen

Peripherie

---

Port (Hex) Bit Nr.

--- ---

Abb. 5.1.2.11.1 Schnittstellenbelegung der Routine kontroll()

Steht das Flag „Datenempfang fertig“ an, wird der Fehlerzähler kontrolliert. Ist von der

Empfangsroutine empfang() kein Fehler eingetragen, wird sofort ein ACK an den Leitrechner

gesendet. Alle bis dahin anstehenden Datentransfer Fehler werden durch einen korrekt

empfangenen Datensatz gelöscht. Für die Senderroutine senden() wird ein Flag gesetzt, daß

momentan eine Rückmeldung läuft. Es wird noch ein Flag gesetzt, daß die empfangenen

_________________________________________________________________________________

Fachhochschule Mannheim Seite 68

Hochschule für Technik und Gestaltung


Aufbau und Inbetriebnahme eines Steuerungssystems zur Navigation und Beobachtung eines autonomen

Fahrzeugs

__________________________________________________________________________________________

Daten fehlerlos sind. Nur wenn die Daten fehlerlos sind, wird die Datenfilterroutine

aufgerufen

//Unterprg. Kontrolle der empf. Daten **

void kontroll()

{

if(com1fz==0) //...wenn keine Übertragungsfehler gekommen...

{

anzsend=1; //Anzahlder zu sendenden Bytes festlegen

sendpuf[1]=ACK; //ACK in Sendepuffer schreiben

comflag=comflag|0x01; //und über Modem senden

comflag=comflag&~0x600; //Fehlerflags zurücksetzen

comflag=comflag|0x1000; //Rückmeldung nach Datenempfang läuft

comflag1=comflag1|0x04; //Flag Empfangene Daten ok setzen

com1fz2=0; //Fehlerzähler 2 zurücksetzen

}

Ist ein Empfangsfehler registriert, dann wird sofort ein NAK zum Leitrechner gesendet. Der

Zeiger für den Empfangspuffer wird zurückgestellt, um die ungültigen Daten beim nächsten

Empfang zu überschreiben. Der Fehlerzähler für die Empfangsversuche wird um 1 erhöht.

else //wenn Übertragungsfehler gekommen dann...

{

anzsend=1; //Anzahlder zu sendenden Bytes festlegen

sendpuf[1]=NAK; //NAK in Sendepuffer schreiben

comflag=comflag|0x01; //und über Modem senden

comflag=comflag|0x1000; //Rückmeldung nach Datenempfang läuft

empfzei=0; //gültige Datenanzahl auf 0 setzen

com1fz2++; //Fehlerzähler 2 (Übertragungsversuche) erhöhen

}

Sind mehr als drei Empfangsversuche fehlgeschlagen, wird ein entsprechendes Fehlerflag

gesetzt. Zum Schluß wird auf jeden Fall der Fehlerzähler der Empfangsroutine gelöscht, um

keine Fehlermeldung zu erhalten, wenn beim nächsten Datenempfang gültige Daten anstehen.

Das Flag „Datenempfang fertig“ wird gesetzt.

if(com1fz2==3) //sind schon 3 Übertragungsversuche gemacht worden...

{

comflag=comflag|0x800; //...Fehlerflag setzen

}

com1fz=0;

comflag=comflag&~0x100; //"Daten empf." Flag zurücksetzen

_________________________________________________________________________________

Fachhochschule Mannheim Seite 69

Hochschule für Technik und Gestaltung


Aufbau und Inbetriebnahme eines Steuerungssystems zur Navigation und Beobachtung eines autonomen

Fahrzeugs

__________________________________________________________________________________________

5.1.2.12 datfilt() (Unterprogramm Empfangsdatenfilter)

Mit dieser Routine werden die Empfangenen Daten so aufbereitet, daß sie von der Software

benutzt werden können. Die Schnittstellenbelegung ist in Abb. 5.1.2.12.1 wiedergegeben.

Routine datfilt()

Zugriff flag1 Bits comflag Bits comflag1 Bits

schreibend 0; 7; 13 ---

Variablen

2

fahrweg[]; weginfo[]; weganz; empfzei

Peripherie

Port (Hex) Bit Nr.

--- ---

lesend

Zugriff flag1 Bits comflag Bits comflag1 Bits

0; 13; 15

empfpuf[]; fahrweg[]

---

Variablen

Peripherie

---

Port (Hex) Bit Nr.

--- ---

Abb. 5.1.2.12.1 Schnittstellenbelegung der Routine datfilt()

Steht ein gültiger Fahrauftrag im Empfangspuffer, müssen die Wegdaten, die in cm bzw. in

Grad übertragen werden, in Impulse für die Positionierung umgerechnet werden. Durch die

übertragenen Frames, ist genau definiert, an welcher Stelle die Wegstrecken, Drehungen und

die Anzahl der Verfahrwege, in den empfangenen Daten stehen (siehe Kap. 4.3 ab S. 42). Da

die Datenübertragung Byteweise erfolgt, müssenWegeinWortlänge umgerechnet werden.

Das Weginformationsbyte, welches angibt ob es sich um einen Weg oder eine Drehung

handelt, wird ausgewertet und danach werden die Wegdaten mit dem entsprechenden Faktor

verrechnet, um die entsprechende Pulszahl für die Positionierung des Fahrzeugs zu erhalten.

void datfilt(void) //Empfangsdatenfilter

{

int hz=3; //lokaler Hilfszähler

int t=0; //lokale Laufvariable

if(empfpuf[1]==BVW && (flag1&0x01)==0) //wurde Befehl Verfahrweg empfangen ???

{ //wenn ja ->

for(t=1;t


Aufbau und Inbetriebnahme eines Steuerungssystems zur Navigation und Beobachtung eines autonomen

Fahrzeugs

__________________________________________________________________________________________

if(empfpuf[hz+2]==2||empfpuf[hz+2]==4) //Ist Drehung empf. worden ??

{ //wenn ja ->

fahrweg[t]=fahrweg[t]*WINKELFAKTOR; //Winkel in Imp. umrechnen

}

else //wenn nein ->

{

fahrweg[t]=fahrweg[t]*WEGFAKTOR; //Fahrweg in Imp. berechnen

}

hz=hz+3;

} //Hilfszähler erhöhen

weganz=empfpuf[2]/3; //Anz. d. Wege festlegen

}

Wichtig sind die zwei Umrechnungsfaktoren, die auf die mechanischen Gegebenheiten des

Fahrzeugs abgestimmt sind. Die Verfahrwege für die Geradeausfahrt des Fahrzeugs, werden

im Leitrechner in cm eingegeben. Die erforderliche Anzahl der abzufahrenden Impulse, wie

sie in der Routine regler() benötigt werden, errechnet sich folgendermaßen:

WEGFAKTOR = Imp / (π ∗ dRad)

Wobei Imp die Anzahl der gelieferten Impulse (10000) eines Pulsgebers pro Radumdrehung

und dRad der Durchmesser (15 cm) eines Antriebrads in cm ist.

Mit dem zweiten Umrechnungsfakor werden die zu drehenden Winkel des Fahrzeugs

ebenfalls in Impulse umgerechnet. In Abb. 5.1.2.12.2 ist das prinzipielle Drehverhalten des

Fahrzeugs gezeigt (Bild aus [4] S. 71).

Abb. 5.1.2.12.2 prinzipielles Drehverhalten des Fahrzeugs

Über den Abstand der Räder, a den dadurch resultierenden Umfang des Drehkreises ππππ*a und

den Umfang eines Antriebsrads ππππ*d erhält man den Winkelfaktor wie folgt:

WINKELFAKTOR = a * Imp / (d * 360°)

_________________________________________________________________________________

Fachhochschule Mannheim Seite 71

Hochschule für Technik und Gestaltung


Aufbau und Inbetriebnahme eines Steuerungssystems zur Navigation und Beobachtung eines autonomen

Fahrzeugs

__________________________________________________________________________________________

Wobei a der mittlere Abstand der beiden Antriebsräder, d der Durchmesser eines

Antriebsrads und Imp die Anzahl der Impulse pro Radumdrehung ist.

Die abzufahrenden Impulse erhält man durch Multiplikation des Winkelfaktors mit dem

Winkel der Drehung.

Ist im Empfangspuffer ein Startbefehl und das Fahrzeug befindet sich an der Ladestation, so

wird das Startflag gesetzt. Eine Abfrage, wie das Fahrzeug von jeder beliebigen Andokstation

aus über den LR gestartet werden kann, ist hier als Beispiel auch programmiert. Das ist

jedoch nicht sinnvoll, weil der Bediener an einer Andokstation, die Weiterfahrt des Fahrzeugs

nur selbst bestimmen sollte. Der Empfangszeiger wird gelöscht, um neue Daten empfangen zu

können und das Datenfilteraufrufflag wird gelöscht.

if(empfpuf[1]==BSTART && weganz!=0) //Wenn Befehl Start gekommen

{

flag1=flag1|0x01; //Starten des Fahrzeugs von Ladestation

}

if(empfpuf[1]==BSTART && (flag1&0x01)&&(flag1&0x2000)&&(flag1&0x8000)==0)

{ //Wenn Befehl Start gekommen u.Fahrzeug nicht auf Ladestation

flag1=flag1&~0x2080; //Fahrzeug von Ladestation starten

}

empfzei=0; //Empfangszeiger löschen

comflag1=comflag1&~0x04; //Flag Daten ok löschen

}

_________________________________________________________________________________

Fachhochschule Mannheim Seite 72

Hochschule für Technik und Gestaltung


Aufbau und Inbetriebnahme eines Steuerungssystems zur Navigation und Beobachtung eines autonomen

Fahrzeugs

__________________________________________________________________________________________

5.1.3 time_int() (ISR Timer für interne Laufzeiten)

Diese ISR erzeugt Softwaretimer, die für Laufzeiten geeignet sind, da sie unabhängig von der

Zykluszeit des gesamten Programms sind. Da diese Routine keine weiteren Unterprogramme

anspricht, wird die Struktur nicht dargestellt. Die Schnittstellenbelegung ist in Abb. 5.1.3.1

wiedergegeben.

ISR time_int()

Zugriff flag1 Bits comflag Bits comflag1 Bits

schreibend

--- ---

Variablen

--timer1;

timer2; timer3; timer4; timer5; timer6; timer7; timer8

Peripherie

Port (Hex) Bit Nr.

64 6

lesend

Zugriff flag1 Bits comflag Bits comflag1 Bits

--- ---

Variablen

---

Peripherie

---

Port (Hex) Bit Nr.

--- ---

Abb. 5.1.3.1 Schnittstellenbelegung der Routine time_int()

Diese ISR wird alle 55ms aufgerufen und zählt alle, die in ihr stehenden Variablen um 1 hoch.

Angesprochen wird hierbei der Softwareinterrupt IRQ28, der über den Prozessortimer 0

ausgelöst wird. Dieser Softwareinterrupt wird vom Betriebssystem XDOS gestellt und ist von

der Priorität, allen anderen Interrupts nachgestellt. Dadurch ist eine zeitliche Überschneidung

mit wichtigen Interrupts, wie z.B. dem Timerinterrupt für die Regelung, ausgeschlossen. Da

dies ein Softwareinterrupt ist, muß dieser auch nicht explizit quittiert werden. Hier wird auch

der „Lebenstakt“ für das Betriebsprogramm des Fahrzeugs erzeugt.

//ISR Timer: Hochzaehlen von Variablen für Laufzeiten

void interrupt time_int()

{

outportb(PORT_E,inportb(PORT_E)^0x40); //Lebenszeichen von Rechner ausgeben

timer1=timer1+1; //mitlaufender Timer1 Ansprechzeit Kollisionsschutz

timer2=timer2+1; //mitlaufender Timer2 Wiederanlaufzeit nach Kollision

timer3=timer3+1; //mitlaufender Timer3 Lampe an Zeit

timer4=timer4+1; //mitlaufender Timer4 Lampe aus Zeit

timer5=timer5+1; //mitlaufender Timer5 Modempuffer leeren

_________________________________________________________________________________

Fachhochschule Mannheim Seite 73

Hochschule für Technik und Gestaltung


Aufbau und Inbetriebnahme eines Steuerungssystems zur Navigation und Beobachtung eines autonomen

Fahrzeugs

__________________________________________________________________________________________

timer6=timer6+1; //mitlaufender Timer6 Überw.zeit COM1

timer7=timer7+1; //mitlaufender Timer7 LFZ Reaktion nach senden

timer8=timer8+1; //mitlaufender Timer8 LFZ Status senden

//Da Software Int. benutzt wird muss Int. nicht quittiert werden !!

}

5.1.4 regler() (ISR für die Regelung des Antriebs)

Mit dieser ISR wird die Drehzahlregelung und die Positionierungssteuerung des Fahrzeugs

realisiert. Die Struktur ist in Abb. 5.1.4.1 und die Schnittstellenbelegung in Abb. 5.1.4.2

dargestellt.

Abb. 5.1.4.1 Struktur der ISR regler()

Die ISR wird alle 5ms im Interrupt

aufgerufen und arbeitet alle angehängten

Unterprogramme nacheinander ab. Alle hier

gezeigten Routinen werden der Reihe nach

genau beschrieben.

ISR regler()

Zugriff flag1 Bits comflag Bits comflag1 Bits

schreibend 1; 3; 4; 5; 6 ---

Variablen

--weg1h;

weg2h; drz1; drz2; weg1; weg2; yp; yph; yh; yh1; yi1; yi2;

yi3; e1alt; e2alt; e3alt; y1; y2; y3; sollwegp; weg1; weg2; flag1; e1;

e2; e3; entf1; entf2

Peripherie

Port (Hex) Bit Nr.

64 0; 1; 2; 3; 4; 5; 7

20 5

A0 5

F041 alle

D/A 0 alle

D/A 1 alle

_________________________________________________________________________________

Fachhochschule Mannheim Seite 74

Hochschule für Technik und Gestaltung


Aufbau und Inbetriebnahme eines Steuerungssystems zur Navigation und Beobachtung eines autonomen

Fahrzeugs

__________________________________________________________________________________________

lesend

Zugriff flag1 Bits comflag Bits comflag1 Bits

2; 3; 4; 5; 6; 8; 9 ---

Variablen

--weg1h;

weg2h; weg1; weg2; sollwegp; yph; yp; yh; yh1; drz1; drz2;

y3; e1; e2; e3

Peripherie

Port (Hex) Bit Nr.

62 alle

63 alle

A/D 0 alle

A/D 1 alle

Abb. 5.1.4.2 Schnittstellenbelegung der ISR regler()

Diese Routine wird alle 5ms vom Prozessortimer 1 aufgerufen. Zuerst muß der Drehzahl

Istwert der beiden Antriebsräder eingelesen werden. Die eingelesenen Werte werden auf

Hilfsvariablen zwischengespeichert, dann werden die Hardwarezähler der Pulsgeber gelöscht

und wieder freigegeben. Die eingelesenen Werte werden nun noch mit einem Faktor

verrechnet, um den Istwert dem Sollwert anzupassen. Der auszugebende Sollwert überstreicht

einen Bereich von 0V bis 4,095V, das entspricht einem Wert von 0 bis 4095 bei einer 12 – Bit

Auflösung des D/A – Wandlers. Bei maximaler Drehzahl, stehen 41 Impulse zur Verfügung

(siehe Kap. 3.3 S. 16), was einem Sollwert von 4095 entspricht. Deshalb wird der eingelesene

Istwert mit 100 multipliziert. Also überstreicht der Drehzahlistwert einen Bereich von 0V bis

4,1V, in Schritten mit 100mV. Folglich kann der Sollwert sich auch nur in 100mV Schritten

ändern, was in der Praxis völlig ausreichend ist.

//ISR Regler: Drehzahlregelung und Positioniersteuerung

void interrupt regler()

{

outportb(PORT_E,inportb(PORT_E)|0x80); //Ausgang f. Durchlaufzeitmessung setzen

disable(); //Interrupts sperren

weg2h=inportb(PORT_D); //Hardwarezähler Rad re. einlesen

weg1h=inportb(PORT_C); //Hardwarezähler Rad li. einlesen

outportb(PORT_E,inport(PORT_E)|0x0C); //Hardwarezaehler löschen

outportb(PORT_E,inport(PORT_E)&~0x0C); //und wieder freigeben

drz1 = weg1h*FAKTOR; // Istdrehz. Rad li. berechnen

drz2 = weg2h*FAKTOR; // Istdrehz. Rad re. berechnen

Der abgefahrene Weg des Fahrzeugs wird durch aufsummieren der eingelesenen Impulse pro

Zeiteinheit gebildet. Zur Positionierung wird nur ein Pulsgeber ausgewertet. Bei der

Inbetriebnahme der Regelung ist keine Anfahr- oder Bremsrampe programmiert worden. Das

Anfahren und Bremsen ist somit mit einem maximalen Sollwertsprung vergleichbar.

_________________________________________________________________________________

Fachhochschule Mannheim Seite 75

Hochschule für Technik und Gestaltung


Aufbau und Inbetriebnahme eines Steuerungssystems zur Navigation und Beobachtung eines autonomen

Fahrzeugs

__________________________________________________________________________________________

Bei der Positionierung eines Wegs, wurde festgestellt, daß beide Räder nicht genau gleich

viele Impulse, also nicht genau den gleichen Weg zurückgelegt haben. Dies wird hier am

Ende einer Positionierung korrigiert. Deswegen wird der gefahrene Weg bei Fahrt vorwärts

aufsummiert und bei Fahrt Rückwärts die Impulse abgezogen. Bei einer Parkfahrt wird nicht

auf Wegimpulse positioniert.

if((flag1&0x100)==0&&(flag1&0x200)==0) //Wenn keine Parkfahrt und kein

{ //ausrichten auf Winkel läuft dann ->

if (flag1&0x08) //Läuft Rad re. rückwärts ??

{ //wenn ja->

weg2 = weg2 - weg2h; //eingelesene Impulse Rad re.von

} //Wegvariable subtrahieren

else //wenn nein->

{ //eingel. Impulse Rad re. zu Wegvariable

weg2=weg2+weg2h; //addieren

}

if (flag1&0x10) //läuft Rad li. rückwärts ??

{ //wenn ja->

weg1 = weg1 - weg1h; //eingel. Impulse Rad li.von Wegvariable

} //subtrahieren

else //wenn nein ->

{ //eingel. Impulse Rad li. zu Wegvariable

weg1=weg1+weg1h; //addieren

}

Die Positionierung wird mit einer Anfahr- und Bremsrampe ausgeführt, damit beim Anfahren

die Antriebsräder nicht durchdrehen können. In der Variablen yp ist der Drehzahlsollwert für

die Regelung und in der Variablen sollwegp der zu fahrende Weg in Impulsen abgelegt. Die

Restwege in Impulsen, werden für beide Räder separat berechnet und in die Hilfsvariablen yh

und yh1 geschrieben. Mit diesen Werten, werden am Schluß der Positionierung, die

Wegunterschiede beider Räder nachgestellt.

Der Drehzahlsollwert für die Positionierung eines Verfahrwegs wird aus folgenden

Parametern berechnet, um eine Anfahr- bzw. Bremsrampe zu erhalten:

sollwegp = abzufahrender Weg in Impulsen

weg2 = gefahrener Weg in Impulsen

ANFWEG = Weg für Anfahrrampe in Impulsen (feste Vorgabe)

ABFWEG = Weg für Bremsrampe in Impulsen (feste Vorgabe)

SCHLWEG = Weg für Schleichgang zur Endpositionierung (feste Vorgabe)

MAXDRZ = maximale Drehzahl die erlaubt ist (feste Vorgabe)

STGAN = Kehrwert der Steigung für Anfahrrampe (feste Vorgabe)

STGAB = Kehrwert der Steigung für Bremsrampe (feste Vorgabe)

SCHLDRZ = Drehzahl für Schleichgang (feste Vorgabe)

Der Sollwert wird auf maximale Drehzahl begrenzt und die Mindestdrehzahl ist die

Schleichdrehzahl. Eine komplette Positionierung ist in Abb. 5.1.4.3 wiedergegeben.

_________________________________________________________________________________

Fachhochschule Mannheim Seite 76

Hochschule für Technik und Gestaltung


Aufbau und Inbetriebnahme eines Steuerungssystems zur Navigation und Beobachtung eines autonomen

Fahrzeugs

__________________________________________________________________________________________

Abb. 5.1.4.3 Abbild einer Positionierung mit Anfahr- und Bremsrampe

Die maximale Drehzahl wird auf 3000 (3V) begrenzt, um noch genügend Reserven zum

Nachregeln zu haben. Die Schleichdrehzahl wird auf 450 (0,45V) eingestellt, um nicht über

das Fahrziel hinaus zu fahren. Die Länge der Wege für die Anfahr- bzw. Bremsrampe sind

experimentell entwickelt worden. Dadurch ergibt sich über die Geradengleichung, die

einzugebende Steigung. Hierbei ist zu beachten, daß die Werte für die Steigungen als

Kehrwert angegeben werden müssen.

Um nicht bei jeder Parameteränderung das komplette Programm in den Fahrzeugrechner

einspielen zu müssen, wurden die Rampen mit einem Basicprogramm simuliert. Da dieses

Programm, mit den in dieser Dokumentation gelieferten Daten relativ einfach zu erstellen ist,

wird von einer Beschreibung hier abgesehen. Eine Simulation der Rampen, mit den aktuellen

Einstellungen ist in Abb. 5.1.4.4 zu sehen. Dabei entspricht die dunkle Kurve dem

Strecken – Istwert und die helle Kurve dem Sollwert. Die Regelung ist bei dieser Simulation

aktiv. Dies ist an den kleinen Überschwingern des Strecken – Istwertes zu erkennen.

_________________________________________________________________________________

Fachhochschule Mannheim Seite 77

Hochschule für Technik und Gestaltung


Aufbau und Inbetriebnahme eines Steuerungssystems zur Navigation und Beobachtung eines autonomen

Fahrzeugs

__________________________________________________________________________________________

Abb. 5.1.4.4 Rampensimulation des Fahrzeugs

Bei der Simulation ist ein Verfahrweg von 18000 Impulsen, dies entspricht ca. 85cm,

eingegeben worden.

yp=sollwegp-weg2; //Soll-Ist-Diff. Pos. berechnen Messung

//mit Pulsgeber Rad re.

if(weg2>(sollwegp-SCHLWEG-ABFWEG)) //Bremsrampe

{

yp=(sollwegp-SCHLWEG-weg2)/STGAB;

if(yp>yph) yp=yph;

if((ypweg2))

{

yp=SCHLDRZ;

}

}

if((yp>MAXDRZ)&&(weg2MAXDRZ) yp=MAXDRZ;

yph=yp;

}

if((yp>MAXDRZ)&&(weg2>=ANFWEG)&&(weg2


Aufbau und Inbetriebnahme eines Steuerungssystems zur Navigation und Beobachtung eines autonomen

Fahrzeugs

__________________________________________________________________________________________

Am Ende einer Positionierung, wird kontrolliert, ob beide Räder den gleichen Weg

zurückgelegt haben, andernfalls die Position korrigiert.

if (yh0 und Rad läuft rückw.

{

outportb(PORT_E,inportb(PORT_E)^0x10); //Drehrichtungsumkehr und

flag1=flag1&~0x08; //Rückwärtsflag zurücksetzen

}

if (yh10 && flag1&0x10)

{

outportb(PORT_E,inportb(PORT_E)^0x20);

flag1=flag1&~0x10;

}

Ist eines der Räder korrigiert, wird die Pulsfreigabe für dieses Rad vom Antrieb

weggenommen und die Parameter für den entsprechenden Regler werden zurückgestellt.

if ((yh==0)) //Wenn Rad re.positioniert dann...

{

outportb(PORT_E,inportb(PORT_E) & ~0x02); // Pulsfreigabe löschen

flag1=flag1|0x20; // Flag Rad re. positionirt setzen

yi3=0; // I-Anteil Diff.Regler löschen

yi2=0; // I-Anteil Regler Rad re. löschen

e2alt=0; // Altwerte Diff.Regler und DRZe3alt=0;

// Regler Rad re. löschen

y3=0; // Ausgabewert Diff.Regler löschen

}

if ((yh1==0)) //Wenn Rad li. positioniert dann...

{

outportb(PORT_E,inportb(PORT_E) & ~0x01); // Pulsfreigabe löschen

flag1=flag1|0x40; //siehe Rad re.

yi3=0;

yi1=0;

e1alt=0;

e3alt=0;

y3=0;

}

_________________________________________________________________________________

Fachhochschule Mannheim Seite 79

Hochschule für Technik und Gestaltung


Aufbau und Inbetriebnahme eines Steuerungssystems zur Navigation und Beobachtung eines autonomen

Fahrzeugs

__________________________________________________________________________________________

Sind beide Räder vollends positioniert, werden die Wegzähler, Restwegspeicher und

Sollwertvorgabe gelöscht, beide Antriebsräder auf Vorwärtsfahrt gestellt (Grundstellung) und

die entsprechenden Flags gesetzt um den restlichen Routinen mitzuteilen, daß die

Positionierung abgeschlossen ist.

if ((flag1&0x40)&&(flag1&0x20)) //Wenn beide Räder positioniert...

{

yp=0; // Restweg löschen

sollwegp=0; // Sollwegvorgabe löschen

weg1=0; // Wegzähler löschen

weg2=0; // " "

yph=0; //Zwischenspeicher löschen

outportb(PORT_E,inportb(PORT_E) & ~0x30); //Beide Räder auf Vorwärtsfahrt

flag1=flag1&~0x78; //Flagbits 3-6 löschen

flag1=flag1 | 0x02; // Flag Weg fertig setzen

}

Jedes der beiden Räder ist Drehzahlgeregelt. Damit das Fahrzeug geradeaus fährt, werden

Drehzahlunterschiede, die besonders beim Anfahren und Bremsen des Fahrzeugs auftreten,

mit einem Diferenzenregler ausgeregelt. Das Prinzip der Regelung für das Fahrzeug ist in

Abb. 5.1.4.5 dargestellt (Bild aus [4] S. 160).

Abb. 5.1.4.5 Prinzip der Regelung des Fahrzeugs

Als Regler wird ein PID – Regler verwendet, der als Stellungsalgotithmus (siehe Vorlesung

RG 2) realisiert ist. Zuerst wird der Differenzenregler aufgerufen, der nur dann bearbeitet

wird,wennbeideRäder noch nicht positioniert sind und die Kollisionskontrolle nicht

angesprochen hat. Das hat den Hintergrund, das der I – Anteil des Reglers nicht in die

Begrenzung läuft. Der Sollwert für den Regler wird aus der Differenz der beiden

Istdrehzahlen ermittelt. Der Ausgang des Reglers wird auf 1000 (1V) begrenzt.

_________________________________________________________________________________

Fachhochschule Mannheim Seite 80

Hochschule für Technik und Gestaltung


Aufbau und Inbetriebnahme eines Steuerungssystems zur Navigation und Beobachtung eines autonomen

Fahrzeugs

__________________________________________________________________________________________

Da die maximale Drehzahl auf 3000 (3V) eingestellt ist und der maximale Ausgang 4100

(4,1V) beträgt, reicht ein Eingriff vom Differenzenregler mit +- 1000 (+-1V).

if ((flag1&0x20)==0&&(flag1&0x40)==0&&(flag1&0x04)==0) //Diff.Regler nur benutzen

{ //wenn beide Räder nochnicht pos. sind und kein Objekt im Erf.bereich

e3=drz1-drz2; //DRZ Diff.Rad li. Rad re. bilden

y3=PID_Regler(KP3,&yi3,a3,b3,e3,e3alt,1000,-1000); //Diff.SW berechnen

e3alt=e3; //Differenz zwischenspeichern

}

Die Drehzahlregler für die beiden Antriebsräder werden nur aufgerufen, wenn das

entsprechende Rad noch nicht positioniert und die Kollisionskontrolle nicht aktiv ist. Der

Sollwert für die Regler wird aus der Differenz des Drehzahlsollwerts und der Istdrehzahl

gebildet. Dazu wird der Ausgang des Differenzenreglers einmal aufaddiert und fürdenRegler

des anderen Rades subtrahiert.

if ((flag1&0x40)==0&&(flag1&0x04)==0) //DRZ-Regler Rad li.nur benutzen wenn

{ //Rad li.noch nicht positioniert ist und kein Objekt im Erf.bereich

e1=(yp-drz1)-y3; //DRZ Soll-Ist-Differenz bilden Rad li.

y1=PID_Regler(KP1,&yi1,a1,b1,e1,e1alt,4095,0); //Stellwert berechnen Rad li.

e1alt = e1; //Differenz zwischenspeichern

}

if ((flag1&0x20)==0&&(flag1&0x04)==0) //DRZ-Regler Rad re.nur benutzen wenn

{ //Rad re.noch nicht positioniert ist und kein Objekt im Erf.bereich

e2=(yp-drz2)+y3; //DRZ Soll-Istdifferenz bilden Rad re.

y2=PID_Regler(KP2,&yi2,a2,b2,e2,e2alt,4095,0); //Stellwert berechnen Rad re.

e2alt=e2; //Differenz zwischenspeichern

}

Hat die Kollisionsüberwachung angesprochen, werden sofort die Pulsfreigaben des Antriebs

weggenommen. Dadurch kommt das Fahrzeug zum Stillstand. Wird der Erfassungsbereich

der Ultraschallsensoren wieder frei, werden die Pulsfreigaben wieder aufgeschaltet. Damit das

Fahrzeug nicht Ruckartig, sondern gemäß der Anfahrrampe anfährt, muß während der

Stillstandszeit ein neuer Positioniersollwert errechnet und die Reglerparameter gelöscht

werden.

if(flag1&0x04) //Wenn Objekt in Erfassungsbereich bei

{ //Vorwärtsfahrt dann

sollwegp=sollwegp-weg2; //neuen Positioniersollwert berechnen

weg2=0; //gefahrene Wege löschen

weg1=0; //und Reglerspeicher löschen

yi3=0; // I-Anteil Diff.Regler löschen

yi2=0; // I-Anteil Regler Rad re. löschen

e2alt=0; // Altwerte Diff.Regler und DRZe3alt=0;

// Regler Rad re. löschen

y3=0; // Ausgabewert Diff.Regler löschen

_________________________________________________________________________________

Fachhochschule Mannheim Seite 81

Hochschule für Technik und Gestaltung


Aufbau und Inbetriebnahme eines Steuerungssystems zur Navigation und Beobachtung eines autonomen

Fahrzeugs

__________________________________________________________________________________________

y1=0; // Ausgabewert DRZ-Regler Rad li. löschen

y2=0; // Ausgabewert DRZ-Regler Rad re. löschen

yi1=0; // I-Anteil Regler Rad li. löschen

e1alt=0; // Altwert Regler Rad li. löschen

} //nötig um nach Notstop weiches Anlaufen zu erhalten !!!

Um den Drehzahlsollwert für die Antriebsräder zum D/A – Wandler zu übertragen, sind zwei

vom Hersteller des Fahrzeugrechners mitgelieferte Routinen zuständig.

PutD2AChannel(1); //DRZ Sollwert Rad re. ausgeben

PutD2A(y2); // " " " " "

PutD2AChannel(0); //DRZ Sollwert Rad li. ausgeben

PutD2A(y1); // " " " " "

Der Prozessortimer 1 muß mit dem entsprechenden Teilerwert geladen werden, um zum

richtigen Zeitpunkt wieder einen Interrupt auszulösen. Der Interrupt muß an beiden PIC´s

quittiert werden. Danach werden alle Interrupts wieder zugelassen.

outportb(TMR1, 0x3E); // Counter1 LSB Wert Abtastzeit einschreiben

outportb(TMR1, 0x17); // Counter1 MSB Wert Abtastzeit einschreiben

//Gesamtteiler 173Eh=5950d (1.19MHz/5950=200Hz)

//entspricht 5ms Abtastzeit

outportb(0xA0,0x20); // Int. Quittierung PIC2

outportb(0x20,0x20); // Int. Quittierung PIC1

enable(); // Interrupts wieder freigeben

Wird versucht, die A/D –Wandler vom Hauptprogramm aus zyklisch anzusprechen, gibt es

sporadische Abstürze des Rechners. Also werden die Werte der Ultraschallsensoren am Ende

der Reglerroutine eingelesen. Dazu werden zwei vom Hersteller mitgelieferte Routinen

benutzt.

PutA2DChannel(0); //Analogwert von Sonarbero li. einlesen

entf1=GetA2D(); // " " " "

PutA2DChannel(1); //Analogwert von Sonarbero re. einlesen

entf2=GetA2D(); // " " " "

_________________________________________________________________________________

Fachhochschule Mannheim Seite 82

Hochschule für Technik und Gestaltung


Aufbau und Inbetriebnahme eines Steuerungssystems zur Navigation und Beobachtung eines autonomen

Fahrzeugs

__________________________________________________________________________________________

5.1.4.1 PID_Regler(...) (Unterprogramm Regelalgorithmus)

Diese Routine berechnet den Stellwert für die Antriebsmotoren. Die Schnittstellenbelegung

ist in Abb. 5.1.4.1.1 abgebildet.

Routine PID_Regler(...)

Zugriff flag1 Bits comflag Bits comflag1 Bits

schreibend

--- ---

Variablen

--y1;y2;y3;yi1;yi2;yi3

Peripherie

Port (Hex) Bit Nr.

--- ---

lesend

Zugriff flag1 Bits comflag Bits comflag1 Bits

--- ---

Variablen

--a1;

a2; a3; b1; b2; b3; e1; e2; e3; e1alt; e2alt; e3alt; yi1; yi2; yi3

Peripherie

Port (Hex) Bit Nr.

--- ---

Abb. 5.1.4.1 Schnittstellenbelegung der Routine PID_Regler(...)

Dieses Unterprogramm ist parametrierbar und liefert als Funktionsergebnis den Stellwert für

die Antriebsmotoren zurück. Die Routine hat folgende Parameter:

kp = Verstärkung (Eingabe)

yi = Integral – Anteil (Ein-/Ausgabe)

a = Konstante für Integralanteil (Eingabe)

b = Konstante für Differentialanteil (Eingabe)

e = Soll/Ist Differenz (Eingabe)

ealt = vorherige Soll/Ist Differenz (Eingabe)

uplim = oberste Grenze des I – Anteils und des Stellwerts (Eingabe)

lowlim = unterste Grenze des I –Anteils und des Stellwerts (Eingabe)

y = Stellwert als Funktionsrückgabewert (Ausgabe)

Da der Fahrzeugrechner keinen Mathematischen Co – Prozessor hat und eine Emulation hohe

Rechenzeit bedeutet, werden alle Berechnungen in Ganzzahlarithmetik gehalten. Durch die

Abtastzeit von 5ms, müssen die Reglerparameter alle mit 1000 multipliziert werden. Um beim

Ablauf der Routine keine zu hohen Zahlenwerte zu bekommen, werden Teilergebnisse wieder

durch 1000 dividiert. Dafürbenötigt diese Routine eine Durchlaufzeit von ca. 500us. Die

Divisionen werden durch Schiebeoperationen ersetzt, was den Nachteil hat, daß

_________________________________________________________________________________

Fachhochschule Mannheim Seite 83

Hochschule für Technik und Gestaltung


Aufbau und Inbetriebnahme eines Steuerungssystems zur Navigation und Beobachtung eines autonomen

Fahrzeugs

__________________________________________________________________________________________

alle Parameter mit 1024 multipliziert werden müssen, aber dadurch reduziert sich die

Durchlaufzeit auf ca. 60us.

//Unterroutine PID-Regler

int PID_Regler(long int kp,long int *yi,long int a,long int b,int e,int ealt,int uplim,int lowlim)

{

int y; //lokal Stellwert

long int yp; //lokal Stellwert P-Anteil

long int yd; //lokal Stellwert D-Anteil

yp= kp*e >> 10; //Ber. Stellwert P-Anteil

*yi=*yi+(a*e >>10); //Ber. Stellwert I-Anteil

yd=(b*(e - ealt))>> 10; //Ber. Stellwert D-Anteil

y=yp+*yi+yd; //Ber. Gesamtstellwert

if (*yi > uplim) *yi=uplim; //Begr. I-Anteil

if (*yi < lowlim) *yi= lowlim; // " "

if (y > uplim) y=uplim; //Begr. Gesamtstellwert

if (y < lowlim) y= lowlim; // " "

return y; //Funtionsrueckgabe Gesamtstellwert

}

Die Reglerparameter sind in den Definitionen mit 1024 multipliziert einzugeben. Durch eine

Simulation mit einem Basicprogramm wurde eine relativ gute Einstellung fürdieRegler

gefunden. Bei der Inbetriebnahme wurden beide Räder nacheinander eingestellt und getestet

und danach der Differenzenregler. In Abb. 5.1.4.2 ist eine Simulation mit den aktuellen

Einstellungen füreinRadzusehen.

Abb. 5.1.4.2 Simulation der Drehzahlregelung füreinRad

_________________________________________________________________________________

Fachhochschule Mannheim Seite 84

Hochschule für Technik und Gestaltung


Aufbau und Inbetriebnahme eines Steuerungssystems zur Navigation und Beobachtung eines autonomen

Fahrzeugs

__________________________________________________________________________________________

Die dunkle Kurve stellt den Reglerausgang und die helle Kurve den Strecken – Istwert dar.

5.1.5 irq4() (ISR zum Empfang von Daten)

Diese ISR wird aufgerufen, wenn sich der Inhalt des Empfangsregisters der

RS – 232 – Schnittstelle ändert. Die Struktur dieser Routine ist in Abb. 5.1.5.1 und

Schnittstellenbelegung in Abb. 5.1.5.2 dargestellt.

Abb. 5.1.5.1 Struktur der ISR irq4()

Routine irq4()

Zugriff flag1 Bits comflag Bits comflag1 Bits

schreibend

--- ---

Variablen

---

Peripherie

---

Port (Hex) Bit Nr.

20 alle

lesend

Zugriff flag1 Bits comflag Bits comflag1 Bits

--- 13 2

Variablen

---

Peripherie

Port (Hex) Bit Nr.

--- ---

Abb. 5.1.5.2 Schnittstellenbelegung der ISR irq4()

Nach Aufruf der ISR werden alle

angehängten Unterprogramme

nacheinander abgearbeitet. Diese

werden der Reihe nach genau

beschrieben.

Wenn nach einem senden von Daten eine Rückmeldung vom Leitrechner erwartet wird muß,

wird die entsprechende Routine aufgerufen. Wird keine Rückmeldung erwartet und alle Daten

sind empfangen, wird die Datenfilterroutine datfilt() (siehe Kap. 5.1.2.12 S. 70)

angesprungen.

_________________________________________________________________________________

Fachhochschule Mannheim Seite 85

Hochschule für Technik und Gestaltung


Aufbau und Inbetriebnahme eines Steuerungssystems zur Navigation und Beobachtung eines autonomen

Fahrzeugs

__________________________________________________________________________________________

Sollten Daten empfangen werden während die Datenfilterung läuft, werden diese durch

leerlesen des Empfangregisters ignoriert. Ansonsten wird zur eigentlichen Empfangsroutine

empfang() verzweigt. Dieser Interrupt muß noch explizit bestätigt werden.

void interrupt irq4() //ISR wird durchlaufen wenn: Eingangspuffer der COM

//Schnittstelle sich ändert

{

int verbrat=0; //lok. Variable zum Leerlesen des Empfangsregisters

if(comflag&0x2000) //wenn Fahrzeug auf Rückmeldung wartet dann...

{

RM(); //Routine Rückmeldung empfangen starten

}

else //sonst...

{

if(comflag1&0x04) //läuft Datenfilterroutine dann...

{

verbrat=inportb(X1); //ankommende Datenignorieren

}

else empfang(); //sonst Empfangsroutine aufrufen

}

outp(0x20,BEST1); //Interrupt bestätigen

}

5.1.5.1 RM() (Unterprogramm Rückmeldung empfangen)

Diese Routine kontrolliert eine Rückmeldung vom LR, und setzt entsprechend Flags, die

anzeigen, ob die Rückmeldung positiv (ACK) oder negativ (NAK) ist. Die

Schnittstellenbelegung der Routine ist in Abb. 5.1.5.1.1 dargestellt.

Routine RM()

Zugriff flag1 Bits comflag Bits comflag1 Bits

schreibend

--com1fz3

13

Variablen

Peripherie

0; 1

Port (Hex) Bit Nr.

--- ---

_________________________________________________________________________________

Fachhochschule Mannheim Seite 86

Hochschule für Technik und Gestaltung


Aufbau und Inbetriebnahme eines Steuerungssystems zur Navigation und Beobachtung eines autonomen

Fahrzeugs

__________________________________________________________________________________________

lesend

Zugriff flag1 Bits comflag Bits comflag1 Bits

--com1fz3

---

Variablen

Peripherie

---

Port (Hex) Bit Nr.

3F8 alle

Abb. 5.1.5.1.1 Schnittstellenbelegung der ISR RM()

Das vom LR gesendete Byte wird eingelesen und kontrolliert. Ist das Datum eine positive

Rückmeldung (ACK), werden die entsprechenden Fehlerflags und das Flag, das anzeigt ob

eine Rückmeldung vom LR kommen muß, gelöscht. Kommt keine positive Rückmeldung,

wird das entsprechende Fehlerflag gesetzt, um die Daten erneut zum LR zu senden. Dabei

wird ein Zähler, der die Anzahl der Sendeversuche vom Fahrzeug zum LR angibt, erhöht.

Sind die Daten 10 mal zum LR gesendet worden und ist immer noch keine positive

Rückmeldung vom LR eingetroffen, werden alle relevanten Flags gelöscht und ein weiteres

Fehlerflag gesetzt. Danach werden keine Daten mehr automatisch zum LR gesendet, bis vom

LR ein gültiger Datensatz empfangen wird.

void RM(void)

{

int einl=0; //Zwischenspeicher für COM Eingangspuffer

einl=inp(X1); //COM Eingangspuffer einlesen

if(einl==ACK) //Ist Rückmeldung = ACK ? wenn ja ->

{

comflag1=comflag1&~0x03; //Fehlerflags zurücksetzen

com1fz3=0; //Sendeversuchszähler löschen

comflag=comflag&~0x2000; //Flag warten auf Rückmeldung löschen

}

else //wenn kein ACK empfangen dann...

{

comflag1=comflag1|0x01; //Flag NAK gekommen setzen

com1fz3 ++; //Sendeversuchszähler erhöhen

if(com1fz3>=NAKMAX) //sind maximale Sendeversuche erreicht dann...

{

comflag1=comflag1|0x02; //Flag kein ACK nach NAKMAX-Versuchen setzen

comflag1=comflag1&~0x01; //Flag NAK gekommen löschen

com1fz3=0; //Sendeversuchszähler löschen

comflag=comflag&~0x2000; //Flag warten auf Rückmeldung löschen

}

}

}

_________________________________________________________________________________

Fachhochschule Mannheim Seite 87

Hochschule für Technik und Gestaltung


Aufbau und Inbetriebnahme eines Steuerungssystems zur Navigation und Beobachtung eines autonomen

Fahrzeugs

__________________________________________________________________________________________

5.1.5.2 empfang() (Unterprogramm Daten empfangen)

Mit dieser Routine werden die empfangenen Daten kontrolliert und in den Empfangspuffer

geschrieben. Die Schnittstellenbelegung ist in Abb. 5.1.5.2.1 wiedergegeben.

Routine empfang()

Zugriff flag1 Bits comflag Bits comflag1 Bits

schreibend

--com1fz3

13

Variablen

Peripherie

0; 1

Port (Hex) Bit Nr.

--- ---

lesend

Zugriff flag1 Bits comflag Bits comflag1 Bits

--com1fz3

---

Variablen

Peripherie

---

Port (Hex) Bit Nr.

3F8 alle

Abb. 5.1.5.1.1 Schnittstellenbelegung der Routine empfang()

Bei jedem empfangenen Byte, werden über feste Ablaufschritte der vom LR gesendete

Datensatz rekonstruiert und eventuelle Fehler registriert. Bei jedem Sprung in diese Routine,

wird nach jedem Schritt diese über einen direkten Rücksprung verlassen, um nicht zu lange in

der ISR irq4() zu verweilen. Ist ein kompletter Datensatz empfangen, werden ankommende

Daten ignoriert, durch Leerlesen des Empfangsregisters.

void empfang()

{

int verbrat; //Dummy zum löschen des Empfangspuffers

if(comflag&0x100) //Wenn Datenempfang komplett abgeschlossen ist

{ //und empfangene Daten versogt werden

verbrat=inportb(X1+0); //dann Empfangspuffer leeren bzw. ankommende

//Daten ignorieren

return;

}

Ist das Frameanfangszeichen SOH noch nicht empfangen worden, wird dieses eingelesen und

das entsprechende Schrittflag gesetzt.

_________________________________________________________________________________

Fachhochschule Mannheim Seite 88

Hochschule für Technik und Gestaltung


Aufbau und Inbetriebnahme eines Steuerungssystems zur Navigation und Beobachtung eines autonomen

Fahrzeugs

__________________________________________________________________________________________

Dazu wird der Flagwert des Schrittflags an die Routine byteein() über die Variable flagwert

übergeben, wo dieses Schrittflag gesetzt wird. Hier wird auch die Laufzeit fürden

Datenemfang gestartet.

if ((comflag & 0x04)==0) //wenn SOH noch nicht gesendet wurde

{

flagwert=0x04; //dann Byte von RS-Puffer einlesen

byteein();

comflag=comflag|0x80; //Flag Datenempfang läuft setzen

timer6=0; //und Überwachungszeit starten

return; //auf nächstes Byte warten

}

Als nächstes wird das Befehlsbyte eingelesen und das entsprechende Schrittflag gesetzt.

if ((comflag&0x08)==0) //wenn Befehl noch nicht empfangen

{

flagwert=0x08; //dann Befehlsbyte einlesen

byteein();

return; //auf nächstes Byte warten

}

Wird der Befehl „Fahrauftrag kommt“ empfangen, ist das nächste Byte, die Anzahl der Bytes

die für den kompletten Fahrauftrag vom LR gesendet werden. Hierbei besteht jeder

Verfahrweg aus zwei Weglängen – Bytes und einem Informations – Byte, also aus drei Bytes.

Die Anzahl wird eingelesen und auf eine Vergleichsvariable gelegt. Der Vergleichszähler

wird nun gelöscht. Die nächsten Bytes die im Empfangsregister eintreffen, sind die

Wegdaten. Da keine Schrittflags während des einlesens der Wegdaten gesetzt werden, wird

der Flagwert 0 übergeben.

if (comflag&0x10) //wurde Befehl Verfahrweg kommt empfangen

{

if((comflag&0x20)==0) //und die Anzahl der kommenden Bytes noch nicht

{ //eigelesen, dann...

flagwert=0x20;

byteein(); //Anzahl der kommenden Bytes einlesen

comweganz=empfpuf[empfzei-1]; //Byteanzahl auf Vergleicher legen

comwegzaehl=0; //Weg-bzw. Bytez„hler nullen

//und auf nächstes Byte warten

return;

}

if(comwegzaehl != comweganz) //sind noch nicht alle Wege bzw.

{ //Bytes gesendet worden...

flagwert=0x00; //dann Byte einlesen

_________________________________________________________________________________

Fachhochschule Mannheim Seite 89

Hochschule für Technik und Gestaltung


Aufbau und Inbetriebnahme eines Steuerungssystems zur Navigation und Beobachtung eines autonomen

Fahrzeugs

__________________________________________________________________________________________

byteein();

comwegzaehl++; //Bytez„hler erh”hen

return; //und auf n„chstes Byte warten

}

}

Sind alle Wege eingelsen oder ist ein anderer Befehl eingelesen worden, muß nun noch das

Frameendezeichen ETB eingelesen werden. Danach werden alle Schrittflags gelöscht und der

Datenempfang fertig gemeldet.

comflag=comflag&~0x10; //sind alle Wege eingelesen oder ist anderer

if((comflag&0x40)==0) //Befehl gekommen dann...

{

flagwert=0x40; //Endezeichen einlesen

byteein();

comflag=comflag&0x03; //alle Schrittflags zurücksetzen und

comflag=comflag|0x100; //Flag "Datenempfang fertig" setzen

return;

}

}

5.1.5.3 byteein() (Unterprogramm Byte einlesen)

Mit dieser Routine wird ein vom LR gesendetes Byte eingelsen, kontrolliert und in den

Empfangspuffer geschrieben. Die Schnittstellenbelegung ist in Abb. 5.1.5.3.1 zu sehen.

Routine byteein()

Zugriff flag1 Bits comflag Bits comflag1 Bits

Schreibend

--com1fz;

empfpuf[]; empfzei

2; 3; 4; 5; 6

Variablen

Peripherie

---

Port (Hex) Bit Nr.

--- ---

Zugriff flag1 Bits comflag Bits comflag1 Bits

Lesend

--- 4 ---

Variablen

empfzei

Peripherie

Port (Hex) Bit Nr.

3F8 alle

Abb. 5.1.5.1.1 Schnittstellenbelegung der Routine byteein()

_________________________________________________________________________________

Fachhochschule Mannheim Seite 90

Hochschule für Technik und Gestaltung


Aufbau und Inbetriebnahme eines Steuerungssystems zur Navigation und Beobachtung eines autonomen

Fahrzeugs

__________________________________________________________________________________________

Die eingelesenen Bytes werden auf die definierten Framezeichen kontrolliert und bei einem

Fehler, wird ein Fehlerzähler erhöht. Wenn Fahrauftragdaten übermittelt werden, sind alle

Daten gültig und die Kontrolle wird umgangen. Die empfangenen Daten stehen alle in einem

Array zur Verfügung.

//Unterprg. Byte einlesen

void byteein()

{

int out; //lokale Variable zum Einlesen des Empfangspuffers RS

out=inp(X1+0); //ablegen des empf. Bytes in Zwischenspeicher

if((comflag & 0x10)==0) //wenn nicht Befehl "Verfahrweg kommt" gekommen

{ //und wenn nicht einer der gültigen Befehle gekommen...

if((out==SOH)||(out==ENQ)||(out==BSTART)||(out==BSTOP)

||(out==BVW)||(out==STATUS)||(out==ETP))

{ //wenn Befehl "Verfahrweg kommt" da, dann Flag setzen

if(out == BVW) comflag=comflag|0x10;

}

else

{

com1fz++; //...dann Fehlerzähler um 1 erhöhen

}

}

empfpuf[empfzei]=out; //Byte in Empfangsspeicher eintragen

empfzei++; //Zeiger um 1 erhöhen

comflag=comflag | flagwert; //entsprechendes Schrittflag setzen

}

_________________________________________________________________________________

Fachhochschule Mannheim Seite 91

Hochschule für Technik und Gestaltung


Aufbau und Inbetriebnahme eines Steuerungssystems zur Navigation und Beobachtung eines autonomen

Fahrzeugs

__________________________________________________________________________________________

5.2 Software für Leitrechnerdemo

Die Software des Leitrechners soll hier nicht komplett erklärt werden, da davon auszugehen

ist, daß die Leitrechner Software später nicht mit Visual Basic geschrieben wird. Der

wichtigste Programmteil ist die Schnittstellen – Kommunikation bzw. der Datenaustausch mit

dem Funkmodem. Hierzu sind drei Routinen zuständig die im folgenden genauer beschrieben

werden. Die restlichen Funktionen des Programms, sind über die Kommentare relativ einfach

nachzuvollziehen (siehe Kap. 7.2 ab S. 122).

5.2.1 MSComm1_OnComm() (ISR RS – 232 – Schnittstelle)

Diese Routine wird nur durchlaufen, wenn die Eigenschaften RThreshold

(Empfangsinterrupt) bzw. SThreshold (Sendeinterrupt) auf 1 gestellt werden. Ein Interrupt

wird durch folgende Fälle ausgelöst:

- Äderung des Empfangspuffers am COM – Port

- Änderung des Pegels der RTS – Leitung

- Änderung des Pegels der CTS – Leitung

Das Funkmodem sendet die Daten Byteweise und deshalb wird die Eigenschaft InputLen

(Länge der empfangenen Daten in Bytes bis Interrupt ausgelöst wird) auf 1 eingestellt. Die

restlichen Eigenschaften bleiben auf den Standardwerten bzw. werden zum Teil im

Programm verändert.

Da diese Routine beim Senden sowie beim Empfangen von Daten durchlaufen wird, ist es

nötig, daß über Flags auf die entsprechenden Programmteile der Routine verzweigt wird.

Damit keine ungültigen Daten in den Empfangspuffer gelangen, wird das Eingangsregister

auf NUL geprüft und damit das einlesen verhindert. Wenn sich das Programm im

Empfangsmodus befindet und ein Byte im Eingangsregister des COM – Ports eintrifft, wird

der Zeiger für den Empfangspuffer erhöht und der eingelesene ASCII – Wert in ein Byte

umgewandelt, um alle Verfügbaren Werte empfangen zu können. Ist das empfangene Byte

keine Rückmeldung (ACK oder NAK) des Fahrzeugs, wird das entsprechende Flag fürdie

Auswerteroutine gesetzt bzw. das Empfangsfenster (siehe 5 Abb. 4.1.3.1 S. 40) aktualisiert.

Danach wird in die Routine auswert() verzweigt.

Private Sub MSComm1_OnComm() 'Interruptroutine COM Port:wird durchlaufen bei:

'- Äderung des Empfangspuffers am COM Port

'- Änderung des Pegels der RTS Leitung

'- Änderung des Pegels der CTS Leitung

Dim einl As String 'Lokalvariable für einlesen vom COM Port definieren

Dim ausg As String 'Lokalvariable für Ausgasbe an COM Port def.

If empfflag = True Then 'Wenn auf Empfang geschaltet dann...

einl = MSComm1.Input 'Inhalt des Empfangspuffers COM Port zwischensp.

If einl = "" Then GoTo m1 'Wenn Inhalt NUL dann nichts einlesen !!

_________________________________________________________________________________

Fachhochschule Mannheim Seite 92

Hochschule für Technik und Gestaltung


Aufbau und Inbetriebnahme eines Steuerungssystems zur Navigation und Beobachtung eines autonomen

Fahrzeugs

__________________________________________________________________________________________

empfzeig = empfzeig + 1 'sonst: Zeiger für Empfangspuffer erhöhen

empfpuf(empfzeig) = CByte(Asc(einl)) 'ASCII Wert in Integer Byte umwandeln und auf

If rmflag1 = False Then 'ist empfangenes Byte keine Rückmeldung

rmflag = True 'dann Flag Datensatzempfang läuft setzen

End If

If rmflag1 = False Then 'und Daten anzeigen

Text2.Text = Text2.Text + Str(empfpuf(empfzeig))

End If

Call auswert 'Auswerteroutine aufrufen und empf. Byte testen

m1:

End If

Steht das Programm im Sendemodus, wird auf die Rückmeldung des Modems gewartet,

nachdem durch ein Sendeereignis die RTS – Leitung gesetzt wurde. Ist das Modem

empfangsbereit, werden die im Sendepuffer stehenden Daten in einen String umgewandelt

und über die Schnittstelle gesendet. Sind alle Daten ausgegeben, wird ein Flag gesetzt,

welches das Sendeende anzeigt und die Pufferentleerungszeit, die das Modem benötigt, zu

starten.

If sendflag = True Then 'Wenn auf senden geschaltet dann..

If MSComm1.CTSHolding = True Then 'Abfragen ob sich Modem zurückgemeldet hat

sendzeig = sendzeig + 1 'Wenn ja -> Sendepufferzeiger erhöhen

ausg = CStr(Chr(sendpuf(sendzeig))) 'Integer Wert in String wandeln und

MSComm1.Output = ausg 'am COM Port ausgeben

ProgressBar1.Value = sendzeig 'Zustandsanzeige aktualisieren

If sendzeig = sendanz Then 'sind alle auszugebenden Datenbytes im Modem...

sendflag = False 'Sendeflag löschen

sendendflag = True 'und Flag für Modempuffer entleerungszeit setzen

sendzeig = 0 'Sendepufferzeiger löschen

End If

End If

End If

End Sub

5.2.2 auswert() (Unterprogramm zur Auswertung der empfangenen Daten)

Diese Routine wertet aus, ob die empfangenen Daten eine Rückmeldung oder der Status bzw.

der aktuelle Weg des Fahrzeugs ist. Ist das Flag rmflag1, welches anzeigt, daß das nächste

Byte vom Fahrzeug eine Rückmeldung ist gesetzt, wird das empfangene Byte ausgewertet

und der entsprechende Status im Kommunikationsfenster angezeigt. Danach wird das Flag

rmflag1 wieder gelöscht. Dieses Flag muß beim Senden von Daten unbedingt gesetzt werden.

_________________________________________________________________________________

Fachhochschule Mannheim Seite 93

Hochschule für Technik und Gestaltung


Aufbau und Inbetriebnahme eines Steuerungssystems zur Navigation und Beobachtung eines autonomen

Fahrzeugs

__________________________________________________________________________________________

Private Sub auswert()

If rmflag1 = True Then 'Wenn Rückmeldung erwartet wird...

If empfpuf(1) = 6 Then 'wurde ACK empfangen ?

Text2.Text = Text2.Text + " ACK" 'wenn ja anzeigen

empfzeig = 0 'Zeiger von Empfangspuffer zurücksetzen

End If

If empfpuf(1) 6 Then 'Wenn kein ACK empfangen...

Text2.Text = Text2.Text + " NAK" 'NAK anzeigen

empfzeig = 0 'Zeiger von Empfangspuffer zurücksetzen

End If

rmflag1 = False 'Flag "Rückmeldung erwartet" löschen

End If

Werden Daten vom Fahrzeug erwartet, muß jedes ankommende Byte auf Richtigkeit

überprüft und bei einem Fehler ein Fehlerflag gesetzt werden, um dem Fahrzeug eine

entsprechende Rückmeldung geben zu können.

If rmflag = True Then 'wenn Datensatzempfang läuft...

zae = zae + 1 'Bytezähler erhöhen

If zae = 1 Then 'Kontrolle ob Frameanfang SOH ist

If empfpuf(1) 1 Then

fehl = True 'wenn nein Fehlerflag setzen

End If

End If

If zae = 2 Then 'wenn zweites Byte empfangen

If empfpuf(zae) 87 And empfpuf(zae) 83 Then 'Kontrolle ob Weg oder Status

fehl = True 'wenn nichts von beidem Fehlerflag setzen

End If

If empfpuf(zae) = 87 Then 'kommt Weg?

we = True 'wenn ja dann Wegflag setzen

End If

End If

If zae = 4 And we = True Then 'wenn 4.Byte empfangen und Wegflag da

If empfpuf(zae) 23 Then 'Kontrolle ob Frameende gekommen

fehl = True 'wenn nein Fehlerflag setzen

nak = True

End If

'FlagNAKsendensetzen

If empfpuf(zae) = 23 Then 'wenn Frameende gekommen

ack = True 'FlagACKsendensetzen

empfanz = empfzeig 'Anzahl der empfangenen Bytes setzen

Label5.Caption = empfpuf(3) 'aktuelle Wegnummer anzeigen

empfzeig = 0

End If

End If

'Zeiger von Empfangspuffer löschen

If zae = 7 And we = False Then 'wenn 7.Byte empfangen

If empfpuf(zae) 23 Then 'Kontrolle ob Frameende gekommen

fehl = True 'wenn nein Fehlerflag setzen

nak = True

End If

'FlagNAKsendensetzen

If empfpuf(zae) = 23 Then 'wenn Frameende gekommen

_________________________________________________________________________________

Fachhochschule Mannheim Seite 94

Hochschule für Technik und Gestaltung


Aufbau und Inbetriebnahme eines Steuerungssystems zur Navigation und Beobachtung eines autonomen

Fahrzeugs

__________________________________________________________________________________________

ack = True 'FlagACKsendensetzen

empfanz = empfzeig 'Anzahl der empfangenen Bytes setzen

empfzeig = 0 'Zeiger von Empfangspuffer löschen

End If

End If

End If

End Sub

5.2.3 Timer1_Timer() (Zeitgesteuerter Interrupt)

Für die Datenkommunikation mit dem Fahrzeug müssen Überwachungs- bzw. Laufzeiten

programmiert werden. Diese Routine wird zyklisch in einem Zeitintervall von 1ms

aufgerufen. Wenn das Einlesen von Daten des Fahrzeugs läuft, wird die Übertragungszeit

überwacht, damit sich das Programm nicht festläuft bei einem Sendeproblem des Fahrzeugs.

Ist diese Überwachungszeit abgelaufen, wird das Flag für negative Rückmeldung zum

Fahrzeug gesetzt.

Private Sub Timer1_Timer() 'wirdjedemsaufgerufen

If rmflag = True Then 'wird Status oder Weg von Fahrzeug eingelesen?

timing2 = timing2 + 1 'Überwachungszeit starten

End If

If timing2 = 400 Then 'Ist Überwachungszeit abgelaufen...

nak = True 'Flag für neg.Rückmeldung setzen

rmflag = False 'Flag Datensatzempfang läuft löschen

timing2 = 0 'Zeitverzögerung löschen

End If

Ist ein Flag für positive (ACK) oder negative (NAK) Rückmeldung zum Fahrzeug gesetzt,

wird eine Zeitverzögerung gestartet, um den Modems das Umschalten von Empfang auf

Sendenzuermöglichen. Danach wird die entprechende Rückmeldung in den Sendepuffer

geschrieben, und zum Fahrzeug gesendet. Die entsprechenden Flags werden dann wieder

zurückgesetzt.

If ack = True Or nak = True Then 'wennFlagfür eineRückmeldung zum FZ ansteht

timing1 = timing1 + 1

End If

'Zeitverzögerung starten

If timing1 = 200 Then 'wenn Zeit abgelaufen

If ack = True And fehl = False Then 'wenn ACK senden angefordert

sendpuf(1) = 6 'ACK in Sendepuffer schreiben

sendanz = 1 'Anzahl der zu sendenden Bytes aktualisieren

ProgressBar1.Visible = True 'Fortschrittsanzeige einblenden

ProgressBar1.Max = sendanz 'Maximalwert auf Anzahl der zu sendenden Bytes stellen

Label1.Caption = "Datenausgabe Fortschritt:"

empfflag = False 'Empfangsflag löschen

sendflag = True 'Sendeflag setzen

MSComm1.RTSEnable = True 'RTS-Leitung von Modem setzen

ack = False

nak = False

'Rücksendeflags löschen

_________________________________________________________________________________

Fachhochschule Mannheim Seite 95

Hochschule für Technik und Gestaltung


Aufbau und Inbetriebnahme eines Steuerungssystems zur Navigation und Beobachtung eines autonomen

Fahrzeugs

__________________________________________________________________________________________

timing1 = 0 'Zeitverzögerung löschen

zae = 0 'Bytezähler löschen

we = False 'Wegflag löschen

rmflag = False 'Flag Datensatzempfang läuft löschen

empfzeig = 0 'Zeiger für Empfangspuffer löschen

fehl = False 'Fehlerflag löschen

Text2.Text = Text2.Text + " ACK zurück" 'Anzeige aktualisieren

End If

If nak = True Or fehl = True Then 'wenn NAK senden angefordert

sendpuf(1) = 21 'NAK in Sendepuffer schreiben

sendanz = 1 'Rest wie oben

ProgressBar1.Visible = True 'Fortschrittsanzeige einblenden

ProgressBar1.Max = sendanz 'Maximalwert auf Anzahl der zu sendenden Bytes stellen

Label1.Caption = "Datenausgabe Fortschritt:"

empfflag = False 'Empfangsflag löschen

sendflag = True 'Sendeflag setzen

MSComm1.RTSEnable = True 'RTS-Leitung von Modem setzen

ack = False

nak = False

timing1 = 0

zae = 0

we = False

rmflag = False

empfzeig = 0

fehl = False

Text2.Text = Text2.Text + " NAK zurück"

End If

End If

Um den Inhalt des internen Datenpuffers des Funkmodems vollständig zu senden, muß die

RTS – Leitung verzögert zurückgesetzt werden. Dazu wird nach dem Senden der Daten eine

Verzögerungszeit gestartet und dann die RTS – Leitung zurückgestellt.

If sendendflag = True Then 'wenn Senden beendet Flag da ...

timing = timing + 1 'Zeitverzögerung starten

End If

If timing = 5 Then 'Ist Zeitverzögerung abgelaufen ...

sendendflag = False 'Flag für Modempuffer entleerungszeit löschen

timing = 0 'Zeitverzögerung löschen

MSComm1.RTSEnable = False 'RTS-Leitung von Modem löschen

ProgressBar1.Visible = False 'Fortschrittsanzeige löschen

ProgressBar1.Value = 0

Label1.Caption = ""

empfflag = True 'und wieder auf Empfang stellen

End If

End Sub

Um zu sehen welche Flags und Variablen benutzt werden, um einen Datensatz zum Fahrzeug

zu senden, ist hier noch das Beispiel zum Senden einer Startsequenz aufgeführt. Dazu muß

das Flag rmflag1 gesetzt werden, welches das Programm veranlaßt, beim nächsten

Datenempfang auf eine Rückmeldung des Fahrzeugs zu warten. Des weiteren muß in den

_________________________________________________________________________________

Fachhochschule Mannheim Seite 96

Hochschule für Technik und Gestaltung


Aufbau und Inbetriebnahme eines Steuerungssystems zur Navigation und Beobachtung eines autonomen

Fahrzeugs

__________________________________________________________________________________________

Sendepuffer der zu sendende Frame eingetragen und die Anzahl der zu sendenden Bytes

angegeben werden. Um den Frame abzuschicken muß nun noch auf Senden gestellt (empfflag

= False und sendflag = True) und die RTS – Leitung gesetzt werden.

Private Sub starten_Click()

rmflag1 = True 'Rückmeldeflag setzen

sendpuf(1) = 1 'SOH in Sendepuffer schreiben

sendpuf(2) = 115 'Befehl starten in Sendepuffer schreiben

sendpuf(3) = 23 'Frameende in Sendepuffer schreiben

sendanz = 3 'Anzahl der zu sendenden Bytes aktualisieren

ProgressBar1.Visible = True 'Fortschrittsanzeige einblenden

ProgressBar1.Max = sendanz 'Maximalwert auf Anzahl der zu sendenden Bytes stellen

Label1.Caption = "Datenausgabe Fortschritt:"

empfflag = False 'Empfangsflag löschen

sendflag = True 'Sendeflag setzen

MSComm1.RTSEnable = True 'RTS-Leitung von Modem setzen

End Sub

_________________________________________________________________________________

Fachhochschule Mannheim Seite 97

Hochschule für Technik und Gestaltung


Aufbau und Inbetriebnahme eines Steuerungssystems zur Navigation und Beobachtung eines autonomen

Fahrzeugs

__________________________________________________________________________________________

6. Zusammenfassung und Bewertung

In den letzten drei Kapiteln sind die hardware- und softwaretechnischen Voraussetzungen

behandelt und dargestellt, ein leitlinienloses Transportsystem zur logistischen Verbindung

einer Modellwerkstatt, zu entwickeln und programmieren. Dieses System ist nicht als perfekt

und fertig zu verstehen, sondern als Prototyp und Basis, um es weiter zu entwickeln.

Bei dem augenblicklichen Stand ist man in der Lage, mit dem Leitrechner Verfahrwege für

das Fahrzeug einzugeben, abzuspeichern, zu laden, diese zu editieren, den komplettierten

Fahrauftrag über Funkmodems zum Fahrzeug zu senden, sowie das Fahrzeug zu starten. Das

Fahrzeug fährt diese Wege selbständig ab und sendet die aktuell bearbeitete Wegnummer und

seinen Status zyklisch zum Leitrechner zurück.

Die Arbeit vermittelt also eine Grundlage zum Umgang von Sensoren und Aktoren im

Zusammenhang mit Mikrocomputern und zeigt gleichzeitig die Probleme bei der Anpassung

dieser Komponenten zueinander. In dieser Anlage vereinen sich die wichtigsten Gebiete der

Automatisierungstechnik wie Antriebs-, Regelungs-, Steuerungstechnik, sowie

Datenverarbeitung und Datenübertragung.

Bei der zur Verfügung stehenden Zeit, war es nur möglich, die Funktion des Fahrzeugs in

groben Zügen herzustellen, wobei bei Sicherheit und Fehlerdiagnose nur das aller Nötigste

einbebaut wurde.

Die Regelung des Fahrwerks kann auf jedenfall noch optimiert werden. Dabei wäre zu

überlegen, die Regelung die momentan vom Fahtrzeugsteuerrechner übernommen wird,

teilweise oder komplett hardwaremäßig zu realisieren. Hier ist nur eine einfache

Drehzahlregelung eingesetzt. Diese könnte man mit einer Motorstromregelung erweitern und

bekommt dadurch sicherlich ein besseres Fahrverhalten des Fahrzeugs. Mit den eingesetzten

Motoren und Getrieben ist dies jedoch aufgrund der mechanischen Gegebenheiten, nicht ohne

weiteres möglich.

Das Fahrzeug kann momentan vorwärts und rückwärts fahren, sowie Drehungen auf der

Stelle durchführen. Eine Erweiterung, mit der das Fahrzeug eine kontinuierliche Kurvenfahrt

durchführen kann, wäre hier durchaus sinnvoll, vor allem wenn zur Ortsbestimmung eine

Bildverarbeitungs Kamera eingesetzt wird.

Die Signale der Pulsgeber zur Drehzahl und Wegmessung werden dem Rechner über einen

Hardwarezähler zugeführt. Alle 5ms werden diese Werte eingelesen und die Zähler vom

Rechner gelöscht. Dieses Löschen und freigeben der Zähler dauert ca. 2us und hat zur Folge,

daß sporadisch Impulse verlorengehen. Dabei entstehen zwangsläufig Positionierfehler, die

allerdings relativ gering sind. Um diese Ungenauigkeit zu umgehen, kann man den vorherig

eingelesenen Wert vom neu eigelesenen Wert subtrahieren und umgeht so das Löschen der

Zähler. Dabei muß allerdings bei einem Zählerüberlauf darauf geachtet werden, daß dadurch

entstehende negative Werte richtig umgerechnet werden.

Die Kollisionsüberwachung ist so gehalten, daß bei erkennen eines Hindernisses in einer

festgelegten Entfernung das Fahrzeug sofort zum Anhalten veranlasst wird. Da eine analoge

Spannung der Ultraschallsensoren zur Verfügung steht, kann bei eintreten eines Hindernisses

in den Erfassungsbereich die Geschwindigkeit des Fahrzeugs, proportional zur Entfernung

des Hindernisses, bis zum Stillstand reduziert werden. Dadurch wird das Fahrzeug nicht

abrupt angehalten.

_________________________________________________________________________________

Fachhochschule Mannheim Seite 98

Hochschule für Technik und Gestaltung


Aufbau und Inbetriebnahme eines Steuerungssystems zur Navigation und Beobachtung eines autonomen

Fahrzeugs

__________________________________________________________________________________________

Man könnte auch ein Ausweichmanöver einleiten, um das Hindernis zu umfahren.

Auf jedenfall sollte man Laufzeiten einfügen, die einen Fahrauftrag zeitlich überwachen, um

bei ausergewönlichen Ereignissen, bei dem das Fahrzeug nicht weiterkommt, dieses

stillzusetzen und eine entsprechende Fehlermeldung zum Leitrechner senden. Die Sensoren

wie Pulsgeber und Ultraschallsensoren sollten auch zyklisch auf Funktion getestet werden,

um Kollisionen zu vermeiden.

Die Leitrechner Software ist wie schon erwähnt eine Demo Version, die den Umgang mit

dem Funkmodem und den vom Fahrzeug gesendeten Daten aufzeigt. Deshalb wird an dieser

Stelle auf Verbesserungen nicht eingegangen.

Zusammenfassend kann man sagen, daß es noch einiges zu entwickeln gibt, um das

Transportsystem zu perfektionieren. Dennoch sind mit dieser Arbeit grundlegende

Erkenntnisse erarbeitet und umgesetzt worden, die für eine Weiterentwicklung dieses Systems

unerlässlich sind.

_________________________________________________________________________________

Fachhochschule Mannheim Seite 99

Hochschule für Technik und Gestaltung


Aufbau und Inbetriebnahme eines Steuerungssystems zur Navigation und Beobachtung eines autonomen

Fahrzeugs

__________________________________________________________________________________________

7. Anhang

7.1 Programmausdruck Fahrzeug

7.1.1 Definitionen

Aufschlüsselung der Schnittstellenbits:

flag1

Bit 0: Startflag -> Positionierung start für komplettes Wegpaket

Bit 1: Weg fertig gefahren (einzelne Wege)

Bit 2: Kollissionschutz ausgelöst -> Beide Räder stopp

Bit 3: Rad re. läuft rückwärts (Endpositionierung bevor Weg fertig)

Bit 4: Rad li. läuft rückwärts (Endpositionierung bevor Weg fertig)

Bit 5: Rad re. positioniert (Endpositionierung bevor Weg fertig)

Bit 6: Rad li. positioniert (Endpositionierung bevor Weg fertig)

Bit 7: Parfahrt läuft

Bit 8: Parkpositionierung mit Sonar läuft

Bit 9: Fahrzeug winkelig ausrichten läuft

Bit 10: Parkfahrt 90 grad Drehung rechts läuft

Bit 11: Parkfahrt auf Platte1 läuft

Bit 12: Parkfahrt auf Platte2 läuft

Bit 13: Parkfahrt beendet

Bit 14: Blinkerbit zyklischer Signalwechsel

Bit 15: Sammelfehler

Bit 16: FlagLampe

Bit 17: Flag Lampe an

Bit 18 bis Bit 32: nicht benutzt

comflag

Bit 0: Daten senden starten

Bit 1: Senden beendet, Modempuffer enleeren starten

Bit 2: SOH Framebeginn wurde empfangen

Bit 3: Befehl wurde empfangen

_________________________________________________________________________________

Fachhochschule Mannheim Seite 100

Hochschule für Technik und Gestaltung


Aufbau und Inbetriebnahme eines Steuerungssystems zur Navigation und Beobachtung eines autonomen

Fahrzeugs

__________________________________________________________________________________________

Bit 4: Befehl Verfahrweg kommt wurde empfangen

Bit 5: Anzahl der Verfahrwegbytes wurde empfangen

Bit 6: ETP Frameende wurde empfangen

Bit 7: Datenempfang läuft

Bit 8: alle Daten empfangen

Bit 9: Laufzeitfehler Datenempfang

Bit 10: Zählfehler Datenempfang

Bit 11: zu viele Übertragungen

Bit 12: Rückmeldung nach Datenempfang läuft

Bit 13: wartenaufRückmeldung nach Daten senden

Bit 14: NC

Bit 15: NC

comflag1

Bit 0: NAK gekommen

Bit 1: kein ACK nach x Versuchen

Bit 2: empfangene Daten ok

Bit 3: Wegnummer zurücksenden

Bit 4: Status zurücksenden

Bit 5 bis Bit 15: NC

Benutzte Bibliotheken

#include

#include

#include

#include

#include

#include

Definitionen Systemadressen und Werte

#define P3CFG 0xF824 // port 3 config register (386Ex)

#define INTCFG 0xF832 // interrupt config register (386Ex)

#define IRQ10 0x72 // irq10 interrupt Nummer Timer1

#define TMRCFG 0xF834 // Timer Konfig. Register

#define P3CFG 0xF824 // Port 3 Konfig.

#define PINCFG 0xF826 // Pin Konfig.

#define TMRCON 0xF043 // Timer Kontrollregister

#define TMR1 0xF041 // Timer1 Zählregister

#define PORT_A 0x60 // Adr. I/O Poert A

#define PORT_B 0x61 // Adr. I/O Poert B

#define PORT_C 0x62 // Adr. I/O Poert C

#define PORT_D 0x63 // Adr. I/O Poert D

#define PORT_E 0x64 // Adr. I/O Poert E

_________________________________________________________________________________

Fachhochschule Mannheim Seite 101

Hochschule für Technik und Gestaltung


Aufbau und Inbetriebnahme eines Steuerungssystems zur Navigation und Beobachtung eines autonomen

Fahrzeugs

__________________________________________________________________________________________

#define X1 0x3F8 //Basisadresse COM1

#define VEK1 0x0C //Interruptvektor IRQ4

#define FREI1 0xEF //Interruptfreigabe IRQ4 PIC

#define SPERR1 0x10 //Interrupt sperren IRQ4 PIC

#define BEST1 0x64 //Interruptbestätigung IRQ4 PIC

Definitionen Regler

#define KP1 1230 // Verstärkung Rad re.

#define TV1 61 // Vorhaltzeit Rad re.

#define TN1 55 // Nachstellzeit Rad re.

#define TA 5 // Abtastzeit Regler

#define A1 KP1*TA/TN1 // Konstante Integral Rad re.

#define B1 KP1*TV1/TA // Konstante Differential Rad re.

#define KP2 1230 // Verstärkung Rad li.

#define TV2 61 // Vorhaltzeit Rad li.

#define TN2 55 // Nachstellzeit Rad li.

#define A2 KP2*TA/TN2 // Konstante Integral Rad li.

#define B2 KP2*TV2/TA // Konstante Differential Rad li.

#define KP3 1050 // Verstärkung Diff.Regler

#define TV3 120 // Vorhaltzeit Diff.Regler

#define TN3 51 // Nachstellzeit Diff.Regler

#define A3 KP3*TA/TN3 // Konstante Integral Diff.Regler

#define B3 KP3*TV3/TA // Konstante Differential Diff.Regler

#define FAKTOR 100 //Verrechnungsfaktor Ist-Sollwert

Definitionen Positionierung

#define SCHLWEG 800 //Schleichweg bei Zielanfahrt

#define ANFWEG 6000 //Weg für Anfahrrampe

#define ABFWEG 9000 //Weg für Bremsrampe

#define MAXDRZ 3000 //Maximaldrehzahl

#define SCHLDRZ 450 //Schleichdrehzahl

#define POSDRZ 250 //Positionierdrehzahl f.Winkelausrichtung u.Sonarpos.

#define STGAN 2 //1/Steigung Anfahrrampe

#define STGAB 2 //1/Steigung Bremsrampe

#define ABST 600 //Plattenabstand beim Parken AE = 300mm

#define WI90 5670 //Pulswert für 90 grad Drehung

COM Framezeichen

#define ENQ 0x05 //Lebenszeichen /empf.

#define NAK 0x15 //Fehler Zeichen senden/empf.

#define ETP 0x17 //Ende Übertragung

#define ACK 0x06 //Rückmeldung Datenempf. ok

#define SOH 0x01 //Pull Zeichen Framebeginn /senden/empf.

#define BSTART 0x73 //Befehl Start- empf.

#define BSTOP 0x68 //Befehl Stop- empf.

#define BVW 0x56 //Befehl Verfahrweg kommt- empf.

#define STATUS 0x53 //Befehl Status- senden/empf.

#define WE 0x57 //Meldung Wegpunkt- erreicht senden

_________________________________________________________________________________

Fachhochschule Mannheim Seite 102

Hochschule für Technik und Gestaltung


Aufbau und Inbetriebnahme eines Steuerungssystems zur Navigation und Beobachtung eines autonomen

Fahrzeugs

__________________________________________________________________________________________

Definitionen Zeiten und Schaltwerte

#define SW 800 //Entfernungssollwert Kollisionsschutz AE = 400mm

#define LFZ1 1 //Ansprechzeit Kollisionsschutz 1=55ms

#define LFZ2 30 //Wiederanfahrzeit nach Anhalten 30=1,6s

#define BLZAN 9 //Blinkzeit LED an

#define BLZAUS 9 //Blinkzeit LED aus

#define LFZCOM1 20 //Laufzeit Datenempfang COM1

#define LFZCOM1_RM 72 //LFZ Empfang der Rückmeldung

#define LFZSE 10 //LFZ Modempuffer leeren

#define NAKMAX 10 //max. Anzahl der NAK Rückmeldungen

#define WINKELFAKTOR 63 //Faktor für Drehwinkelberechnung

#define WEGFAKTOR 213 //Faktor für Fahrwegberechnung

#define STATUSSEND 182 //Zeit f.zyklisches senden des Fahrzeugstatus

Unterprogr. Prototypen

void interrupt time_int(); //ISR Timer fuer Laufzeiten

void interrupt (*oldfunc)(); //IRQ Vektorklau von Echtzeituhr

void interrupt regler(); //ISR Regler DRZ u. POS

void interrupt (*oldirq10)(); //IRQ Vektorklau von Timer1 Int.

void interrupt irq4(); //ISR COM1 Datenempfang

void interrupt (*oldportisr)(); //IRQ vektorklau von COM1 Int.

void init(void); //Initialisierungsroutine

void blinker (void); //Blinkbit an / aus

int PID_Regler(long int kp,long int *yi,long int a,long int b,int e,int ealt,int uplim,int lowlim);

//Unterprg. PID-Regelalgorithmus

void fahren(void); //Unterprg. Wege abfahren

void parkfahrt(void); //Unterprg. Parkfahrt ausführen

void sonarpos (void); //Unterprg. Pos. mit Sonar

void winkel (void); //Unterprg. Fahzeug winkelig stellen

void drehung (void); //Unterprg. Drehung um 90 grad

void taste_lampe(void); //Unterprg. Start-/Resettaste u. Status LED

void empfang(void); //Unterprg. Datenempfangsfilter

void byteein(void); //Unterprg. Byte einlesen

void kontroll(void); //Unterprg. Zur Kontrolle der empfangenen Daten

void RM(void); //Unterprg. Rückmeldung empfangen

void senden1(void); //Unterprg. Status bzw. Wegnummer senden

void datfilt(void); //Unterprg. Empfangsdatenfilter

void senden(unsigned int *flag,int anz,int byte[],int *zeiger);

//Unterprg. Daten an Funkmodem senden

Globale Variablen fuer Laufzeiten

unsigned int timer1 = 0; //Ansprechzeit Kollisionsüberwachung Sonar

unsigned int timer2 = 0; //Wiederanlaufzeit Kollisionsüberwachung Sonar

unsigned int timer3=0; //AN Zeit Lampe

unsigned int timer4=0; //AUS Zeit Lampe

unsigned int timer5=0; //Modempuffer entleerzeit senden

unsigned int timer6=0; //LFZ Datenempfang

unsigned int timer7=0; //LFZ Reaktion von Gegenstation n.senden

unsigned int timer8=0; //LFZ Status senden

unsigned int timer9=0; //NC

_________________________________________________________________________________

Fachhochschule Mannheim Seite 103

Hochschule für Technik und Gestaltung


Aufbau und Inbetriebnahme eines Steuerungssystems zur Navigation und Beobachtung eines autonomen

Fahrzeugs

__________________________________________________________________________________________

Globale Variablen fürRegler

long int weg1=0; //Abgefahrener Istweg Rad li.

long int weg1h=0; //Aktueller Wert des Hardwarezählers Pulscoder Rad li.

int drz1=0; //Istdrehzahl Rad li.

int e1alt=0; //vorige Ist-soll-Diff. DRZ Rad li.

long int yi1=0; //Integralanteil PID-Regler Rad li.

long int a1=0; //Konstante f. Stellungsalgor. Rad li.

long int b1=0; //Konstante f. Stellungsalgor. Rad li.

int y1=0; //Reglerausgang Rad li.

int e1=0; //Reglereingang Rad li.

long int weg2=0; //Abgefahrener Istweg Rad re.

long int weg2h=0; //Aktueller Wert des Hardwarezählers Pulscoder Rad re.

int drz2=0; //Istdrehzahl Rad re.

int e2alt=0; //vorige Ist-soll-Diff. DRZ Rad re.

long int yi2=0; //Integralanteil PID-Regler Rad re.

long int a2=0; //Konstante f. Stellungsalgor. Rad re.

long int b2=0; //Konstante f. Stellungsalgor. Rad re.

int y2=0; //Reglerausgang Rad re.

int e2=0; //Reglereingang Rad re.

int e3alt=0; //vorige Ist-soll-Diff. Diff.Regler

long int yi3=0; //Integralanteil Diff.Regler

long int a3=0; //Konstante f. Stellungsalgor. Diff.Regler

long int b3=0; //Konstante f. Stellungsalgor. Diff.Regler

int y3=0; //Reglerausgang Diff.Regler

int e3=0; //Reglereingang Diff.Regler

long int sollwegp=0; //zu fahrender Weg in Impulsen

long int yh=0; //gefahrener Weg Rad re.

long int yh1=0; //gefahrener Weg Rad li.

long int yp=0; //Solldrehzahl des Antriebs

long int yph=0; //Zwischenspeicher der Anlauframpendrehzahl

sonstige Variablen

long int fahrweg[51]; //Tabelle der Fahrwege in Impulsen

int weginfo[51]; //Tabelle der Weginfobytes

int fwzeig=0; //Fahrwegzeiger für Fahrroutine

unsigned long int flag1=0; //Istzustaende Programm (32 Flags)

int fzaehl=0; //Fahrtenzähler f. Parkfahrt Sonarposi.

int entf1=4095; //Analogwert für Entfernungsmesser (Sonar) li.

int entf2=4095; //Analogwert für Entfernungsmesser (Sonar) re.

int weganz=0; //Anzahl der abzufahrenden Wege

Globale Variablen für Kommunikation

unsigned int comflag=0; //Istzustände Kommunikation (16 Flags)

unsigned int comflag1=0; //Istzustände Kommunikation (16 Flags)

int anzsend=0; //Anzahl der zu sendenden Bytes

int sendpuf[1000]; //Sendepuffer

int sendpufzeig=0; //Zeiger für Sendepuffer

int empfpuf[1000]; //Empfangspuffer

int empfzei=0; //Zeiger für Empfangspuffer

int com1fz=0; //Fehlerzähler 1 Datenempfang

int com1fz2=0; //Fehlerzähler 2 Übertragunsversuche Empfang

_________________________________________________________________________________

Fachhochschule Mannheim Seite 104

Hochschule für Technik und Gestaltung


Aufbau und Inbetriebnahme eines Steuerungssystems zur Navigation und Beobachtung eines autonomen

Fahrzeugs

__________________________________________________________________________________________

int com1fz3=0; //Fehlerzähler 3 Sendeversuche

int flagwert=0; //Wert, welches Schrittflag gesetzt werden soll empfang()

int comwegzaehl=0; //Zähler, wieviele Verfahrwegbytes empfangen sind

int comweganz=0; //Anzahl der kommenden Verfahrwegbytes

7.1.2 main() (Hauptprogramm)

int main(void)

{

init(); //Initialisierungsroutine aufrufen

while(!kbhit()) //Schleife solange keine Taste gedrückt wird

{

fahren(); //Zyklischer Aufruf des Unterprg. "fahren"

blinker(); //Zyklischer Aufruf des Unterprg. "blinker"

taste_lampe(); //Zyklischer Aufruf des Unterprg. "taste_lampe"

senden(&comflag,anzsend,sendpuf,&sendpufzeig); //Senderoutine zyklisch aufr.

senden1();

//Abfragen bei Datenempfang

if(comflag&0x100) kontroll(); //Wenn Daten von LR komplett empf.Kontrollroutine

if((comflag&0x80) && (timer6 >=LFZCOM1)) //wenn Überwachungszeit abgelaufen

{ //und Datenempfang nicht komplett abgeschlossen ist...

comflag=comflag&0x03; //alle Schrittflags löschen

comflag=comflag|0x200; //Flag LFZ gekommen setzen

empfzei=0; //Zeiger f. Empfangspuffer zurücksetzen

com1fz=0; //Fehlerzähler1 zurücksetzen

}

if(comflag&0x200) //Wenn LFZ Flag gesetzt ist...

{ //NAK an LR senden

anzsend=1; //Anzahlder zu sendenden Bytes festlegen

sendpuf[1]=NAK; //NAK in Sendepuffer schreiben

comflag=comflag|0x01; //und über Modem senden

comflag=comflag|0x1000; //Rückmeldung nach Datenempfang läuft

comflag=comflag&~0x200; //und LFZ Flag zurücksetzen

}

if(comflag1&0x04) //wenn Empfangene Daten ok

{

datfilt(); //dann Datenfilter und Sortierroutine aufr.

}

//Abfragen nach senden der Daten

if((comflag&0x2000) && (timer7 >= LFZCOM1_RM) && (comflag1&0x02)==0)

//Wenn nach Überw.zeit keine Rückmeldung kommt

{

comflag1=comflag1|0x01; //Flag NAK gek. setzen

com1fz3 ++; //Sendeversuchszähler erhöhen

if(com1fz3>=NAKMAX) //sind maximale Sendeversuche erreicht dann...

{

comflag1=comflag1|0x02; //Flag kein ACK nach NAKMAX-Versuchen setzen

comflag1=comflag1&~0x01; //Flag NAK gekommen löschen

com1fz3=0; //Sendeversuchszähler löschen

_________________________________________________________________________________

Fachhochschule Mannheim Seite 105

Hochschule für Technik und Gestaltung


Aufbau und Inbetriebnahme eines Steuerungssystems zur Navigation und Beobachtung eines autonomen

Fahrzeugs

__________________________________________________________________________________________

}

comflag=comflag&~0x2000; //Flag warten auf Rückmeldung löschen

}

if(comflag1&0x01) //wenn flag NAK gekommen da...

{

comflag1=comflag1&~0x01; //Flag NAK gekommen löschen

comflag=comflag&~0x2000; //Flag warten auf Rückmeldung löschen

comflag=comflag|0x01; //Daten nochmal senden

}

}

_dos_setvect(28,oldfunc); //geklauten IRQ-Vektor an System zurückgeben

//Systemtimer (Softwareinterrupt)

disable(); //Interrupts sperren

setvect(IRQ10,oldirq10); //IRQ-Vektor von Timer1 an System zurückgeben (386EX)

setvect(VEK1,oldportisr); //alten Vektor von IRQ4 zur ckgeben

outportb(0x21,inportb(0x21)|SPERR1); //IRQ4 sperren

outportb(0xA1,inportb(0xA1) | 0x04 ); //IRQ10 in PIC2 sperren Counter1

outportb(0x21,inportb(0x21) | 0x04 ); //IRQ2 sperren d.h. PIC2 IRQ sperren

enable(); //Interrupts freigeben

outportb(PORT_E,inport(PORT_E)|0x04); //Hardwarezaehler Pulscoder freigeben

outportb(PORT_E,inportb(PORT_E)&~ 0x03);//Pulsfreigaben Antrieb wegnehmen

return 0; //Rücksprung zum DOS

}

7.1.3 init() (Initialisierungsroutine)

void init() //Initialisierungsroutine

{

unsigned char zeichen; //Dummy zum leerlesen von Registern

oldfunc=_dos_getvect(28); //IRQ-Vektor von Echtzeituhr zwischenspeichern

_dos_setvect(28,time_int); //IRQ-Vektor auf Timer-Routine stellen

outportb(TMRCFG,inportb(TMRCFG) & 0xF7); //Gate1 an Vcc legen (immer frei)

outportb(TMRCFG,inportb(TMRCFG) | 0x04); //CLKIN1 an TMRCLK1 (1.19 MHz)

outportb(TMRCON,0x70); //r/w LSB -> MSB,Mode0,counter1

outportb(TMR1, 0x3E); // LSB als Zaehlwert schreiben

outportb(TMR1, 0x17); // MSB als Zaehlwert schreiben

//Gesamtteiler 173Eh=5950d=1.19MHz/5950=200Hz

//200Hz = 5ms Abtastzeit der Regelung

disable(); //Interrupts sperren

oldirq10=getvect(IRQ10); //IRQ-Vektor zwischenspeichern

setvect(IRQ10,regler); //neuen IRQ-Vektor auf ISR-Regler stellen

outportb(0x21,inportb(0x21)&~0x04); //IRQ2 freigeben d.h. PIC2 IRQ zulassen

outportb(0xA1,inportb(0xA1)&~0x04); //IRQ10 in PIC2 freigeben Counter1

outportb(X1+3,0x80); //Zugriff auf Baudratengenerator erlauben DLAB=1

outportb(X1+1,0);outportb(X1+0,12); //Baudrate 9600 einstellen

_________________________________________________________________________________

Fachhochschule Mannheim Seite 106

Hochschule für Technik und Gestaltung


Aufbau und Inbetriebnahme eines Steuerungssystems zur Navigation und Beobachtung eines autonomen

Fahrzeugs

__________________________________________________________________________________________

outportb(X1+3,0x03); //8,1,no einstellen und DLAB=0

zeichen=inportb(X1+0); //Eingangspuffer leeren

outportb(X1+1,0x01); //Interruptauslösung für Empfangsdaten setzen

outportb(X1+4,0x08); //Interrupt freigeben

zeichen=inportb(X1+2); //Anzeigeregister leerlesen

oldportisr=getvect(VEK1); //alten IRQ4 Vektor sichern

setvect(VEK1,irq4); //IRQ4 Vektor auf irq4 Routine stellen

outportb(0x21,inportb(0x21)&FREI1); //PIC freigeben

outportb(X1+4,inportb(X1+4)&~0x02); //RTS löschen

zeichen= inportb(X1+6); //Modemstatusreg löschen

enable(); //Interrupts wieder freigeben

outportb(0x65,inportb(0x65)|0x90); //Port E als Ausgänge setzen

outportb(0x65,inportb(0x65)&~0x01); //Port A als Eingänge setzen

outportb(0x65,inportb(0x65)|0x02); //Port B als Ausgänge setzen

a1=A1; //Konstanten für Stellungsalgorithmus ber.

b1=B1; // "

a2=A2; // "

b2=B2; // "

a3=A3; // "

b3=B3; // "

flag1=0;

}

7.1.4 fahren() (Unterprogramm Wege abfahren)

void fahren(void)

{

if(flag1 & 0x01) //Startflag gesetzt? wenn nein -> Ende

{ //Wenn ja ->

if(flag1&0x80) //wenn Parkfahrt läuft dann Routine Parkfahrt

{

parkfahrt(); //aufrufen

}

else //ansonsten

{

if(flag1 & 0x02) //Positionierung fertig ? wenn nein -> *

{ //Wenn ja ->

if(weganz != fwzeig) //Alle Wege abgefahren ? Wenn ja **

{

fwzeig ++; //Wenn nein -> Fahrwegzeiger +1

printf("Zeiger = %u\n",fwzeig);

comflag1=comflag1|0x08; /Flag Wegnummer senden setzen

outportb(PORT_E,inportb(PORT_E)&~0x30); //Beide Räder auf Vorwärtsfahrt

if(weginfo[fwzeig] & 0x01) //Rückwärtsfahrt angefordert ?

{ //Wenn ja ->

outportb(PORT_E,inportb(PORT_E)|0x30); //Beide Räder auf Rückwärtsf.

}

if(weginfo[fwzeig] & 0x02) //Drehung rechts angefordert ?

{ //Wenn ja ->

outportb(PORT_E,inportb(PORT_E)|0x10); //Rad rechts auf Rückwärtsf.

}

if(weginfo[fwzeig] & 0x04)//Drehung links angefordert ?

{ //Wenn ja ->

_________________________________________________________________________________

Fachhochschule Mannheim Seite 107

Hochschule für Technik und Gestaltung


Aufbau und Inbetriebnahme eines Steuerungssystems zur Navigation und Beobachtung eines autonomen

Fahrzeugs

__________________________________________________________________________________________

}

}

outportb(PORT_E,inportb(PORT_E)|0x20); //Rad links auf Rückwärtsf.

}

if(weginfo[fwzeig] & 0x80) //Parkfahrt angefordert

{

flag1=flag1|0x80; //Flag "Parkfahrt" setzen

flag1=flag1|0x800; //Flag "Fahrt auf Platte1" setzen

flag1=flag1|0x100; //Flag "Sonarpositionierung" setzen

}

outportb(PORT_E,inportb(PORT_E)|0x03); //Pulsfreigaben setzen

flag1=flag1&~0x18; //Positionierflags rückwärts löschen (redundant)

sollwegp=fahrweg[fwzeig]; //Sollweg an Regler übergeben

weg1=0; //Wegzähler nullen(redundant)

weg2=0; // " " "

flag1=flag1&~0x60; //Räder positioniert Flags löschen !!!

flag1=flag1 &~0x02; //Weg fertig Flag löschen

}

else

{

flag1=flag1 &~0x01; //** Startflag zurücksetzen -> alle Wege abgefahren

fwzeig=0; //Fahrwegzeiger löschen

}

}

else

{

if(weginfo[fwzeig]==0) //Wenn Vorwärtsfahrt läuft dann Kollisions-

{ //überwachung durchlaufen

if((entf1 LFZ2) //nach Ablauf der Wiederanlaufzeit

{ //Pulsfreigaben setzen und Flag Objekt

outportb(PORT_E,inportb(PORT_E)|0x03); //in Erfassungsber.

flag1=flag1 &~0x04; //registriert zurücksetzen

}

}

}

}

}

}

_________________________________________________________________________________

Fachhochschule Mannheim Seite 108

Hochschule für Technik und Gestaltung


Aufbau und Inbetriebnahme eines Steuerungssystems zur Navigation und Beobachtung eines autonomen

Fahrzeugs

__________________________________________________________________________________________

7.1.5 parkfahrt() (Unterprogramm Park- bzw. Referenzfahrt)

void parkfahrt(void)

{

if(flag1&0x400) //90 Grad Drehung rechts angrfordert ??

{

drehung(); //wenn ja -> Unterprg. "drehung" aufrufen

}

if(flag1&0x200) //soll Fahrzeug winkelig ausgerichtet werden ??

{

winkel(); //wenn ja -> Unterprg. "winkel" aufrufen

}

if(flag1&0x100) //soll Positionierung mit Sonar erfolgen ??

{

sonarpos(); //wenn ja -> Unterprg. "sonarpos" aufrufen

}

if((flag1&0x800)==0&&(flag1&0x1000)==0) //Parkfahrt in Andokstation fertig ??

{

flag1=flag1|0x2000; //wenn ja -> Flag "Parkfahrt beendet" setzen und

fzaehl=0; //Fahrtenzähler f. Sonarpos. löschen

}

}

7.1.6 sonarpos() (Unterprogramm Positionierung mit Ultraschallsensoren)

void sonarpos (void)

{

if(entf2 > ABST) //Abstand von Platte zu gross ??

{

outportb(PORT_E,inportb(PORT_E)&~0x30); //Beide Räder vorwärtsfahrt

yp=POSDRZ; //DRZ = Schleichgang

outportb(PORT_E,inportb(PORT_E)|0x03); //Pulsfreigaben setzen

}

if(entf2 < ABST) //Abstand von Platte zu klein ??

{

outportb(PORT_E,inportb(PORT_E)|0x30); //Beide Räder rückwärts

yp=POSDRZ; //DRZ = Schleichgang

outportb(PORT_E,inportb(PORT_E)|0x03); //Pulsfreigaben setzen

}

if (entf2 == ABST) //Abstand von Platte ok ??

{

outportb(PORT_E,inportb(PORT_E)&~0x33); //Pulsfr. löschen u. beide Räder vorw.

yp=0; //DRZ Sollwert löschen

fzaehl++; //Fahrzähler um 1 erhöhen

if((fzaehl==1)||(fzaehl==3)) //nächster Schritt Winkel ausrichten ??

{

flag1=flag1|0x200; //wenn ja -> Flag "Winkel ausrichten"

flag1=flag1&~0x100; //setzen u.Flag "Sonarpos." löschen

}

if((fzaehl==2)||(fzaehl==4)) //nächster Schritt Drehung um 90 grad ??

{

flag1=flag1&~0x100; //wenn ja -> Flag "Sonarpos." löschen

flag1=flag1|0x400; //Flag "90 grad Drehung" setzen

outportb(PORT_E,inportb(PORT_E)|0x03); //Pulsfreigaben setzen

_________________________________________________________________________________

Fachhochschule Mannheim Seite 109

Hochschule für Technik und Gestaltung


Aufbau und Inbetriebnahme eines Steuerungssystems zur Navigation und Beobachtung eines autonomen

Fahrzeugs

__________________________________________________________________________________________

flag1=flag1&~0x18; //Pos. Flags "rückwärts" löschen

outportb(PORT_E,inportb(PORT_E)|0x10); //Rad rechts rücklauf

outportb(PORT_E,inportb(PORT_E)&~0x20); //Rad links vorlauf

weg1=0; //Wegzähler löschen

weg2=0; // " "

flag1=flag1&~0x60; //Räder pos. Flags löschen

sollwegp=WI90; //Sollweg = 90 grad

flag1=flag1&~0x02; //Flag "weg fertig" löschen

}

}

}

7.1.7 winkel() (Unterprogramm Fahrzeug parallel auf Platten ausrichten)

void winkel (void)

{

if(entf2 < entf1)

{

outportb(PORT_E,inportb(PORT_E)&~0x10); //Rad re. vorwärts

outportb(PORT_E,inportb(PORT_E)|0x20); //Rad li. rückwärts

yp=POSDRZ; //DRZ = Schleichdrehzahl

outportb(PORT_E,inportb(PORT_E)|0x03); //Pulsfreigaben setzen

}

if(entf2 > entf1)

{

outportb(PORT_E,inportb(PORT_E)|0x10); //Rad re. rückwärts

outportb(PORT_E,inportb(PORT_E)&~0x20); //Rad li. vorwärts

yp=POSDRZ; //DRZ = Schleichdrehzahl

outportb(PORT_E,inportb(PORT_E)|0x03); //Pulsfreigaben setzen

}

if(entf2 == entf1)

{

yp=0;

outportb(PORT_E,inportb(PORT_E)&~0x10); //Pulsfreigaben löschen

outportb(PORT_E,inportb(PORT_E)&~0x30); //Beide Räder vorwärts

flag1=flag1&~0x200; //Flag "auf Winkel ausrichten" löschen

flag1=flag1|0x100; //Flag "Sonarpos." setzen

}

}

7.1.8 drehung() (Unterprogramm 90° Rechtsdrehung)

void drehung (void)

{

if(flag1&0x02) //Flag "Weg fertig" da ??

{ //wenn ja ->

if(flag1&0x800) //Flag "Fahrt auf Platte1" da ??

{ //wenn ja -> **

flag1=flag1&~0x800; //Flag "Fahrt auf Platte1" löschen

flag1=flag1|0x1000; //Flag "Fahrt auf Platte2" setzen

flag1=flag1|0x100; //Flag "Sonarposi." setzen

flag1=flag1&~0x400; //Flag "Drehung um 90 grad" löschen

}

_________________________________________________________________________________

Fachhochschule Mannheim Seite 110

Hochschule für Technik und Gestaltung


Aufbau und Inbetriebnahme eines Steuerungssystems zur Navigation und Beobachtung eines autonomen

Fahrzeugs

__________________________________________________________________________________________

}

}

else //wenn nein -> **

{

flag1=flag1&~0x400; //Flag "Drehung um 90 grad" löschen

flag1=flag1&~0x1000; //Flag "Fahrt auf Platte2" löschen

}

7.1.9 blinker() (Unterprogramm Blinkbit für LED erzeugen)

void blinker (void)

{

if(timer3 < BLZAN) //Leuchtzeit kleiner Wert ??

{

flag1=flag1|0x4000; //dann Blinkflag setzen und Timer für

timer4=0; //Dunkelzeit löschen

}

if((timer4 < BLZAUS)&&(timer3>BLZAN)) //Leuchtzeit abgelaufen und Dunkelzeit

{ //noch aktiv ??

flag1=flag1&~0x4000; //dann Blinkflag löschen

}

if(timer4>BLZAUS) timer3=0; //Dunkelzeit abgelaufen ??

//dann Timer für Leuchtzeit löschen

} //die Timervariablen werden im Systemzeitinterrupt alle 55ms um 1 erhöht

7.1.10taste_lampe() (Unterprogramm Bedienteil)

void taste_lampe(void)

{

if((inportb(PORT_A)&0x01)&&(flag1&0x01)==0&&(flag1&0x2000)==0&&(flag1&0x8000)

==0) // Wenn Taste gedrückt u. Pos. nicht gestartet u. Parken beendet

{ //u. kein Sammelfehler -> dann

flag1=flag1|0x01; //Pos. starten v. Ladest.

}

if((inportb(PORT_A)&0x01)&&(flag1&0x01)&&(flag1&0x2000)&&(flag1&0x8000)==0)

{ //wenn Taste gedr. u. pos. läuft u. parken beendet u. k. Fehl.

flag1=flag1&~0x2080; //Start von Andokst.

}

if(((flag1&0x4000)&&(flag1&0x2000))||((flag1&0x4000)&&(flag1&0x01)==0)||

(flag1&0x8000)) //wenn Blinkbi=1 u.park.beendet o.Blinkb.=1

{ //u.kein.Pos. o.Fehler

flag1=flag1|0x10000; //Lampe ansteuern

}

else //ansonsten

{

flag1=flag1&~0x10000; // Lampe n. ansteuern

}

if((flag1&0x10000)&&(flag1&0x20000)==0) //wenn Lampe anst. u.Lampe ein

{

outportb(PORT_B,inportb(PORT_B)|0x01); //Lampe grün ein

flag1=flag1|0x20000; //Lampe ein setzen

}

_________________________________________________________________________________

Fachhochschule Mannheim Seite 111

Hochschule für Technik und Gestaltung


Aufbau und Inbetriebnahme eines Steuerungssystems zur Navigation und Beobachtung eines autonomen

Fahrzeugs

__________________________________________________________________________________________

if((flag1&0x10000)==0&&(flag1&0x20000)) //wenn Lampe n.ansteuern u.

{ //Lampe ein dann

outportb(PORT_B,inportb(PORT_B)&~0x01); //Lampe grün abschalten

flag1=flag1&~0x20000; //Lampe ein zurücksetzen

}

}

7.1.11senden(...) (Unterprogramm Daten an Funkmodem senden)

void senden(unsigned int *flag,int anz,int byte[],int *zeiger)

{

int einl=0; //Zwischenspeicher Modemstatus

int einl1=0; //Zwischenspeicher Leitungsstatus

einl1=inportb(X1+5); //Leitungsstatus einlesen

einl=inportb(X1+6); //Modemstatusreg. einlesen

if((*flag&0x02)!=0 && (timer5>=LFZSE)) //Senden Ende und entleerungszeit abgel.?

{

outportb(X1+4,inportb(X1+4)&~0x02); //RTS löschen

*flag=*flag&~0x02; //Senden Ende Flag löschen

if((*flag&0x1000)!=0) //nur Rückmeldung gesendet ?

{ //-> ja

*flag=*flag&~0x1000; //Rückmeldeflag löschen

} //-> nein

else

{

*flag=*flag|0x2000; //auf Rückmeldung warten Flag setzen

timer7=0; //LFZ Rückmeldung starten

}

}

if(*flag&0x01) //Flag Daten senden da ?

{ //wenn ja ->

outportb(X1+4,inportb(X1+4)|0x02); //RTS setzen

if((einl&0x10)!=0 && (einl1&0x20)!=0) //ist CTS von Modem gekommen u. Sende-

{ //datenregister leer ? wenn ja ->

*zeiger=*zeiger+1; //Zeiger für Sendepuffer erhöhen

outportb(X1,byte[*zeiger]); //Byte von Sendepuffer ausgeben

if(anz!=*zeiger) return; //alle Daten gesendet wenn nein -> Ende

else //wenn ja ->

{

*flag=*flag&~0x01; //Sendeflag löschen

*flag=*flag|0x02; //Sendendeflag setzen

timer5=0; //Modempuffer Entleerungszeit starten

*zeiger=0; //Zeiger des Sendepuffers löschen

}

}

}

}

_________________________________________________________________________________

Fachhochschule Mannheim Seite 112

Hochschule für Technik und Gestaltung


Aufbau und Inbetriebnahme eines Steuerungssystems zur Navigation und Beobachtung eines autonomen

Fahrzeugs

__________________________________________________________________________________________

7.1.12 senden1() (Unterprogramm Status und Wegnummer senden)

void senden1(void)

{

if(timer8 >= STATUSSEND) //Zeit um Status zu senden abgelaufen ?

{

comflag1=comflag1|0x10; //Flag Status senden setzen

timer8=0; //Zeit neu starten

}

if(comflag1&0x08 && (comflag&0x31FF)==0) // soll Wegnummer gesendet werden

{ //u. keine Kommunikationsfehler

sendpuf[1]=1; //Wegnummer in Sendepuffer schreiben

sendpuf[2]=WE;

sendpuf[3]=fwzeig;

sendpuf[4]=ETP;

anzsend=4; //Byteanzahl setzen

comflag=comflag|0x01; //senden starten

comflag1=comflag1&~0x08; //Flag Wegnummer senden löschen

}

if(comflag1&0x10 && (comflag1&0x08)==0 && (comflag&0x31FF)==0)

//Status senden angefordert

{ //u. Wegnummer gesendet o. n. angef. u. keine Kommunikationsfehler

sendpuf[1]=1; //Status in Bytes umrechnen

sendpuf[2]= STATUS; //und in Sendepuffer schreiben

sendpuf[7]=ETP;

anzsend=7;

sendpuf[3]=(flag1&0xFF000000) >> 24;

sendpuf[4]=(flag1&0xFF0000) >> 16;

sendpuf[5]=(flag1&0xFF00) >> 8;

sendpuf[6]=flag1&0xFF;

comflag=comflag|0x01; //senden starten

comflag1=comflag1&~0x10; //Status senden angef. Flag löschen

}

}

7.1.13kontroll() (Unterprogramm zur Kontrolle der empfangenen Daten)

void kontroll()

{

if(com1fz==0) //...wenn keine Übertragungsfehler gekommen...

{

anzsend=1; //Anzahlder zu sendenden Bytes festlegen

sendpuf[1]=ACK; //ACK in Sendepuffer schreiben

comflag=comflag|0x01; //und über Modem senden

comflag=comflag&~0x600; //Fehlerflags zurücksetzen

comflag=comflag|0x1000; //Rückmeldung nach Datenempfang läuft

comflag1=comflag1|0x04; //Flag Empfangene Daten ok setzen

com1fz2=0; //Fehlerzähler 2 zurücksetzen

}

_________________________________________________________________________________

Fachhochschule Mannheim Seite 113

Hochschule für Technik und Gestaltung


Aufbau und Inbetriebnahme eines Steuerungssystems zur Navigation und Beobachtung eines autonomen

Fahrzeugs

__________________________________________________________________________________________

else //wenn Übertragungsfehler gekommen dann...

{

anzsend=1; //Anzahlder zu sendenden Bytes festlegen

sendpuf[1]=NAK; //NAK in Sendepuffer schreiben

comflag=comflag|0x01; //und über Modem senden

comflag=comflag|0x1000; //Rückmeldung nach Datenempfang läuft

empfzei=0; //gültige Datenanzahl auf 0 setzen

com1fz2++; //Fehlerzähler 2 (Übertragungsversuche) erhöhen

if(com1fz2==3) //sind schon 3 Übertragungsversuche gemacht worden...

{

comflag=comflag|0x800; //...Fehlerflag setzen

}

}

com1fz=0;

comflag=comflag&~0x100; //"Daten empf." Flag zurücksetzen

}

7.1.14datfilt() (Unterprogramm Empfangsdatenfilter)

void datfilt(void) //Empfangsdatenfilter

{

int hz=3; //lokaler Hilfszähler

int t=0; //lokale Laufvariable

if(empfpuf[1]==BVW && (flag1&0x01)==0) //wurde Befehl Verfahrweg empfangen ???

{ //wenn ja ->

for(t=1;t

fahrweg[t]=fahrweg[t]*WINKELFAKTOR; //Winkel in Imp. umrechnen

}

else //wenn nein ->

{

fahrweg[t]=fahrweg[t]*WEGFAKTOR; //Fahrweg in Imp. berechnen

}

hz=hz+3;

} //Hilfszähler erhöhen

weganz=empfpuf[2]/3; //Anz. d. Wege festlegen

}

if(empfpuf[1]==BSTART && weganz!=0) //Wenn Befehl Start gekommen

{

flag1=flag1|0x01; //Starten des Fahrzeugs von Ladestation

}

if(empfpuf[1]==BSTART && (flag1&0x01)&&(flag1&0x2000)&&(flag1&0x8000)==0)

{ //Wenn Befehl Start gekommen u.Fahrzeug nicht auf Ladestation

flag1=flag1&~0x2080; //Fahrzeug von Ladestation starten

}

empfzei=0; //Empfangszeiger löschen

comflag1=comflag1&~0x04; //Flag Daten ok löschen

}

_________________________________________________________________________________

Fachhochschule Mannheim Seite 114

Hochschule für Technik und Gestaltung


Aufbau und Inbetriebnahme eines Steuerungssystems zur Navigation und Beobachtung eines autonomen

Fahrzeugs

__________________________________________________________________________________________

7.1.15time_int() (ISR für interne Laufzeiten)

void interrupt time_int()

{

outportb(PORT_E,inportb(PORT_E)^0x40); //Lebenszeichen von Rechner ausgeben

timer1=timer1+1; //mitlaufender Timer1 Ansprechzeit Kollisionsschutz

timer2=timer2+1; //mitlaufender Timer2 Wiederanlaufzeit nach Kollision

timer3=timer3+1; //mitlaufender Timer3 Lampe an Zeit

timer4=timer4+1; //mitlaufender Timer4 Lampe aus Zeit

timer5=timer5+1; //mitlaufender Timer5 Modempuffer leeren

timer6=timer6+1; //mitlaufender Timer6 Überw.zeit COM1

timer7=timer7+1; //mitlaufender Timer7 LFZ Reaktion nach senden

timer8=timer8+1; //mitlaufender Timer8 LFZ Status senden

}

//Da Software Int. benutzt wird muss Int. nicht quittiert werden !!

7.1.16 regler() (ISR für die Regelung des Antriebs)

void interrupt regler()

{

outportb(PORT_E,inportb(PORT_E)|0x80); //Ausgang f. Durchlaufzeitmessung setzen

disable(); //Interrupts sperren

weg2h=inportb(PORT_D); //Hardwarezähler Rad re. einlesen

weg1h=inportb(PORT_C); //Hardwarezähler Rad li. einlesen

outportb(PORT_E,inport(PORT_E)|0x0C); //Hardwarezaehler löschen

outportb(PORT_E,inport(PORT_E)&~0x0C); //und wieder freigeben

drz1 = weg1h*FAKTOR; // Istdrehz. Rad li. berechnen

drz2 = weg2h*FAKTOR; // Istdrehz. Rad re. berechnen

if((flag1&0x100)==0&&(flag1&0x200)==0) //Wenn keine Parkfahrt und kein

{ //ausrichten auf Winkel läuft dann ->

if (flag1&0x08) //Läuft Rad re. rückwärts ??

{ //wenn ja->

weg2 = weg2 - weg2h; //eingelesene Impulse Rad re.von

} //Wegvariable subtrahieren

else //wenn nein->

{ //eingel. Impulse Rad re. zu Wegvariable

weg2=weg2+weg2h; //addieren

}

if (flag1&0x10) //läuft Rad li. rückwärts ??

{ //wenn ja->

weg1 = weg1 - weg1h; //eingel. Impulse Rad li.von Wegvariable

} //subtrahieren

else //wenn nein ->

{ //eingel. Impulse Rad li. zu Wegvariable

weg1=weg1+weg1h; //addieren

}

yp=sollwegp-weg2; //Soll-Ist-Diff. Pos. berechnen Messung

//mit Pulsgeber Rad re.

_________________________________________________________________________________

Fachhochschule Mannheim Seite 115

Hochschule für Technik und Gestaltung


Aufbau und Inbetriebnahme eines Steuerungssystems zur Navigation und Beobachtung eines autonomen

Fahrzeugs

__________________________________________________________________________________________

if(weg2>(sollwegp-SCHLWEG-ABFWEG)) //Bremsrampe

{

yp=(sollwegp-SCHLWEG-weg2)/STGAB;

if(yp>yph) yp=yph;

if((ypweg2))

{

yp=SCHLDRZ;

}

}

if((yp>MAXDRZ)&&(weg2MAXDRZ) yp=MAXDRZ;

yph=yp;

}

if((yp>MAXDRZ)&&(weg2>=ANFWEG)&&(weg2


Aufbau und Inbetriebnahme eines Steuerungssystems zur Navigation und Beobachtung eines autonomen

Fahrzeugs

__________________________________________________________________________________________

if ((yh1==0)) //Wenn Rad li. positioniert dann...

{

outportb(PORT_E,inportb(PORT_E) & ~0x01); // Pulsfreigabe löschen

flag1=flag1|0x40; //siehe Rad re.

yi3=0;

yi1=0;

e1alt=0;

e3alt=0;

y3=0;

}

if ((flag1&0x40)&&(flag1&0x20)) //Wenn beide Räder positioniert...

{

yp=0; // Restweg löschen

sollwegp=0; // Sollwegvorgabe löschen

weg1=0; // Wegzähler löschen

weg2=0; // " "

yph=0; //Zwischenspeicher löschen

outportb(PORT_E,inportb(PORT_E) & ~0x30); //Beide Räder auf Vorwärtsfahrt

flag1=flag1&~0x78; //Flagbits 3-6 löschen

flag1=flag1 | 0x02; // Flag Weg fertig setzen

}

}

if ((flag1&0x20)==0&&(flag1&0x40)==0&&(flag1&0x04)==0) //Diff.Regler nur benutzen

{ //wenn beide Räder nochnicht pos. sind und kein Objekt im Erf.bereich

e3=drz1-drz2; //DRZ Diff.Rad li. Rad re. bilden

y3=PID_Regler(KP3,&yi3,a3,b3,e3,e3alt,1000,-1000); //Diff.SW berechnen

e3alt=e3; //Differenz zwischenspeichern

}

if ((flag1&0x40)==0&&(flag1&0x04)==0) //DRZ-Regler Rad li.nur benutzen wenn

{ //Rad li.noch nicht positioniert ist und kein Objekt im Erf.bereich

e1=(yp-drz1)-y3; //DRZ Soll-Ist-Differenz bilden Rad li.

y1=PID_Regler(KP1,&yi1,a1,b1,e1,e1alt,4095,0); //Stellwert berechnen Rad li.

e1alt = e1; //Differenz zwischenspeichern

}

if ((flag1&0x20)==0&&(flag1&0x04)==0) //DRZ-Regler Rad re.nur benutzen wenn

{ //Rad re.noch nicht positioniert ist und kein Objekt im Erf.bereich

e2=(yp-drz2)+y3; //DRZ Soll-Istdifferenz bilden Rad re.

y2=PID_Regler(KP2,&yi2,a2,b2,e2,e2alt,4095,0); //Stellwert berechnen Rad re.

e2alt=e2; //Differenz zwischenspeichern

}

if(flag1&0x04) //Wenn Objekt in Erfassungsbereich bei

{ //Vorwärtsfahrt dann

sollwegp=sollwegp-weg2; //neuen Positioniersollwert berechnen

weg2=0; //gefahrene Wege löschen

weg1=0; //und Reglerspeicher löschen

yi3=0; // I-Anteil Diff.Regler löschen

yi2=0; // I-Anteil Regler Rad re. löschen

e2alt=0; // Altwerte Diff.Regler und DRZe3alt=0;

// Regler Rad re. löschen

y3=0; // Ausgabewert Diff.Regler löschen

y1=0; // Ausgabewert DRZ-Regler Rad li. löschen

y2=0; // Ausgabewert DRZ-Regler Rad re. löschen

yi1=0; // I-Anteil Regler Rad li. löschen

_________________________________________________________________________________

Fachhochschule Mannheim Seite 117

Hochschule für Technik und Gestaltung


Aufbau und Inbetriebnahme eines Steuerungssystems zur Navigation und Beobachtung eines autonomen

Fahrzeugs

__________________________________________________________________________________________

e1alt=0; // Altwert Regler Rad li. löschen

} //nötig um nach Notstop weiches Anlaufen zu erhalten !!!

PutD2AChannel(1); //DRZ Sollwert Rad re. ausgeben

PutD2A(y2); // " " " " "

PutD2AChannel(0); //DRZ Sollwert Rad li. ausgeben

PutD2A(y1); // " " " " "

outportb(TMR1, 0x3E); // Counter1 LSB Wert Abtastzeit einschreiben

outportb(TMR1, 0x17); // Counter1 MSB Wert Abtastzeit einschreiben

//Gesamtteiler 173Eh=5950d (1.19MHz/5950=200Hz)

//entspricht 5ms Abtastzeit

outportb(0xA0,0x20); // Int. Quittierung PIC2

outportb(0x20,0x20); // Int. Quittierung PIC1

enable(); // Interrupts wieder freigeben

PutA2DChannel(0); //Analogwert von Sonarbero li. einlesen

entf1=GetA2D(); // " " " "

PutA2DChannel(1); //Analogwert von Sonarbero re. einlesen

entf2=GetA2D(); // " " " "

outportb(PORT_E,inportb(PORT_E)&~0x80); //Ausgang für Durchlaufzeitmessung rücks.

}

7.1.17PID_Regler(...) (Unterprogramm Regelalgorithmus)

int PID_Regler(long int kp,long int *yi,long int a,long int b,int e,int ealt

,int uplim,int lowlim)

{

int y; //lokal Stellwert

long int yp; //lokal Stellwert P-Anteil

long int yd; //lokal Stellwert D-Anteil

yp= kp*e >> 10; //Ber. Stellwert P-Anteil

*yi=*yi+(a*e >>10); //Ber. Stellwert I-Anteil

yd=(b*(e - ealt))>> 10; //Ber. Stellwert D-Anteil

y=yp+*yi+yd; //Ber. Gesamtstellwert

if (*yi > uplim) *yi=uplim; //Begr. I-Anteil

if (*yi < lowlim) *yi= lowlim; // " "

if (y > uplim) y=uplim; //Begr. Gesamtstellwert

if (y < lowlim) y= lowlim; // " "

return y; //Funtionsrueckgabe Gesamtstellwert

}

_________________________________________________________________________________

Fachhochschule Mannheim Seite 118

Hochschule für Technik und Gestaltung


Aufbau und Inbetriebnahme eines Steuerungssystems zur Navigation und Beobachtung eines autonomen

Fahrzeugs

__________________________________________________________________________________________

7.1.18 irq4() (ISR zum Empfang der Daten)

void interrupt irq4() //ISR wird durchlaufen wenn: Eingangspuffer der COM

//Schnittstelle sich ändert

{

int verbrat=0;

if(comflag&0x2000) //wenn Fahrzeug auf Rückmeldung wartet dann...

{

RM(); //Routine Rückmeldung empfangen starten

}

else //sonst...

{

if(comflag1&0x04) //läuft Datenfilterroutine dann...

{

verbrat=inportb(X1); //ankommende Datenignorieren

}

else empfang(); //sonst Empfangsroutine aufrufen

}

outp(0x20,BEST1); //Interrupt bestätigen

}

7.1.19 RM() (Unterprogramm Rückmeldung empfangen)

void RM(void)

{

int einl=0; //Zwischenspeicher für COM Eingangspuffer

einl=inp(X1); //COM Eingangspuffer einlesen

if(einl==ACK) //Ist Rückmeldung = ACK ? wenn ja ->

{

comflag1=comflag1&~0x03; //Fehlerflags zurücksetzen

com1fz3=0; //Sendeversuchszähler löschen

comflag=comflag&~0x2000; //Flag warten auf Rückmeldung löschen

}

else //wenn kein ACK empfangen dann...

{

comflag1=comflag1|0x01; //Flag NAK gekommen setzen

com1fz3 ++; //Sendeversuchszähler erhöhen

if(com1fz3>=NAKMAX) //sind maximale Sendeversuche erreicht dann...

{

comflag1=comflag1|0x02; //Flag kein ACK nach NAKMAX-Versuchen setzen

comflag1=comflag1&~0x01; //Flag NAK gekommen löschen

com1fz3=0; //Sendeversuchszähler löschen

comflag=comflag&~0x2000; //Flag warten auf Rückmeldung löschen

}

}

}

_________________________________________________________________________________

Fachhochschule Mannheim Seite 119

Hochschule für Technik und Gestaltung


Aufbau und Inbetriebnahme eines Steuerungssystems zur Navigation und Beobachtung eines autonomen

Fahrzeugs

__________________________________________________________________________________________

7.1.20 empfang() (Unterprogramm Daten empfangen)

void empfang()

{

int verbrat; //Dummy zum löschen des Empfangspuffers

if(comflag&0x100) //Wenn Datenempfang komplett abgeschlossen ist

{ //und empfangene Daten versogt werden

verbrat=inportb(X1+0); //dann Empfangspuffer leeren bzw. ankommende

//Daten ignorieren

return;

}

if ((comflag & 0x04)==0) //wenn SOH noch nicht gesendet wurde

{

flagwert=0x04; //dann Byte von RS-Puffer einlesen

byteein();

comflag=comflag|0x80; //Flag Datenempfang läuft setzen

timer6=0; //und Überwachungszeit starten

return; //auf nächstes Byte warten

}

if ((comflag&0x08)==0) //wenn Befehl noch nicht empfangen

{

flagwert=0x08; //dann Befehlsbyte einlesen

byteein();

return; //auf nächstes Byte warten

}

if (comflag&0x10) //wurde Befehl Verfahrweg kommt empfangen

{

if((comflag&0x20)==0) //und die Anzahl der kommenden Bytes noch nicht

{ //eigelesen, dann...

flagwert=0x20;

byteein(); //Anzahl der kommenden Bytes einlesen

comweganz=empfpuf[empfzei-1]; //Byteanzahl auf Vergleicher legen

comwegzaehl=0; //Weg-bzw. Bytezähler nullen und auf nächstes Byte warten

return;

}

if(comwegzaehl != comweganz) //sind noch nicht alle Wege bzw.

{ //Bytes gesendet worden...

flagwert=0x00; //dann Byte einlesen

byteein();

comwegzaehl++; //Bytezähler erhöhen

return; //und auf nächstes Byte warten

}

}

comflag=comflag&~0x10; //sind alle Wege eingelesen oder ist anderer

if((comflag&0x40)==0) //Befehl gekommen dann...

{

flagwert=0x40; //Endezeichen einlesen

byteein();

comflag=comflag&0x03; //alle Schrittflags zurücksetzen und

comflag=comflag|0x100; //Flag "Datenempfang fertig" setzen

return;

}

}

_________________________________________________________________________________

Fachhochschule Mannheim Seite 120

Hochschule für Technik und Gestaltung


Aufbau und Inbetriebnahme eines Steuerungssystems zur Navigation und Beobachtung eines autonomen

Fahrzeugs

__________________________________________________________________________________________

7.1.21 byteein() (Unterprogramm Byte einlesen)

void byteein()

{

int out; //lokale Variable zum Einlesen des Empfangspuffers RS

out=inp(X1+0); //ablegen des empf.Bytes in Zwischenspeicher

if((comflag & 0x10)==0) //wenn nicht Befehl "Verfahrweg kommt" gekommen

{ //und wenn nicht einer der g ltigen Befehle gekommen...

if((out==SOH)||(out==ENQ)||(out==BSTART)||(out==BSTOP)||

(out==BVW)||(out==STATUS)||(out==ETP))

{ //wenn Befehl "Verfahrweg kommt" da, dann Flag setzen

if(out == BVW) comflag=comflag|0x10;

}

else

{

com1fz++; //...dann Fehlerz„hler um 1 erhöhen

}

}

empfpuf[empfzei]=out; //Byte in Empfangsspeicher eintragen

empfzei++; //Zeiger un 1 erhöhen

comflag=comflag | flagwert; //entsprechendes Schrittflag setzen

}

_________________________________________________________________________________

Fachhochschule Mannheim Seite 121

Hochschule für Technik und Gestaltung


Aufbau und Inbetriebnahme eines Steuerungssystems zur Navigation und Beobachtung eines autonomen

Fahrzeugs

__________________________________________________________________________________________

7.2 Programmausdruck Leitrechnerdemo

Modul 1 Leit.BAS

Global empfpuf(1000) As Byte 'Empfangspuffer

Global empfzeig As Integer 'Zeiger für empfangspuffer

Global sendpuf(3000) As Integer 'Sendepuffer

Global sendzeig As Integer 'Zeiger für Sendepuffer

Global sendanz As Integer 'Anzahl der zu sendenden Daten

Global empfflag As Boolean 'Flag Empfang läuft

Global sendflag As Boolean 'Flag Senden läuft

Global sendendflag As Boolean 'Flag Senden beenden und Modempuffer leeren läuft

Global timing As Integer 'Verzögerung zum Modempuffer leeren

Global timing1 As Integer 'Verzögerung Rückmeldung schicken

Global wege(1000) As Integer 'eingegebene Wege

Global wegzeig As Integer 'Zeiger f. eing. Wege

Global weginfo(3000) As Integer 'Eingeg. Weginfos

Global sendweg(3000) As Integer 'Wege die umgerechnet sind u. gesendet werden können

Global sendanzahl As Integer 'Anzahl der zu sendenden Wege

Global flagspeic As Boolean 'Flag das Daten speichern gewählt

Sub umrechnung() 'Umrechnung der eing. Wege in Bytes

Dim hz As Integer 'Hilfszähler lokal

wegzeig = 0 'Wegzeiger löschen

hz = 4 'Hilfszähler auf 1. Wegdatum stellen

Do 'Schleife laufen lassen bis Weg u. Weginfo =0

wegzeig = wegzeig + 1 'Wegzähler erhöhen

Loop Until weginfo(wegzeig) = 0 And wege(wegzeig) = 0

wegzeig = wegzeig - 1 'Durch nachlaufende Schleife 1 zuviel !!

If wegzeig = 0 Then GoTo m1 'sollte kein Weg vorhanden sein alles ignorieren

sendweg(1) = 1 'Startzeichen STH

sendweg(2) = 86 'Befehl Verfahrweg kommt

sendweg(3) = wegzeig * 3 'Anzahl der Weg-Bytes die gesendet werden

For t = 1 To wegzeig 'Schleife starten (Wegzähler)

For tt = 1 To 3 'inere Schleife starten (Bytezähler)

If tt = 1 Then 'wenn erstes Byte von Dreierpaket dann ->

sendweg(hz) = (wege(t) And 65280) / 256 'umrechnen des hbytes

End If

If tt = 2 Then 'wenn zweites Byte von Dreiepaket dann ->

sendweg(hz) = wege(t) And 255 'umrechnen des low Bytes

End If

If tt = 3 Then 'wenn letztes Byte des Dreierpakets dan ->

sendweg(hz) = weginfo(t) 'Weginfo direkt ablegen

End If

hz = hz + 1 'Hilfszähler erhöhen

Next tt

Next t

sendweg(hz) = 23 'Endezeichen ETP

sendanzahl = wegzeig * 3 + 4 'Anzahl der zu sendenden Bytes festlegen

m1:

End Sub

_________________________________________________________________________________

Fachhochschule Mannheim Seite 122

Hochschule für Technik und Gestaltung


Aufbau und Inbetriebnahme eines Steuerungssystems zur Navigation und Beobachtung eines autonomen

Fahrzeugs

__________________________________________________________________________________________

Form1 Leit.FRM

Formglobale Variablen

Dim rmflag As Boolean 'Datensatzempfang läuft

Dim timing1 As Integer 'Zeitverzögerung 1

Dim timing2 As Integer 'Zeitverzögerung 2

Dim zae As Integer 'Bytezähler für Datensatzauswertung

Dim fehl As Boolean 'Fehlerflag für Empfangsfehler

Dim we As Boolean 'Flag Weg empfangen

Dim ack As Boolean 'ACK zurücksenden

Dim nak As Boolean 'NAK zurücksenden

Dim empfanz As Integer 'Anzahl der empfangenen Bytes

Private Sub auswert()

If rmflag1 = True Then 'Wenn Rückmeldung erwartet wird...

If empfpuf(1) = 6 Then 'wurde ACK empfangen ?

Text2.Text = Text2.Text + " ACK" 'wenn ja anzeigen

empfzeig = 0 'Zeiger von Empfangspuffer zurücksetzen

End If

If empfpuf(1) 6 Then 'Wenn kein ACK empfangen...

Text2.Text = Text2.Text + " NAK" 'NAK anzeigen

empfzeig = 0 'Zeiger von Empfangspuffer zurücksetzen

End If

rmflag1 = False 'Flag "Rückmeldung erwartet" löschen

End If

If rmflag = True Then 'wenn Datensatzempfang läuft...

zae = zae + 1 'Bytezähler erhöhen

If zae = 1 Then 'Kontrolle ob Frameanfang SOH ist

If empfpuf(1) 1 Then

fehl = True 'wenn nein Fehlerflag setzen

End If

End If

If zae = 2 Then 'wenn zweites Byte empfangen

If empfpuf(zae) 87 And empfpuf(zae) 83 Then 'Kontrolle ob Weg oder Ststus

fehl = True 'wenn nichts von beidem Fehlerflag setzen

End If

If empfpuf(zae) = 87 Then 'kommt Weg?

we = True 'wenn ja dann Wegflag setzen

End If

End If

If zae = 4 And we = True Then 'wenn 4.Byte empfangen und Wegflag da

If empfpuf(zae) 23 Then 'Kontrolle ob Frameende gekommen

fehl = True 'wenn nein Fehlerflag setzen

nak = True

End If

'Flag NAK senden setzen

If empfpuf(zae) = 23 Then 'wenn Frameende gekommen

ack = True 'Flag ACK senden setzen

empfanz = empfzeig 'Anzahl der empfangenen Bytes setzen

_________________________________________________________________________________

Fachhochschule Mannheim Seite 123

Hochschule für Technik und Gestaltung


Aufbau und Inbetriebnahme eines Steuerungssystems zur Navigation und Beobachtung eines autonomen

Fahrzeugs

__________________________________________________________________________________________

Label5.Caption = empfpuf(3) 'aktuelle Wegnummer anzeigen

empfzeig = 0 'Zeiger von Empfangspuffer löschen

End If

End If

If zae = 7 And we = False Then 'wenn 7.Byte empfangen

If empfpuf(zae) 23 Then 'Kontrolle ob Frameende gekommen

fehl = True 'wenn nein Fehlerflag setzen

nak = True 'Flag NAK senden setzen

End If

If empfpuf(zae) = 23 Then 'wenn Frameende gekommen

ack = True 'Flag ACK senden setzen

empfanz = empfzeig 'Anzahl der empfangenen Bytes setzen

empfzeig = 0 'Zeiger von Empfangspuffer löschen

End If

End If

End If

End Sub

Private Sub beenden_Click() 'Menuepunkt Beenden

MSComm1.PortOpen = False 'Bei Programm beenden COM Port schliessen

End 'Programm beenden

End Sub

Private Sub Command1_Click()

sendpuf(1) = 6 'ACK in Sendepuffer schreiben

sendanz = 1 'Anzahl der zu sendenden Bytes setzen

ProgressBar1.Visible = True 'Fortschrittsanzeige einblenden

ProgressBar1.Max = sendanz 'Maximalwert auf Anzahl der zu sendenden Bytes stellen

Label1.Caption = "Datenausgabe Fortschritt:"

empfflag = False 'Empfangsflag löschen

sendflag = True 'Sendeflag setzen

MSComm1.RTSEnable = True 'RTS-Leitung von Modem setzen

End Sub

Private Sub Command3_Click()

sendpuf(1) = 21 'NAK in Sendepuffer schreiben

sendanz = 1 'Anzahl der zu sendenden Bytes setzen

ProgressBar1.Visible = True 'Fortschrittsanzeige einblenden

ProgressBar1.Max = sendanz 'Maximalwert auf Anzahl der zu sendenden Bytes stellen

Label1.Caption = "Datenausgabe Fortschritt:"

empfflag = False 'Empfangsflag löschen

sendflag = True 'Sendeflag setzen

MSComm1.RTSEnable = True 'RTS-Leitung von Modem setzen

End Sub

_________________________________________________________________________________

Fachhochschule Mannheim Seite 124

Hochschule für Technik und Gestaltung


Aufbau und Inbetriebnahme eines Steuerungssystems zur Navigation und Beobachtung eines autonomen

Fahrzeugs

__________________________________________________________________________________________

Private Sub Command5_Click() 'Bestätigung Wegdatei laden oder speichern

Dim a As String 'Zwischenspeicher für Slash Dateinamen

If flagspeic = True Then 'Ist Flag Datei speichern gesetzt ???

'wenn ja -> **

If Right(Dir1.Path, 1) = "\" Then 'Ist letztes Zeichen des Directories ein Slash ???

a = "" 'wenn ja-> keinen Slash in Dateinamen einfügen

Else 'wenn nein ->

a = "\" 'Slash in Dateinamen einfügen

End If

dat = Dir1.Path + a + Text1.Text 'Pfad u. Dateinamen zwischenspeichern

Open dat For Output As #1 'File für schreiben öffnen

For t = 1 To wegzeig 'Schleife für alle Wegdaten öffnen

Print #1, wege(t) 'Wegdaten auf Festplatte speichern

Print #1, weginfo(t) 'Weginfodaten auf Festplatte speichern

Next t 'Schleife schließen

flagspeic = False 'Flag für Datei speichern löschen

Close #1 'File schließen

End If '**

If flagspeic = False Then 'Wenn Datei laden angefordert dann ->

t=0 'Zählvariable löschen

If Right(Dir1.Path, 1) = "\" Then 'Ist letztes Zeichen des Directories ein Slash ???

a = "" 'wenn ja-> keinen Slash in Dateinamen einfügen

Else 'wenn nein ->

a = "\" 'Slash in Dateinamen einfügen

End If

dat = Dir1.Path + a + Text1.Text 'Pfad u. Dateinamen zwischenspeichern

Open dat For Input As #1 'File für lesen öffnen

Do Until EOF(1) 'lesen bis NUL kommt

t=t+1 'Zeigererhöhen

Input #1, wege(t) 'Weg und Wegingodaten einlesen

Input #1, weginfo(t)

Loop

wegzeig = t 'Wegzeiger setzen

sendanzahl = wegzeig * 3 + 4 'Anzahl der zu sendenden Bytes setzen

Call umrechnung 'Umrechnung der Daten starten

Close #1 'File schließen

End If

Dir1.Visible = False 'Alle Ein-Auslesewerzeuge ausblenden

File1.Visible = False

Drive1.Visible = False

Command5.Visible = False

Command6.Visible = False

Text1.Visible = False

End Sub

_________________________________________________________________________________

Fachhochschule Mannheim Seite 125

Hochschule für Technik und Gestaltung


Aufbau und Inbetriebnahme eines Steuerungssystems zur Navigation und Beobachtung eines autonomen

Fahrzeugs

__________________________________________________________________________________________

Private Sub Command6_Click() 'Abbruch Daten Ein-Auslesen

Dir1.Visible = False 'Alle Werkzeuge ausblenden

File1.Visible = False

Drive1.Visible = False

Command5.Visible = False

Command6.Visible = False

Text1.Visible = False

flagspeic = False 'Flag Datei speichern löschen

End Sub

Private Sub Dir1_Change() 'Änderung des directory Werkzeugs

File1.Path = Dir1.Path 'Filepfad aktualisieren

End Sub

Private Sub Drive1_Change() Änderung des Laufwerkwerkzeugs

Dir1.Path = Drive1.Drive 'directory aktualisieren

End Sub

Private Sub File1_DblClick() 'Doppelklick auf File

Text1.Text = File1 'Dateinamen im Eingabefenster aktualisieren

End Sub

Private Sub Form_Load() 'Initialisierung bei Programmstart

MSComm1.CommPort = 2 'COM Portnummer festlegen

MSComm1.Settings = "9600,n,8,1" 'Übertragungsparameter zu Modem festlegen

MSComm1.PortOpen = True 'COM Port öffnen

sendflag = False 'Modem auf empfangen stellen

empfflag = True ' """""

Label3.Caption = "0"

End Sub

_________________________________________________________________________________

Fachhochschule Mannheim Seite 126

Hochschule für Technik und Gestaltung


Aufbau und Inbetriebnahme eines Steuerungssystems zur Navigation und Beobachtung eines autonomen

Fahrzeugs

__________________________________________________________________________________________

Private Sub laden_Click() 'Menuepunkt Datei laden

Dir1.Visible = True 'Ladewerkzeuge einblenden

File1.Visible = True

Drive1.Visible = True

Command5.Visible = True

Command6.Visible = True

Text1.Visible = True

End Sub

Private Sub MSComm1_OnComm() 'Interruptroutine COM Port

'- Äderung des Empfangspuffers am COM Port

'- Änderung des Pegels der RTS Leitung

'- Änderung des Pegels der CTS Leitung

Dim einl As String 'Lokalvariable für einlesen vom COM Port definieren

Dim ausg As String 'Lokalvariable für Ausgasbe an COM Port def.

If empfflag = True Then 'Wenn auf Empfang geschaltet dann...

einl = MSComm1.Input 'Inhalt des Empfangspuffers COM Port zwischensp.

If einl = "" Then GoTo m1 'Wenn Inhalt NUL dann nichts einlesen !!

empfzeig = empfzeig + 1 'sonst: Zeiger für Empfangspuffer erhöhen

empfpuf(empfzeig) = CByte(Asc(einl)) 'ASCII Wert in Integer Byte umwandeln und auf

If rmflag1 = False Then 'ist empfangenes Byte keine Rückmeldung

rmflag = True 'dann Flag Datensatzempfang läuft setzen

End If

If rmflag1 = False Then 'und Daten anzeigen

Text2.Text = Text2.Text + Str(empfpuf(empfzeig))

End If

Call auswert 'Auswerteroutine aufrufen und empf. Byte testen

Label3.Caption = Str(empfzeig) 'Zeiger von Empfangspuffer anzeigen

m1:

End If

If sendflag = True Then 'Wenn auf senden geschaltet dann..

If MSComm1.CTSHolding = True Then 'Abfragen ob sich Modem zurückgemeldet hat

sendzeig = sendzeig + 1 'Wenn ja -> Sendepufferzeiger erhöhen

ausg = CStr(Chr(sendpuf(sendzeig))) 'Integer Wert in String wandeln und

MSComm1.Output = ausg 'am COM Port ausgeben

ProgressBar1.Value = sendzeig 'Zustandsanzeige aktualisieren

If sendzeig = sendanz Then 'sind alle auszugebenden Datenbytes im Modem...

sendflag = False 'Sendeflag löschen

sendendflag = True 'und Flag für Modempuffer entleerungszeit setzen

sendzeig = 0 'Sendepufferzeiger löschen

End If

End If

End If

End Sub

_________________________________________________________________________________

Fachhochschule Mannheim Seite 127

Hochschule für Technik und Gestaltung


Aufbau und Inbetriebnahme eines Steuerungssystems zur Navigation und Beobachtung eines autonomen

Fahrzeugs

__________________________________________________________________________________________

Private Sub speichern_Click() 'Menuepunkt Datei speichern

Dir1.Visible = True 'Werkzeuge einblenden

File1.Visible = True

Drive1.Visible = True

Command5.Visible = True

Command6.Visible = True

Text1.Visible = True

flagspeic = True 'Flag Datei speichern setzen

End Sub

Private Sub starten_Click()

rmflag1 = True 'Rückmeldeflag setzen

sendpuf(1) = 1 'SOH in Sendepuffer schreiben

sendpuf(2) = 115 'Befehl starten in Sendepuffer schreiben

sendpuf(3) = 23 'Frameende in Sendepuffer schreiben

sendanz = 3 'Anzahl der zu sendenden Bytes aktualisieren

ProgressBar1.Visible = True 'Fortschrittsanzeige einblenden

ProgressBar1.Max = sendanz 'Maximalwert auf Anzahl der zu sendenden Bytes stellen

Label1.Caption = "Datenausgabe Fortschritt:"

empfflag = False 'Empfangsflag löschen

sendflag = True 'Sendeflag setzen

MSComm1.RTSEnable = True 'RTS-Leitung von Modem setzen

End Sub

Private Sub Timer1_Timer() 'wird jede ms aufgerufen

If rmflag = True Then 'wird Status oder Weg von Fahrzeug eingelesen?

timing2 = timing2 + 1 'Überwachungszeit starten

End If

If timing2 = 40 Then 'Ist Überwachungszeit abgelaufen...

nak = True 'Flag für neg.Rückmeldung setzen

rmflag = False 'Flag Datensatzempfang läuft löschen

timing2 = 0 'Zeitverzögerung löschen

End If

If ack = True Or nak = True Then 'wenn Flag für eineRückmeldung zum FZ ansteht

timing1 = timing1 + 1 'Zeitverzögerung starten

End If

If timing1 = 20 Then 'wenn Zeit abgelaufen

If ack = True And fehl = False Then 'wenn ACK senden angefordert

sendpuf(1) = 6 'ACK in Sendepuffer schreiben

sendanz = 1 'Anzahl der zu sendenden Bytes aktualisieren

ProgressBar1.Visible = True 'Fortschrittsanzeige einblenden

ProgressBar1.Max = sendanz 'Maximalwert auf Anzahl der zu sendenden Bytes stellen

Label1.Caption = "Datenausgabe Fortschritt:"

empfflag = False 'Empfangsflag löschen

sendflag = True 'Sendeflag setzen

MSComm1.RTSEnable = True 'RTS-Leitung von Modem setzen

ack = False 'Rücksendeflags löschen

nak = False

_________________________________________________________________________________

Fachhochschule Mannheim Seite 128

Hochschule für Technik und Gestaltung


Aufbau und Inbetriebnahme eines Steuerungssystems zur Navigation und Beobachtung eines autonomen

Fahrzeugs

__________________________________________________________________________________________

timing1 = 0 'Zeitverzögerung löschen

zae = 0 'Bytezähler löschen

we = False 'Wegflag löschen

rmflag = False 'Flag Datensatzempfang läuft löschen

empfzeig = 0 'Zeiger für Empfangspuffer löschen

fehl = False 'Fehlerflag löschen

Text2.Text = Text2.Text + " ACK zurück" 'Anzeige aktualisieren

End If

If nak = True Or fehl = True Then 'wenn NAK senden angefordert

sendpuf(1) = 21 'NAK in Sendepuffer schreiben

sendanz = 1 'Rest wie oben

ProgressBar1.Visible = True 'Fortschrittsanzeige einblenden

ProgressBar1.Max = sendanz 'Maximalwert auf Anzahl der zu sendenden Bytes stellen

Label1.Caption = "Datenausgabe Fortschritt:"

empfflag = False 'Empfangsflag löschen

sendflag = True 'Sendeflag setzen

MSComm1.RTSEnable = True 'RTS-Leitung von Modem setzen

ack = False

nak = False

timing1 = 0

zae = 0

we = False

rmflag = False

empfzeig = 0

fehl = False

Text2.Text = Text2.Text + " NAK zurück"

End If

End If

If sendendflag = True Then 'wenn Senden beendet Flag da ...

timing = timing + 1 'Zeitverzögerung starten

End If

If timing = 5 Then 'Ist Zeitverzögerung abgelaufen ...

sendendflag = False 'Flag für Modempuffer entleerungszeit löschen

timing = 0 'Zeitverzögerung löschen

MSComm1.RTSEnable = False 'RTS-Leitung von Modem löschen

ProgressBar1.Visible = False 'Fortschrittsanzeige löschen

ProgressBar1.Value = 0

Label1.Caption = ""

empfflag = True 'und wieder auf Empfang stellen

End If

End Sub

Private Sub wegeing_Click()

Load Form2 'Form2 für Wegeingabe laden

Form2.Show 'und anzeigen

End Sub

_________________________________________________________________________________

Fachhochschule Mannheim Seite 129

Hochschule für Technik und Gestaltung


Aufbau und Inbetriebnahme eines Steuerungssystems zur Navigation und Beobachtung eines autonomen

Fahrzeugs

__________________________________________________________________________________________

Private Sub wegsend_Click() 'Menuepunkt Wege senden

rmflag1 = True

If sendanzahl = 0 Then GoTo m2 'wenn kein Weg im speicher -> alles umspringen

For t = 1 To sendanzahl 'alle umgerechneten Wege in Sendepuffer schreiben

sendpuf(t) = sendweg(t) ' " "

Next t

sendanz = sendanzahl 'Anzahl der zu sendenden Bytes aktualisieren

ProgressBar1.Visible = True 'Fortschrittsanzeige einblenden

If sendanz = 0 Then GoTo m1 'wenn keine zu sendneden Bytes vorhanden **

ProgressBar1.Max = sendanz 'Maximalwert auf Anzahl der zu sendenden Bytes stellen

m1: 'Forschrittsanzeige nicht einblenden

Label1.Caption = "Datenausgabe Fortschritt:"

empfflag = False 'Empfangsflag löschen

sendflag = True 'Sendeflag setzen

MSComm1.RTSEnable = True 'RTS-Leitung von Modem setzen

m2:

End Sub

Form 2 Leiteing.FRM

Formglobale Variable

Dim weginp As Integer

Private Sub Command1_Click() 'Nächsten Verfahrweg eingeben

wege(wegzeig) = weginp 'Formglobaler Zwischensp.f.Eingabefenster

If Option1.Value = True Then weginfo(wegzeig) = 0 'Optionsbuttons entsprechend zuweisen

If Option2.Value = True Then weginfo(wegzeig) = 1

If Option3.Value = True Then weginfo(wegzeig) = 2

If Option4.Value = True Then weginfo(wegzeig) = 4

If Option5.Value = True Then weginfo(wegzeig) = 128

wegzeig = wegzeig + 1 'Wegzeiger erhöhen

If wegzeig >= 255 Then wegzeig = 255 'Max 8Bit Weganzahl zulassen (1 Byte)

Label4.Caption = Str(wegzeig)

Text1.Text = Str(wege(wegzeig))

If weginfo(wegzeig) = 0 Then Option1.Value = True 'Optionsbuttons entsprechend setzen

If weginfo(wegzeig) = 1 Then Option2.Value = True

If weginfo(wegzeig) = 2 Then Option3.Value = True

If weginfo(wegzeig) = 4 Then Option4.Value = True

If weginfo(wegzeig) = 128 Then Option5.Value = True

End Sub

_________________________________________________________________________________

Fachhochschule Mannheim Seite 130

Hochschule für Technik und Gestaltung


Aufbau und Inbetriebnahme eines Steuerungssystems zur Navigation und Beobachtung eines autonomen

Fahrzeugs

__________________________________________________________________________________________

Private Sub Command2_Click() 'vorherigen Weg editieren

wege(wegzeig) = weginp 'Formglobaler Zwischensp.f.Eingabefenster

If Option1.Value = True Then weginfo(wegzeig) = 0 'Optionsbuttons entsprechend zuweisen

If Option2.Value = True Then weginfo(wegzeig) = 1

If Option3.Value = True Then weginfo(wegzeig) = 2

If Option4.Value = True Then weginfo(wegzeig) = 4

If Option5.Value = True Then weginfo(wegzeig) = 128

wegzeig = wegzeig - 1

If wegzeig


Aufbau und Inbetriebnahme eines Steuerungssystems zur Navigation und Beobachtung eines autonomen

Fahrzeugs

__________________________________________________________________________________________

Private Sub Option2_Click() 'Option Fahrt Rückwärts

Label1.Caption = "Weg in [cm]:"

Text1.Enabled = True

End Sub

Private Sub Option3_Click() 'Option Drehung rechts

Label1.Caption = "Drehung in grad:"

Text1.Enabled = True

End Sub

Private Sub Option4_Click() 'Option Drehung links

Label1.Caption = "Drehung in grad:"

Text1.Enabled = True

End Sub

Private Sub Option5_Click() 'Option Parkfahrt

Label1.Caption = "kein Weg erforderlich:"

Text1.Enabled = False

Text1.Text = Str(0)

End Sub

Private Sub Text1_Change() 'Änderung des Eingabefeldes

If Val(Text1.Text) > 32767 Then Text1.Text = weginp 'Prüfung der Wegeingabe

weginp = Val(Text1.Text)

End Sub

_________________________________________________________________________________

Fachhochschule Mannheim Seite 132

Hochschule für Technik und Gestaltung


Aufbau und Inbetriebnahme eines Steuerungssystems zur Navigation und Beobachtung eines autonomen

Fahrzeugs

__________________________________________________________________________________________

7.3 Schaltplan Antrieb

+12V

+12V

3

10nF

10nF

C3

100nF

3

C4

100nF

LM 317

1

4k7

LM 317

1

R16

5k

R18

5k

2

X6/1

Motor rechts Sollwert

(D/A-Wandler 0)

C6

C5

N3

R19

N4

X7/1

Motor links Sollwert

(D/A-Wandler 1)

R20

22k

+8V

8

VCC

2

4

TRIGGER

5

RESET OUTPUT

6

CONTROL

7

THRESHOLD

DISCHARGE

2

R15

240

R17

240

R2

10k

GND

1

R9

10k

IC1

555D

3

10k

10k

_________________________________________________________________________________

Fachhochschule Mannheim Seite 133

Hochschule für Technik und Gestaltung

+8V

3

+

1

2

-

LM324

R1

10k

1/4 N2

+8V

10k

2/S. 134

3/S.134

9

+

8

10

-

LM324

R10

10k

1/4 N2

R11

20k

4

11

10k

R4

20k

R21

R22

R3

4

11

R8

V1

1N4148

V3

1N4148

1/S. 134

Sollwertanpassung Motor 1

Dreieckgenerator

4/S. 134

Sollwertanpassung Motor 2


Aufbau und Inbetriebnahme eines Steuerungssystems zur Navigation und Beobachtung eines autonomen

Fahrzeugs

__________________________________________________________________________________________

X6/2

Pulsf reigabe

vonX7/1 Zählerkarte

X7/2

Pulsf reigabe

vonX7/2 Zählerkarte

R7

10k

R14

10k

Pulsfreigabe Motor 1 PWM-Komparator Motor 1

+12V

+12V

R6

12k

R5

2k7

R13

12k

R12

2k7

+8V

Pulsfreigabe Motor 2

-

+

+8V

-

+

LM324

1/4 N2

LM324

1/4 N2

1N4148

1N4148

1/S. 133

4/S. 133

2/S. 133

3/S. 133

_________________________________________________________________________________

Fachhochschule Mannheim Seite 134

Hochschule für Technik und Gestaltung

V2

V4

R33

10k

R34

10k

+8V

+

-

+8V

+

-

LM358

N5/A

PWM-Komparator Motor 2

LM358

N5/B

11/S. 136

12/S. 136


Aufbau und Inbetriebnahme eines Steuerungssystems zur Navigation und Beobachtung eines autonomen

Fahrzeugs

__________________________________________________________________________________________

V5

1N4148

V7

1N4148

5/S. 136

+12V

R23

10k

R26

1k

6/S. 135

+12V

R27

10k

R30

1k

+5V

R24

1k2

R28

1k2

3

+

2

-

+8V

8

4

+8V

4 8

5

+

6

-

C13 C14

1uF 1uF

1/S. 134

_________________________________________________________________________________

Fachhochschule Mannheim Seite 135

Hochschule für Technik und Gestaltung

R25

470k

1

LM358

N7/A

R29

470k

7

LM358

N7/B

V6

1N4148

V8

1N4148

C15 C16

1uF 1uF

X6/3

1 2

3 4

5 6

Port E Bit 4

7414

7414

7414

vorwärts/rückwärts Motor rechts IC2/A IC2/B IC2/C

X7/3

Port E Bit 5

vorwärts/rückwärts Motor rechts

Strombegrenzung Motor 1

Strombegrenzung Motor 2

Fahrtrichtungsumkehr Motor 1

7 14

Fahrtrichtungsumkehr Motor 2

9 8 11 10 13 12

7414 7414 7414

IC2/D IC2/E IC2/F

4/S.134

7/S. 136

8/S. 136

9/S. 136

10/S. 136


Aufbau und Inbetriebnahme eines Steuerungssystems zur Navigation und Beobachtung eines autonomen

Fahrzeugs

__________________________________________________________________________________________

1 2

1 2

+12V

1 2

V11 V12

1N4001 1N4001

X4/1

Motor links

X4/2

1 2

7/S. 135

V9 V10

1N4001

1N4001

GND

X1/2

5/S.135 6/S. 135

11/S. 134

+12V

1

2

L293B

10/S. 135

_________________________________________________________________________________

Fachhochschule Mannheim Seite 136

Hochschule für Technik und Gestaltung

+5V

3

14

R31 4

13

R32

0.15

C20

100nF

5

6

7

8 9

8/S. 135 12/S. 134 9/S. 135

16

15

12

11

10

C21

100nF

0.15

1 2

1 2

+12V

1 2

V13 V14

1N4001 1N4001

V15

1N4001

+12V

1

7808

3

+8V

C1

C2

100nF

2

100nF C18

470uF

+12V

+

C19

470uF

Integrierte H – Brücke L293B

Interne Spannungsversorgungen

+12V

X1/1

1

C7

100nF

N1

N6

7805

2

3

C8

100nF

+

+

C17

470uF

1 2

+5V

X5/1

Motor rechts

X5/2

V16

1N4001


Aufbau und Inbetriebnahme eines Steuerungssystems zur Navigation und Beobachtung eines autonomen

Fahrzeugs

__________________________________________________________________________________________

7.3.1 Platinenlayout Antrieb

_________________________________________________________________________________

Fachhochschule Mannheim Seite 137

Hochschule für Technik und Gestaltung


Aufbau und Inbetriebnahme eines Steuerungssystems zur Navigation und Beobachtung eines autonomen

Fahrzeugs

__________________________________________________________________________________________

7.4 Schaltplan Zählerkarte

+5V

10nF

C14

+5V

X1/5

X2/5

X1/2

4k7

X1/4

120

R12 X2/2

4k7

X2/4

+5V

R1 R2 R5

4k7 4k7 120

X1/1

R3 R4

X1/3

R8 R7 R11

4k7 4k7 120

+5V

4k7

X2/1

R9 R10

X2/3

X1/1 = Signal A negiert Geber 1

X1/2 = Signal A Geber 1

X1/3 = Signal B negiert Geber 1

X1/4 = Signal B Geber 1

X1/5 = Schirm Geber 1

X2/1 = Signal A negiert Geber 2

X2/2 = Signal A Geber 2

X2/3 = Signal B negiert Geber 2

X2/4 = Signal B Geber 2

X2/5 = Schirm Geber 2

4k7

Pulsaufbereitung

R6

120

C11

10nF

C12

10nF

10

C13

10nF

12

7486

1/4 IC3

_________________________________________________________________________________

Fachhochschule Mannheim Seite 138

Hochschule für Technik und Gestaltung

4

12

2

1

6

7

9

14

15

11

13

+5V

16

75173

100nF

2/S. 139 1/S. 139

8

7

2

3

C10

IC1

1

14

7486

1/4 IC3

3

5

11

13

+5V

Impulsverdoppelung

C6

100nF


Aufbau und Inbetriebnahme eines Steuerungssystems zur Navigation und Beobachtung eines autonomen

Fahrzeugs

__________________________________________________________________________________________

Port C Bit 0 X3/1

Port C Bit 1 X3/2

Port C Bit 2 X3/3

Port C Bit 3 X3/4

2/S. 138

Port C Bit 4 X3/5

Port C Bit 5 X3/6

Port C Bit 6 X3/7

Port C Bit 7 X3/8

Port E Bit 3 X5/1

Port D Bit 0 X4/1

Port D Bit 1 X4/2

Port D Bit 2 X4/3

Port D Bit 3 X4/4

1/S. 138

Port D Bit 4 X4/5

Port D Bit 5 X4/6

Port D Bit 6 X4/7

Port D Bit 7 X4/8

Port E Bit 2 X5/2

8-Bit Zähler fürPulsgeber

3

2

Q0

6

Q1

7

Q2

Q3

4

5

12

11

Ü-auf

14

load

CLR

_________________________________________________________________________________

Fachhochschule Mannheim Seite 139

Hochschule für Technik und Gestaltung

down

up

3

2

Q0

6

Q1

7

Q2

Q3

4

5

down

up

12

11

Ü-auf

14

load

CLR

3

2

Q0

6

Q1

7

Q2

Q3

4

5

down

up

12

11

Ü-auf

14

load

CLR

3

2

Q0

6

Q1

7

Q2

Q3

4

5

down

up

12

11

Ü-auf

14

load

CLR

16

VCC

GND

16

8

VCC

GND

16

8

VCC

GND

16

8

VCC

GND

8

74193

IC6

74193

IC7

74193

IC4

74193

IC5

C2

1n

C1

1n

C2

1n

C1

1n

+5V

+5V

+5V

+5V


Aufbau und Inbetriebnahme eines Steuerungssystems zur Navigation und Beobachtung eines autonomen

Fahrzeugs

__________________________________________________________________________________________

Lebenszeichen

v on Rechner

Port E Bit 6

Port E Bit 0X7/5

Port E Bit 1X7/6

+12V X6/1

GND X6/2

X8/1

Totmannschaltung für Pulsfreigaben

+

1

2

3

1A

1B

VCC

1C/R

16

15

1CLR

13

1Q 1 Cext

14

1

2

8

4

5

74123

GND

14

7

1/4 7408

_________________________________________________________________________________

Fachhochschule Mannheim Seite 140

Hochschule für Technik und Gestaltung

6

3

1/4 7408

+5V

+5V

+

Interne Spannungsversorgung

C4

470uF

N1

R13

20k

C17

33uF

C16

100nF

1

7805

3

C1 C2

100nF

2

100nF

C15

100nF

X7/1 Pulsf reigabe Motor 1

X7/2 Pulsf reigabe Motor 2

+

C3

470uF

+5V


Aufbau und Inbetriebnahme eines Steuerungssystems zur Navigation und Beobachtung eines autonomen

Fahrzeugs

__________________________________________________________________________________________

7.4.1 Platinenlayout Zählerkarte

_________________________________________________________________________________

Fachhochschule Mannheim Seite 141

Hochschule für Technik und Gestaltung


Aufbau und Inbetriebnahme eines Steuerungssystems zur Navigation und Beobachtung eines autonomen

Fahrzeugs

__________________________________________________________________________________________

7.5 Schaltplan Bedienteil

+5V

PortBBit0

2

PortBBit1

BC 546 B

X2/3 3k3 X2/2 3k3

Port A Bit 0

10k

1 3

X2/4

X1/1

X1/2

180

LED grün

_________________________________________________________________________________

Fachhochschule Mannheim Seite 142

Hochschule für Technik und Gestaltung

Taste

1 2

X1/5 X1/6

2

+5V

1 3

X1/3

X1/4

180

LED rot

BC 546 B

+5V

X2/5

X2/1


Aufbau und Inbetriebnahme eines Steuerungssystems zur Navigation und Beobachtung eines autonomen

Fahrzeugs

__________________________________________________________________________________________

7.5.1 Platinenlayout Bedienteil

Die Schaltung ist auf eine Lochrasterplatine aufgebaut. Das Layout ist von der

Bestückungsseite her gesehen dargestellt.

X1/1

BC546B

180

X1/2

3k3

X1/3

X1/4

BC546B

180

_________________________________________________________________________________

Fachhochschule Mannheim Seite 143

Hochschule für Technik und Gestaltung

X1/5

3k3

X1/6

X2/5

X2/4

X2/3

X2/2

X2/1


Aufbau und Inbetriebnahme eines Steuerungssystems zur Navigation und Beobachtung eines autonomen

Fahrzeugs

__________________________________________________________________________________________

7.6 Schaltplan Anpaßschaltung Ultraschallsensoren

1

U

2

3

X3/4 X4/4

4

5

Anschlußbelegung der Sonarberos

1=+12V

2 = Analogausgang 0 - 10 V

3=GND

4 = Analogausgang 4 - 20 mA

5 = Sy nchronisationsanschluß

1k 1k

Multi-I/O Board Multi-I/O Board

J7/2 J7/3

X2/2 X2/3

620 620

X3/1

X1/1

+12V

_________________________________________________________________________________

Fachhochschule Mannheim Seite 144

Hochschule für Technik und Gestaltung

X4/1

X3/3 X4/3

1

U

2

3

X1/2

X3/2

X2/1

X4/2

4

5


Aufbau und Inbetriebnahme eines Steuerungssystems zur Navigation und Beobachtung eines autonomen

Fahrzeugs

__________________________________________________________________________________________

7.6.1 Platinenlayout Anpaßschaltung Ultraschallsensoren

Die Schaltung ist auf einer Lochrasterplatine aufgebaut. Das Layout ist von der

Bestückungsseite her dargestellt.

X3/1

X3/2

X3/3

X3/4

X1/1

X1/2

620

Brücke

Brücke

1k 1k

_________________________________________________________________________________

Fachhochschule Mannheim Seite 145

Hochschule für Technik und Gestaltung

620

X2/1

Brücke

X2/2

X2/3

X4/1

X4/2

X4/3

X4/4


Aufbau und Inbetriebnahme eines Steuerungssystems zur Navigation und Beobachtung eines autonomen

Fahrzeugs

__________________________________________________________________________________________

7.7 Verdrahtungsplan Fahrzeug

Verbindungen zwischen 386EX und Zählerkarte

J5/25

J5/23

J5/21

J5/19

J5/17

J5/15

J5/13

J5/11

J5/26

J5/24

J5/22

J5/20

J5/18

J5/16

J5/14

J5/12

J7/11

J7/12

386EX Port C Drehzahlistwert

Zählerkarte X3

Flachbandleitung

386EX Port D Drehzahlistwert

Zählerkarte X4

386EX Port E

Flachbandleitung

Verbindung zwischen 386EX und Multi-I/O Board

Zählerkarte X7

_________________________________________________________________________________

Fachhochschule Mannheim Seite 146

Hochschule für Technik und Gestaltung

X3/1

X3/2

X3/3

X3/4

X3/5

X3/6

X3/7

X3/8

X4/1

X4/2

X4/3

X4/4

X4/5

X4/6

X4/7

X4/8

386EX Port E Zähler Reset

Zählerkarte X5

J7/14

X5/1

J7/13 X5/2

Pulsf reigaben

X7/1

X7/2

X7/3

X7/4

X7/5

X7/6

X7/7

X7/8

386EX Port E Lebenstakt Rechner

Zählerkarte X8

J7/6 X8/1

J3/1

J3/2

J3/3

J3/4

J3/5

J3/6

J3/7

J3/8

J3/9

J3/10

386EX J3 Multi-I/O Bus

Multi-I/O Board J2

Flachbandleitung

J2/1

J2/2

J2/3

J2/4

J2/5

J2/6

J2/7

J2/8

J2/9

J2/10


Aufbau und Inbetriebnahme eines Steuerungssystems zur Navigation und Beobachtung eines autonomen

Fahrzeugs

__________________________________________________________________________________________

Verbindungen zwischen 386EX und Antrieb bzw. Antrieb und Zählerkarte

Fahrtrichtungsumkehr

J7/4

J7/5

386EX Port E

Multi-I/O Board D/A-Wandler

J5/1

Drehzahlsollwerte

J6/1

Verbindung zwischen Bedienteil und 386EX

X2/1

X2/2

X2/3

X2/4

X2/5

Antriebskarte X6

Antriebskarte X7

Verbindung zwischen Anpaßschaltung Ultraschallsensoren und 386EX Mult-I/O Board

Verbindung zwischen 386EX und Funkmodemanpaßschaltung

+5V

X6/2

X7/2

_________________________________________________________________________________

Fachhochschule Mannheim Seite 147

Hochschule für Technik und Gestaltung

X6/1

X6/3

X7/1

X7/3

Zählerkarte X7

Bedienteil X2 386EX J6

X7/1

Pulsf reigaben

J6/24

J6/26

J6/25

Anpaßschaltung US-Sensoren 386EX Multi-I/O Board

X2/2

X2/3

J9/1

J9/2

J9/3

J9/4

J9/5

J9/6

J9/7

J9/8

J9/9

J9/10

J7/2

J7/3

386EX COM1 Funkmodem Anpaßschaltung

Flachbandleitung

X1/1

X1/6

X1/2

X1/7

X1/3

X1/8

X1/4

X1/9

X1/5

X7/2


Aufbau und Inbetriebnahme eines Steuerungssystems zur Navigation und Beobachtung eines autonomen

Fahrzeugs

__________________________________________________________________________________________

Verbindung zwischen Antriebskarte und Motoren

X4/1

X4/2

X5/1

X5/2

Antriebskarte

Verbindung zwischen Zählerkarte und Pulsgebern

X1/1

X1/2

X1/3

X1/4

X1/5

X2/1

X2/2

X2/3

X2/4

X2/5

+5V

Antriebsmotoren

_________________________________________________________________________________

Fachhochschule Mannheim Seite 148

Hochschule für Technik und Gestaltung

6

5

1

8

12

10

braun

M1

M2

A negiert

A

B negiert

B

+5V

GND

100nF

100nF

Zählerkarte Pulsgeber Heidenhain

grün

gelb

rot

blau

ws/bn

ws

gn/bn

gn

weiß

A negiert

A

B negiert

B

+5V

rt

sw

GND

+5V

P1

Pulsgeber Hengstler

P2


Aufbau und Inbetriebnahme eines Steuerungssystems zur Navigation und Beobachtung eines autonomen

Fahrzeugs

__________________________________________________________________________________________

Verbindung der Spannungsversorgung des Fahrzeugs

+12V Batt.

Hauptschalter

Spannungsregler 1

Spannungsregler 2

+5V P1 und P2

Bedienteil X2/5

386EX J2/1

Anpaßsch. Funkmodem

Antriebskarte X1/1

Zählerkarte X6/1

US-Anpaßsch. X1/1

GND P1 und P2

Bedienteil X2/1

386EX J2/3

Anpaßsch. FM X1/5

Antriebskarte X1/2

Zählerkarte X6/2

US-Anpaßsch. X1/2

_________________________________________________________________________________

Fachhochschule Mannheim Seite 149

Hochschule für Technik und Gestaltung


Aufbau und Inbetriebnahme eines Steuerungssystems zur Navigation und Beobachtung eines autonomen

Fahrzeugs

__________________________________________________________________________________________

7.8 Quellenverzeichnis

[1] 386 EX Chip Users Manual (PDF – Datei auf CD von Zacrobotics)

[2] Logic Flex User´s Manual(PDF– Datei auf CD von Zacrobotics)

[3] Multi – I/O Expansions Board User´s Manual (PDF – Datei auf CD von Zacrobotics)

[4] Jens Altenburg / Uwe Altenburg: Mobile Roboter

2. Auflage. Carl Hanser Verlag München Wien

ISBN 3-446-21510-7

[5] Hubert Zitt: Die Telekommunikations – Werkstatt

Markt & Technik Buch- und Software- Verlag D-85540 Haar

ISBN 3-8272-5169-9

[6] Datenblatt 78XX Festspannungsregler (PDF – Datei auf Dokumentations – CD)

http://www.fairchildsemi.com/ds/LM/LM7805.pdf

[7] Dokumentation Funkmodem HDM 41 F (PDF – Datei auf Dokumentations – CD)

[8] Datenblatt L 293 B H – Brücke (PDF – Datei auf Dokumentations – CD)

http://www.ancr.org/datasheet/drivers/L293.pdf

[9] Datenblatt LM 317 TO – 220 einstellbarer Spannungsregler (PDF – Datei auf

Dokumentations – CD)

http://www.onsemi.com/pub/Collateral/LM317-D.PDF

[10] Datenblatt LM 324 Operationsverstärker (PDF – Datei auf Dokumentations – CD)

http://www.onsemi.com/pub/Collateral/LM324-D.PDF

[11] Datenblatt LM 358 Bi – MOS – Operationsverstärker (PDF – Datei auf

Dokumentations – CD)

http://www-s.ti.com/sc/ds/lm358.pdf

[12] Datenblatt MAX 232 A TTL – RS – 232 Konverter (PDF – Datei auf

Dokumentations – CD)

http://www.geocities.com/sayabisa51/MAX232.pdf

[13] Datenblatt NE 555 Taktgeber (PDF – Datei auf Dokumentations – CD)

http://www.classicgaming.com/studio2/ne555.pdf

[14] Datenblatt RS 385 SH Antriebsmotoren (PDF – Datei auf Dokumentations – CD)

_________________________________________________________________________________

Fachhochschule Mannheim Seite 150

Hochschule für Technik und Gestaltung


Aufbau und Inbetriebnahme eines Steuerungssystems zur Navigation und Beobachtung eines autonomen

Fahrzeugs

__________________________________________________________________________________________

[15] Datenblatt SN 7408 4 fach UND – Gatter (PDF – Datei auf Dokumentations – CD)

[16] Datenblatt SN 74123 Monoflop (PDF – Datei auf Dokumentations – CD)

http://www-s.ti.com/sc/psheets/sdls043/sdls043.pdf

[17] Datenblatt SN 7414 6 fach Inverter (PDF – Datei auf Dokumentations – CD)

http://www-s.ti.com/sc/psheets/sdls049b/sdls049b.pdf

[18] Datenblatt SN 7486 EXOR – Gatter (PDF – Datei auf Dokumentations – CD)

http://www.engineering.sdsu.edu/~mansour/pdf/7486.pdf

[19] Datenblatt SN 74193 8 – Bit Zähler (PDF – Datei auf Dokumentations – CD)

http://www.ee.washington.edu/stores/DataSheets/74ls/74ls193.pdf

[20] Datenblatt SN 75173 RS – 422 Empfänger (PDF – Datei auf Dokumentations – CD)

http://www.gramlich.net/projects/datasheets/ti/sn75173.pdf

[21] Datenblatt Ultraschallsensoren UC 2000-30GM-IUR2-V15 (PDF – Datei auf

Dokumentations – CD)

[22] Datenblatt Pulsgeber ROD 426 Fa. Heidenhain (PDF – Datei auf Dokumentations –

CD)

[23] Datenblatt Pulsgeber RI 58 Fa. Hengstler (PDF – Datei auf Dokumentations – CD)

_________________________________________________________________________________

Fachhochschule Mannheim Seite 151

Hochschule für Technik und Gestaltung


Aufbau und Inbetriebnahme eines Steuerungssystems zur Navigation und Beobachtung eines autonomen

Fahrzeugs

__________________________________________________________________________________________

7.9 Begriffe und Abkürzungen

A/D – Wandler (engl. analog to digital converter) Analog – Digital Wandler.

ACK (engl. acknowledge) anerkennen einer übertragenen Information

vom Empfänger (Rückmeldung).

BI-MOS-OP Operationsverstärker mit MOS-Eingängen und Bipolarem

Ausgang

Bit (engl. Binary Digit) Binärziffer. Kleinste Darstellungseinheit im

Binärsystem. Kann nur zwei Werte annehmen. Entweder 0

(Low) oder 1 (High).

Byte Zusammenfassung von 8 Bit zu einer Einheit.

CH x (engl. Channel) Kanal. Hier ist der Kanal eines Oszilloskops

gemeint. X bezeichnet die Nummer des Kanals.

CPU (engl. central processing unit) Zentraleinheit

CS (engl. Chip Select) anwählen bzw. freischalten einer

Funktionseinheit. Hier freigeben des Funkmodems.

CTS (engl. Clear To Send) bereit zum Senden. Leitung einer

RS – 232 – Schnittstelle. Dieses Signal (vom modem zum

Rechner) zeigt dem Rechner an, daß das Modem bereit ist,

Daten vom Rechner entgegen zu nehmen.

D/A – Wandler (engl. digital to analog converter) Digital – Analog Wandler.

DC (engl. Direct Current) Gleichspannung.

DCD (engl. Data Carrier Detect) Trägersignal erkannt. Leitung einer

RS – 232 – Schnittstelle. Das Modem aktiviert dieses Signal,

wenn die Verbindung zu einem anderen Modem aufgebaut ist.

FM Hier Abkürzung für Funkmodem.

Frame (engl. Rahmen) ein kompletter Datensatz mit Anfangs- und

Endezeichen wird als Frame bezeichnet.

GND (engl. ground) Masse bzw. Bezugspunkt.

_________________________________________________________________________________

Fachhochschule Mannheim Seite 152

Hochschule für Technik und Gestaltung


Aufbau und Inbetriebnahme eines Steuerungssystems zur Navigation und Beobachtung eines autonomen

Fahrzeugs

__________________________________________________________________________________________

H – Brücke Ansteuerschaltung eines DC – Motors mit vier Transistoren. Die

Schaltung erlaubt eine Drehrichtungsumkehr des Motors. Die

Transistoren und der Motor sind so angeordnet, daß die

Schaltung wie ein H aussieht.

High (engl.) hoher Signalpegel oder logisch 1(etwa

Versorgungsspannung).

HTP Hier Abkürzung für Hyper Terminal Programm. Dieses

Programm wird zur Bedienung und Programmierung des

Fahrzeugrechners benötigt.

IC (engl. Integrated Circuit) integrierter Schaltkreis, integrierte

Schaltung.

Interrupt (engl.) Unterbrechung. Ein Interrupt unterbricht einen normalen

Programmablauf im Prozessor, um ein spezielles Programm, das

sog. Interrupt – Programm abzuarbeiten. Kann von

Programmen, Bausteinen oder Peripheriegeräten ausgelöst

werden.

IRQ (engl. Interrupt Request) Unterbrechungsanforderung.

Auslösung eines Interrupts durch ein Ereignis.

ISR (engl. interrupt service routine) Unterbrechungsroutine.

Komparator Vergleicher. Häufig benutzte Schaltungsart eines

Operationsverstärkers.

Koppelnavigation Navigieren eines Fahrzeugs durch aufsummieren vorbestimmter

Wegstrecken. Dabei sind keine anderen Navigationshilfen

vorhanden.

Lebenstakt Ausgeben eines zyklischen Taktes während einer

Programmbearbeitung, um festzustellen, daß das Programm

noch bearbeitet wird.

LED (engl. Light Emitting Diode) Leuchtdiode.

Low (engl.) niedriger Signalpegel etwa 0 Volt.

NAK (engl. Negative Acknowledge) negative Rückmeldung bei

Empfang eines ungültigen Datensatzes.

Nibble Zusammenfassung von 4 Bit zu einer Eiheit.

Offsetspannung Überlagerter Gleichspannungsanteil einer Wechselspannung.

_________________________________________________________________________________

Fachhochschule Mannheim Seite 153

Hochschule für Technik und Gestaltung


Aufbau und Inbetriebnahme eines Steuerungssystems zur Navigation und Beobachtung eines autonomen

Fahrzeugs

__________________________________________________________________________________________

OP (engl. Operational Amplifier) Operationsverstärker

PIC (engl. Programmable Interrupt Controller) Baugruppe, die in

einem PC die Interrupts hardwaremäßig verwaltet.

PWM Abkürzung für Pulsweiten Modulation. Quasikontinuierliches

Ansteuern z.B. eines DC – Motors mit einem digitalen Ausgang.

Referenzfahrt Fahren des Fahrzeugs auf eine Bezugsmarke.

RTS (engl. Request To Send) bereit zum Senden. Leitung einer

RS – 232 – Schnittstelle. Dieses Signal (vom Rechner zum

Modem) weist das Modem an, sich auf eine Datenübertragung

vom Rechner zum Modem einzustellen.

RxD (engl. receive data). Bezeichnung der Datenempfangsleitung

einer RS – 232 – Schnittstelle.

Treiberstufe Verstärkt ein schwaches Signal (z.B. Transistorverstärker).

Trimmpoti Einstellbarer Widerstand der meistens einmalig auf einen

bestimmten Wert eingestellt wird.

TXD (engl. transmit data). Bezeichnung der Sendeleitung der

RS – 232 – Schnittstelle.

_________________________________________________________________________________

Fachhochschule Mannheim Seite 154

Hochschule für Technik und Gestaltung

Weitere Magazine dieses Users
Ähnliche Magazine