Geschwindigkeitsregelanlage: Unterschied zwischen den Versionen
Zeile 380: | Zeile 380: | ||
== Projektunterlagen == | == Projektunterlagen == | ||
=== Projektplan === | === Projektplan === | ||
[[Datei:ProjektplanGRA.JPG| | [[Datei:ProjektplanGRA.JPG|600px|Dateibeschreibung/Tooltip]] | ||
=== Projektdurchführung === | === Projektdurchführung === |
Version vom 7. Januar 2021, 17:28 Uhr
Autor: Maik Spinnrath, Mario Wollschläger
Gruppe: 2.5
Betreuer: Prof. Schneider
→ zurück zur Übersicht: WS 20/21: Fachpraktikum Elektrotechnik (MTR)
Einleitung
Das Projekt Geschwindigkeitsregelanlage entsteht im Rahmen des GET-Fachpraktikum des Studiengangs Mechatronik im 5 Semester. Zielsetzung ist die Realisierung eines Systems, welches die Geschwindigkeit eines modifizierten RC-Autos regeln soll. Die Reglung geschieht auf Basis von Daten aus Raddrehzahlsensoren. Die notwendigen Berechnungen werden von einem Microcontroller des Typs ATmega328 mit Arduino-Bootloader.
Die Umsetzung des Projektes wird durch die Mechatronik Studenten Maik Spinnrath und Mario Wollschläger realisiert.
Anforderungen
Für den Erfolg des Projektes bestehen die folgenden Anforderungen an das System:
Nr.: | Anforderung | Status |
---|---|---|
1.0 | Echtzeitanforderung: Die Reglung muss in Echtzeit erfolgen, d.h. die notwendigen Berechnungen müssen in einer vorher definierten Zeit abgeschlossen sein. | in Arbeit |
2.0 | Platzbedarf: Das System muss in dem zur Verfügung stehendem Bauraum vollständig realisiert werden. | Abgeschlossen |
3.0 | Energiebedarf: Ein Batteriebetrieb muss möglich sein um die Mobilität des Gesamtsystem Fahrzeug zu gewährleisten | Abgeschlossen |
4.0 | Erschütterungen dürfen zu keinen Beeinträchtigungen oder Beschädigungen führen. | offen |
5.0 | Gewicht: Die maximale Achslast des Fahrzeuges darf nicht überschritten werden. | Abgeschlossen |
6.0 | Das System muss den Auftraggeber Zufrieden stellen | offen |
7.0 | Die Geschwindigkeit muss ermittelt werden und weiterverarbeitbar dargestellt werden. | Abgeschlossen |
7.0 | Der Nutzer muss eine Sollgeschwindigkeit einstellen können. | Abgeschlossen |
8.0 | Der Nutzer muss eine Rückmeldung über Soll- und Ist-Geschwindigkeit erhalten. | Abgeschlossen |
8.1 | Der Nutzer muss eine Rückmeldung über Regelfehler und Stellgrößer erhalten. | Abgeschlossen |
9.0 | Die Geschwindigkeit muss zuverlässig geregelt werden. | In Arbeit |
Funktionaler Systementwurf/Technischer Systementwurf
Das System besteht aus verschiedenen Komponenten. Zur Erfassung der Geschwindigkeit werden Drehzahlsensoren eingesetzt. Die ermittelten Daten werden von einem Mikrocontroller verarbeitet. Anschließend kann die Geschwindigkeit durch die Anpassung der Stromzufuhr des Motors geregelt werden. Diese wird zuvor vom Benutzer angegeben.
Optional kann das System durch einen Ultraschallsensor dahingehen erweitert werden, dass eine Abstandsregelung zu vorausfahrenden Fahrzeugen möglich wird. Hierfür kann die eingestellte Geschwindigkeit je nach Distanz verringert oder vergrößert werden, um den gewünschten Abstand zu halten oder einzustellen.
Komponentenspezifikation
Komponente | Beschreibung | Bild |
---|---|---|
Arduino UNO R3 | Die Kernkomponente ist ein Arduino Uno Board, auf diesem ist ein ATmega328P verbaut welche die Berechnungen des Systems übernimmt. Dieser arbeitet mit einer Taktfrequenz von 16MHz und besitzt eine Betriebsspannung von 5V. Über 14 I/O Pins können Sensoren und Aktoren angeschlossen werden, wovon jeweils 6 als PWM Ausgang oder als Analog Eingang genutzt werden können. Die I/O Pins können maximal 20mA leisten. Die Restlichen Informationen können aus diesem Datenblatt[3] entnommen werden. | |
TLE4905L | Ein TLE4905L Hall-Effekt Sensor der Firma Infineon wurde verwendet um die Geschwindigkeit des Fahrzeuges über die Raddrehzahl zu ermitteln. Der Sensor kann auf Basis eines Magnetfeldes innerhalb einer Mikrosekunde schalten. Dieser arbeitet ein einem Bereich von 3.8 bis 24 Volt und kann einen Ausgangsstrom von 100mA liefern. Nähere Informationen zum Sensor sind im Hauptartikel zu finden. | |
Display | Des weiteren wurde ein Display mit einer Anzeige aus 16 Zeichen pro Zeile und zwei Zeilen verwendet, um dem Nutzer Rückmeldung über Systemparameter zu geben. Dieses Display wird über eine I2C Schnittstelle betrieben. | |
STP16NF06L n-Kanal MOSFET | Zur Schaltung größerer Lasten wurde ein n-Kanal MOSFET der Firma ST verwendet. Dieser kann Spannungen bis 60 Volt schalten und hält Ströme bis zu 16 Amper aus. Durchlasswiderstand ist kleiner als 0,09 Ohm und typischerweise 0,07 Ohm. Der MOSFET wird in einem TO-220 Gehäuse geliefert.[5] | |
Optokoppler EL817 | Aufgrund der unterschiedlichen Spannungsniveaus der verschiedenen Stromkreise des Fahrzeuges und des Mikrokontroller wurde ein Optokoppler verwendet. Auf der Eingangsseite schaltet er mit 1,2Volt und auf der Ausgangsseite können bis zu 35Volt geschaltet werden. Hierbei ist eine Isolierung von Aus- und Eingangsseite bis zu 5000V gewährleistet. Beide Seiten können bis zu 50mA leiten. Die Gehäuseform entspricht einem DIP mit 4 Anschlüssen.[7] | |
Widerstände | Es wurden 2 330Ohm und 3 10kOhm Widerstände zur Realisierung der Schaltung verwendet. Dabei kommen die 330Ohm Widerständen zur Strombegrenzung und die 10kOhm Wiederstände als Pullup- beziehungsweise Pulldown-Wiederstand zum Einsatz. Aus Kostengründen wurden Kohleschichtwiderstände mit einer Genauigkeit von 5% verwendet. Aufgrund des Verwendungszweckes reicht diese Genauigkeit. | |
Diode BA 159 | In der Schaltung für die Nutzereingabe wurde eine Gleichrichterdiode verwendet. Diese Diode hält bis zu 1000 Volt in Sperrrichtung und 1 Amper stand.[9] | |
RC-Auto | Als Basis für das Projekt wurde ein Ferngesteuertes Modellauto der Firma Dickie Toys modifiziert. Es besitzt Federung, Heckantrieb und Lenkung. Der Motor kann in nur einer Leistungsstufe betrieben werden. |
Umsetzung (HW/SW)
Die Umsetzung der Hardware ist in vier Bereiche zu unterteilen. Die Schnittstelle zum Menschen stellt zwei dieser Bereiche dar, zum einen Nutzereingabe und zum anderen die Nutzerausgabe. Die Nutzereingabe erfolgt über die Fernbedienung des Modellautos und die Nutzerausgabe wird durch ein Display realisiert. Die verbleibenden Bereiche sind die Schnittstellen zu dem Antrieb des Fahrzeuges. Die Ansteuerung des Antriebsmotors ist ein Aktor und die Raddrehzahlerfassung ein Sensor. Die Software umfasst dieselben vier Bereiche und den Bereich der Regelung.
Hardware
Nutzerausgabe: Das Display für die Nutzerausgabe wird über den I2C Bus an den Mikrokontroller angeschlossen. Zusätzlich wird das Display mit der Versorgungsspannung und der Masse des Arduino verbunden.
Nutzereingabe: Die Nutzereingabe wird über die Fernbedienung realisiert, um die Signale abzugreifen werden die Ursprünglichen Signale zum Motor für vor und Rücklauf ausgewertet. Durch Versuche konnte herausgefunden werden, das bei Vorlauf das gelbe Anschlusskabel des Motors ein Potential von 9,6 V zur Masse des Fahrzeuges, und das weiße Anschlusskabel eine Potential von 0,2 V aufweist. Bei Rücklauf des Motors sind diese Werte vertauscht und bei nicht aktiviertem Motor weisen beide Anschlüsse ein Potential von 3,6 V zur Masse auf.
Diese Anschlüsse gehen auf eine Schaltung aus der Eingangsseite von zwei Optokoppler und einem 330Ohm Widerstand. Die beiden Optokoppler sind parallel geschaltet und gegenläufig gepolt. Der Widerstand ist in Reihe geschaltet und dient der Begrenzung des Stroms unter den Maximal zulässigen Wert der Optokoppler 50mA. Durch die gegenläufige Polung wird je nach Richtung des fließenden Stroms immer nur ein Optokoppler aktiviert. Sollte keine Potenzialdifferenz zwischen den beiden Anschlüssen anliegen so wird keiner der beiden Optokopplern aktiviert.
Die Ausgangsseite des ersten Optokopplers ist mit einem Interrupt fähigen Pin des Arduino verbunden, der durch einen 10kOhm Pullup-Widerstand mit der Versorgungsspannung des Arduinos verbunden ist. Wird der Optokoppler aktiviert so wird der Pin mit der Masse verbunden, sodass eine fallende Flanke entsteht welche einen Interrupt auslösen kann. Der zweite Optokoppler ist mit einem digitalen Eingangspin verbunden und über eine Diode mit dem Interrupt-Pin. Bei Aktivierung des Optokopplers werden beide Pins mit der Masse verbunden, sodass ein Interrupt ausgelöst werden kann und der digitale Pin das Masse Potenzial annimmt. Beim auftreten eines Interrupts kann so entschieden werden welcher der beiden Optokoppler aktiviert wurde und damit ausgelesen werden und damit die Nutzereingabe ausgelesen werden.
Theoretisch könnte die Funktion ebenfalls mit zwei Interrupt-Pins gelöst werden, wodurch die Diode gespart werden kann. Da der verwendete Microcontroller jedoch nur zwei Interrupt-Pins besitz und einer für die Auswertung des Sensors verwendet werden soll, wurde die beschriebene Schaltung umgesetzt, welche einen Pin als Interrupt für Nutzereingabe verwendet. Alternativ könnte die Nutzereingabe auch über Polling geschehen, indem digitale Eingänge in sehr kurzen Abständen abgefragt werden. Um eine zuverlässige Eingabe zu ermöglichen, müsste der Microkontroller jedoch einen erheblichen Anteil der Rechenzeit mit der Nutzereingabe verbringe. Hierdurch könnte möglicherweise die eigentliche Aufgabe, die Geschwindigkeitsregelung, gestört werden.
Ansteuerung des Antriebsmotors: Der Motor benötigt im Betrieb eine Spannung von etwa 9,4 V und einen Strom von 500 mA. Um diese von der Versorgungsspannung des Microcontrollers abweichenden Spannung schalten zu können, wird ein Optokoppler verwendet. Dieser isoliert die Spannung des Mikrokontrollers zur Spannung des Fahrzeuges und wird an das Gate des n-Kanal MOSFETS angeschlossen, um den Strom schalten zu können. Dies ist aufgrund des maximalen Ausgangsstrom des Optokopplers notwendig. Die Motorleistung wird somit durch einen mit dem Motor in Reihe geschalteten n-Kanal MOSFET geregelt, wobei die Reihenschaltung die Versorgungsspannung mit der Masse des Fahrzeugs verbindet. Der Optokoppler verbindet bei Aktivierung das Gate des MOSFTES mit der Versorgungsspannung des Fahrzeugs. Zudem ist das Gate über einen 10kOhm Pulldown-Widerstand mit der Masse des Fahrzeugs verbunden um bei nicht Aktivierung des Optokopplers den MOSFET zu sperren. Der Optokoppler wird mit einem PWM Pin des Mikrokontrollers verbinden und über einen 330Ohm Widerstand mit der Masse des Mikrokontrollers. Der Widerstand dient zur Begrenzung des Stroms unter den maximal zulässigen Wertes der Eingangsseite des Optokopplers von 50mA.
Durch die Schaltung kann die Motorleistung daher durch eine Pulsweitenmodulation geregelt werden. Alternativ könnte der verwendete MOSFET im Triodenbereich betrieben werden. Dadurch würden jedoch hohe Verlustleistungen entstehen, welche durch eine Verwendung als Schalter durch eine Pulsweitenmodulation nicht entstehen, da der MOSFET im Stromsättigungsbereich betrieben wird.
Raddrehzahlerfassung: Für die Auswertung der Geschwindigkeit wird ein Hall-Effekt Sensor verwendet. Durch den Hallsensor wird das Magnetfeld eines Permanentmagneten detektiert, welcher sich im Reifen des Fahrzeuges befindet. Dieser wird mit der Versorgungsspannung und der Masse des Mikrokontrollers sowie mit einem Interrupt-fähigen Pin verbunden. Um das Potenzial einzustellen wird ein 10kOhm Pullup Widerstand mit der Versorgungsspannung des Mikrokontrollers verbunden.
Der TLE4905L ist ein Unipolarer Halleffektsensor auf Halbleiterbasis, welcher bei einer gewissen magnetischen Feldstärke den Ausgangspin mit der angeschlossenen Masse verbindet und bei geringerer magnetischen Feldstärke die Verbindung wieder trennt. Durch die Schalthysterese des Sensor wird gewährleistet, dass pro Radumdrehung der Sensor nur einmal ausgelöst wird. Die Schaltung setzt einen vereinfachten Anwendungsschaltkreis aus dem Datenblatt des Sensors um. Auf die aufgeführten 4,7nF Kondensatoren wurde aus Kostengründe und Lieferschwierigkeiten verzichtet, da bei Test auch ohne diese Komponenten eine gute Genauigkeit erzielt werden konnte, welche auf die gleichmäßige Spannungsversorgung und gleichmäßige geringe Leitung der Anwendungsschaltkreise zurückzuführen ist.
Platine: Alle Schaltungen sind auf einer Platine zusammengefasst. Diese Platine besitzt Schnittstellen zu anderen Komponenten des Gesamtsystems: Dem Hallsensor (3 Kabel), dem Kotrollerboard des RC-Autos (5 Kabel), zum Display (4 Stecker) und dem Arduino (8 Kabel). Die Kabel zum Arduino sind fest verlötet und könne in die Verbinder des Arduino gesteckt werden. Die Kabel zum Kotrollerboard des RC-Autos werden über Lüsterklemmen verbunden. Der Sensors ist fest verlötet und für das Display wurden Steckverbinder gewählt.
Der Aufbau auf einer Lochrasterplatine wurde aufgrund von Anforderung 2.0 und 4.0 dem vorher realisiertem Aufbau auf einem Steckbrett vorgezogen. Die wichtigsten Verbindungen wurde auf der Platine verlötet, ebenfalls um Anforderung 4.0 zu erfüllen.
-
Platine
-
Interfaces
-
Verdratungsplan
Software
Die Software wurde mithilfe der Arduino IDE-Umgesetzt. Die verwendete Programmiersprache ist damit C++. Für die Software wurde das Projekt in die oben beschriebenen Bereiche Unterteilt. für jeden Bereich wurde eine Software Modul verwendet, wobei für die Displayausgabe bestehende Lösungen verwendet wurden, während für die Restlichen Bereiche neue Module mit cpp-Dateien und h-Dateien entwickelt wurden.
Displayausgabe (Wire, LiquidCristal_I2C): Für die Ansteuerung des Displays wurden die vom Zulieferer Funduino empfohlenen Bibliotheken Wire und LiquidCristal_I2C verwendet. Ein neues LCD-Display kann durch den folgenden Befehl angelegt werden:
LiquidCrystal_I2C lcd(0x27, 2, 1, 0, 4, 5, 6, 7, 3, POSITIVE);
Die Initialisierung geschieht durch den folgenden Befehl:
lcd.begin(16, 2);
Mit den Folgenden Befehlen kann im Programmablauf das Display gelöscht werden, der Cursor an eine bestimmte Spalte und Zeile gesetzt werden und an diese ein String gedruckt werden.
lcd.clear(); lcd.setCursor(0, 0); lcd.print("Hallo Welt");
Geschwindigkeitsmessung (HallSpeed):
#ifndef HallSpeed_h #define HallSpeed_h /** * Geschwindigkeitsmessung mittels eines Hallsensors * Datum: 29.12.2020 * Autor: Mario Wollschläger */ unsigned int radumfang; //radumfang in mm unsigned int t0; unsigned long timeStamp; unsigned long delta; /** * ISR fuer ausloesen des Hallsensors */ void hall(); /** * Initialisierung der Geschwindigkeitsmessung * pin: Anschlusspin des Sensors * pRadumfang: zurueckgelegte Strecke zwischen zwei Ausloeseungen des Sensors (vorzugsweise in mm) * pT0: Zeit bis von einem Stillstand ausgegangen wird in ms */ void initSpeedometer(int pin, unsigned int pRadumfang, unsigned int pT0); /** * Methode um Aktuelle Geschwindigkeit abzufragen * Rückgabe in mm/s, falls pRadumfang in mm */ int getSpeed(); #endif
Motoransteuerung (Motor):
#ifndef Motor_h
#define Motor_h
/**
* PWM-Motorsteuerung
* Datum: 29.12.2020
* Autor: Mario Wollschläger
*/
class Motor{
private:
char v;
char r;
public:
/**
* Initialisieren des Motors:
* pinVor: PWM-Pin fuer Vorwaertsfahrt des Motors
* pinRueck: PWM-Pin fuer Rueckwaertsfahrt des Motors (falls nicht vorhanden: auf -1 setzen)
*/
Motor(int pinVor, int pinRueck);
/**
* Motor mit gegebner Power beteiben
* wert: Kraft, 0 bis 255, falls nur Vorwaerts
* -255 bis 255 falls Vor- und Rueckwarts
*/
void power(int wert);
};
#endif
Nutzereingabe (userInput):
#ifndef userInput_h #define userInput_h /** * Nutzereingabe mit einem Interuptpin und 2 Eingabemoeglichkeiten * Datum: 30.12.2020 * Autor: Mario Wollschläger */ int uservalue; int stepsize; int inputPin1; int inputPin2; unsigned long lastUserInput; unsigned int entprellzeit; int userMax; int userMin; /** * ISR für Usereingabe */ void userInput(); /** * Initialisuerung des Userinputs, der Nutzer kann einen Wert schrittweise um einen festgelegte Schrittweite erhoehen oder veringern (Startwert: 0) * inputA: Pin 1 fuer Usereingabe und Interupt-Pin * inputB: Pin 2 fuer Usereingabe * pStepsize: schritweite bei Usereingabe * pEntprellzeit: Entprellzeit für die Verweindung mechanischer Taster * pUserMax: Maximalwert der durch den Nutzer eingestellt werden kann * pUserMin: Minimalwert der durch den Nutzer eingestellt werden kann */ void initUserInput(char inputA, char inputB, int pStepsize, unsigned int pEntprellzeit, int pUserMax, int pUserMin); /** * gibt den vom Nuter eingestellten Wert */ int getUservalue(); #endif
Reglung der Motorleistung(begrenzterRegler):
#ifndef begrezterRegler_h #define begrezterRegler_h /** * PI-Regeler mit Stellgroessenbeeschraenkung * Datum: 29.12.2020 * Autor: Mario Wollschläger */ class BegrenzterRegler{ private: double iAnteil; unsigned int p; unsigned int i; int rMax; int rMin; /** * Begrenzt einen Regewert auf rMin bis rMax * wert: zu begrenzender Wert */ double begrenzung(double wert); /** * Umsetzung eines PI-Reglers * regelfehler: Regelabweichung e * zeitMs: Zeit seit des letzten Releraufruf in ms */ double piRegler(int regelfehler, unsigned int zeitMs); public: /** * Initialisierung des Reglers * pP: P-Anteil des PI-Reglers * pI: I-Anteil des PI-Reglers * pRMax: Maximalwert des Reglers * pRMin: Minimalwert des Reglers */ BegrenzterRegler(unsigned int pP, unsigned int pI, int pRMax, int pRMin); /** * Gibt eine Regelwert basierend auf einem Regelfeher zurueck * Beschraenkt auf rMin bis rMax * Umgestezt durch eine PI-Regler * regelfehler: Regelabweichung e * zeitMs: Zeit seit des letzten Releraufruf in ms */ int regelWert(int regelfehler, unsigned int zeitMs); /** * Ermoeglicht das Aendern des P- und I- Wertes während des laufenden Betriebs * pP: P-Anteil des PI-Reglers * pI: I-Anteil des PI-Reglers */ void setPI(unsigned int p, unsigned int i); }; #endif
Komponententest
Halleffektsensor
Motoransteuerung
Benutzereingabe
Display
Gesamtschaltung Steckbrett
Gesamtschaltung Platine
Ergebnis
Es funktioniert!
Zusammenfassung
Lessons Learned
Projektunterlagen
Projektplan
Projektdurchführung
Datum | Aufgabe | Durchgeführt | Status |
---|---|---|---|
05.10.2020 | Ausarbeitung einer Grundidee | = | Abgeschlossen |
08.10.2020 | Wiki-Artikel anlegen | = | Abgeschlossen |
09.10.2020 | Systementwurf, Wiki-Artikel Konzept | = | Abgeschlossen |
05.11.2020 | Sensortest, Hallsensor | = | Teilweise Abgeschlossen |
18.12.2020 | Motoransteuerung | =, Sensortest, Hallsensor | Abgeschlossen |
21.11.2020 | Regelkreis und Simulation | = | Teilweise Abgeschlossen |
27.11.2020 | Gesamtaufbau Steckbrett | = | Abgeschlossen |
28.11.2020 | Software Projekt anlegen | = | Abgeschlossen |
29.11.2020 | Software Geschwindigkeitsmessung, Regler, Motor | = | Abgeschlossen |
30.11.2020 | Software und Steckbrett Benutzereingabe | = | Abgeschlossen |
02.01.2021 | Platine Zusammenbau | = | Teilweise Abgeschlossen |
03.01.2021 | Platine Test, Kontaktierung, Gesamtaufbau | =, Platine Zusammenbau | Abgeschlossen |
04.01.2021 | Informationsaustausch, Wiki-Artikel Struktur | = | Abgeschlossen |
04.01.2021 | Wiki-Artikel Komponentenspezifikation | = | In Arbeit |
YouTube Video
Weblinks
Literatur
- ↑ Eigenes Dokument
- ↑ Eigenes Dokument
- ↑ Arduino: Arduino- ArduinoBoardUno. 2021. Online im Internet: https://www.arduino.cc/en/Main/arduinoBoardUno> Abruf: 05.01.2021
- ↑ https://cdn-reichelt.de/bilder/web/artikel_ws/B400/PICTURE_2SS52M.jpg
- ↑ STMikroelektronics: STP16NF06L/FP. 2004. Online im Internet: https://cdn-reichelt.de/documents/datenblatt/A200/TXSTM-POWERMOSFET-STX-16NF06L_EN.pdf; Abruf: 05.01.2021
- ↑ https://cdn-reichelt.de/bilder/web/xxl_ws/A200/TO-220.png
- ↑ EVERLIGHT ELETCRONICS CO., LTD: Technical Data Sheet - Photocoupler-EL817 Series. 2004. Online im Internet: https://cdn-reichelt.de/documents/datenblatt/A500/EL817-EVL.pdf; Abruf: 05.01.2021
- ↑ https://cdn-reichelt.de/bilder/web/artikel_ws/A501/DIP-4.jpg
- ↑ Continental Device India Limited: FAST SWITCHING PLASTIC RECTIFIERS - BA157, BA158, BA159. Jahr Unbekannt. Online im Internet: https://cdn-reichelt.de/documents/datenblatt/A400/BA157_BA158_BA159_CDIL.pdf; Abruf: 05.01.2021
- ↑ https://cdn-reichelt.de/documents/datenblatt/A400/BA157_BA158_BA159_CDIL.pdf
→ zurück zur Übersicht: WS 20/21: Fachpraktikum Elektrotechnik (MTR)