Geschwindigkeitsregelanlage

Aus HSHL Mechatronik
Zur Navigation springen Zur Suche springen

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

Systementwurf [1]
Erweiterung des Systementwurf[2]

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.
Fundiono UNO R3
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.
Infinion TLE4905L [4]
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.
16x2 I2C Display
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]
STP16NF06L [6]
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]
EL817[8]
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.
Widerstände
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]
BA 159[10]
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.
Modellauto

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.


Schaltung für Nutzereingabe
Steckbrettschaltung für Nutzereingabe

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.

Schaltung für Motoransteuerung
Steckbrettschaltung für Motoransteuerung

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.

Schaltung für den Hallsensor
Steckbrettschaltung für Hallsensor

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. </gallery>

Software

Modulstruktur und Anbindung an Hardwaredienest

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

Dateibeschreibung/Tooltip

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

  1. Eigenes Dokument
  2. Eigenes Dokument
  3. Arduino: Arduino- ArduinoBoardUno. 2021. Online im Internet: https://www.arduino.cc/en/Main/arduinoBoardUno> Abruf: 05.01.2021
  4. https://cdn-reichelt.de/bilder/web/artikel_ws/B400/PICTURE_2SS52M.jpg
  5. STMikroelektronics: STP16NF06L/FP. 2004. Online im Internet: https://cdn-reichelt.de/documents/datenblatt/A200/TXSTM-POWERMOSFET-STX-16NF06L_EN.pdf; Abruf: 05.01.2021
  6. https://cdn-reichelt.de/bilder/web/xxl_ws/A200/TO-220.png
  7. 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
  8. https://cdn-reichelt.de/bilder/web/artikel_ws/A501/DIP-4.jpg
  9. 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
  10. https://cdn-reichelt.de/documents/datenblatt/A400/BA157_BA158_BA159_CDIL.pdf

→ zurück zur Übersicht: WS 20/21: Fachpraktikum Elektrotechnik (MTR)