Geschwindigkeitsermittlung: Unterschied zwischen den Versionen

Aus HSHL Mechatronik
Zur Navigation springen Zur Suche springen
Zeile 6: Zeile 6:
[[Benutzer:Hauke_Ludwig| Hauke Ludwig]]
[[Benutzer:Hauke_Ludwig| Hauke Ludwig]]
== Hardware ==
== Hardware ==
Die Hardware wird im Artikel vom Sommersemester 2014 beschrieben: [http://193.175.248.171/wiki/index.php/Carolo_Geschwindigkeit_SS14 Hardwarebeschreibung].
Die Hardware wird im Artikel vom Sommersemester 2014 beschrieben: [[Carolo_Geschwindigkeit_SS14|Hardwarebeschreibung]].


== Software ==
== Software ==

Version vom 9. März 2016, 09:06 Uhr

→ zurück zum Hauptartikel: Praktikum SDE


Ziel dieses Spezialthemas ist die Ermittlung der wahren Gechwindigkeit des Fahrzeuges im Online-Model. Als Input werden die Hallsensoren des Motors asynchron ausgelesen und durch eine Logik verarbeitet.

Projektteam

Jan Kifmann
Hauke Ludwig

Hardware

Die Hardware wird im Artikel vom Sommersemester 2014 beschrieben: Hardwarebeschreibung.

Software

Auslesen der Interrupts

Abb. 1: Submodul "SEN - Geschwindigkeit"

Nachdem im vorherigen Abschnitt die Hardware-Ansteuerung für die Geschwindigkeitsermittlung dargestellt wurde, soll der folgende Abschnitt die Software-Implementierung darstellen. Um nach Möglichkeiten alle Hall-Signale auslesen zu können, wird die Abfrage der Sensoren in einen asynchronen Task ausgelagert. Die geschieht durch die Anbindung eines Triggers, welcher auf die Interrupts der DS1104 achtet. Sobald dort ein Interrupt gesetzt wird, werden die Sensoren abgefragt und einmalig ausgewertet. Der asynchrone Task befindet sich im Hauptmodell "CCF_online" im Submodul "SEN - Geschwindigkeit". Dort sieht man, dass es ein weiteres Submodul gibt, welches als Trigger den Eingang "DS1104MASTER_HWINT_I2" hat. Über diesen Block werden die Interrupts der DS1104 eingelesen. Das ist in der Abbildung 1 dargestellt.


Wie man in Abbildung 1 erkennen kann, werden die einzelnen Outputs des Submodules durch "Rate Transmission" auf "GoTo" gesendet. Die "GoTo" verweisen auf die Bibliothek "Sensoren online", wo die ermittelten Werte weiter verwendet werden. Die Trennung zwischen den beiden Modulen ist notwendig, um das Modell ständig mit aktuellen Werten versorgen zu können. Diese Versorgung wird dadurch sichergestellt, dass die Rate Transmission für jeden Durchlauf den alten Wert bereit hält.

Kombinatorik der Hall-Signale

Submodul "SEN - Geschwindigkeit"

Wie eben beschrieben werden die Hall-Signale asynchron ausgelesen. Sobald diese über den ADC-Eingang der DS1104 eingelesen wurden, werden diese mit dem Wert 0.5 verglichen. Dieser Schritt erzeugt aus dem analogen Eingangssignal ein digitales Signal im Wertebereich [0 1], welches die weitere Verarbeitung deutlich erleichtert. Die digitalen Signale werden anschließend in einer S-Function bearbeitet und zur Geschwindigkeitsermittlung aufbereitet.

Sollte es beim Kompilieren des Projektes Probleme geben, kann es hilfreich sein, wenn man die S-Function einmal neu "Builded". Dies passiert, indem man die S-Function öffnet und oben rechts auf den Button "Build" klickt.

Innerhalb der S-Function werden die Hall-Signale einer Kombinatorik unterzogen, welche die folgenden Gesetzen folgt:

Motorstatus Hall A Hall B Hall C
1 1 0 1
2 1 0 0
3 1 1 0
4 0 1 0
5 0 1 1
6 0 0 1


Die Auswertung der Motoränderungen werden in der zweiten S-Function beschrieben. Hierbei entspricht jeder positive Wechsel (1->2 ... 5->6) einer Vorwärtsbewegung und jeder negative Wechsel (6->5 ... 2->1) einer Rückwärtsbewegung. Dabei entspricht ein Statuswechsel einer 1/6-Motordrehung. Durch empirische Studien konnte nachgewiesen werden, dass sich eine Motordrehung nach folgender Formel in die reale Bewegung in des Fahrzeuges auf der Straße umwandeln lässt: SPEED = 0.0867 * MOTORSPEED + 0.027.

Filterung

Abb. 3a: Messung "Geschwindigkeit"
Abb. 3b: Messung "Geschwindigkeit"

Die ermittelte Geschwindigkeit weißt ein starkes Rauschen auf, welches durch "Zucken" des Motors und ungenaues Auslesen der Hall-Sensoren erklärt werden kann. Um die Geschwindigkeit sauber auf den Bus legen zu können, soll diese gefiltert werden. Diese Filterung erfolgt wie nachfolgend erklärt mit einer Limitierung und einem PT1-Filter.

In Abbildung 3a kann man erkennen, dass im ersten Graph das reine Messsignal abgebildet ist. Hierbei erkennt man deutlich die Peaks und das hohe Flattern des Signals. Um aus diesem Signal eine saubere Messung zu kreieren wird das Signal durch ein "Limiter" begrenzt. Dieser Limiter hat die Funktion, dass er alle Werte, welche größer als "20" sind, durch den vorherigen Wert ersetzt. Als zweiten Limiter wird ein Änderungslimiter genutzt, welcher eine Steigung, die größer als "10" ist, nicht zulässt, sondern den Wert limitiert. Das Ergebnis dieser Limiter sieht man in Graph 2 und 3 der Abbildung 3. Das dazugehörige Simulink-Modell ist in Abbildung 3b dargestellt.

Das limitierte Signal kann nun durch einen PT1-Filter gefiltert werden. Das Ergebnis der Filterung mit einer Frequenz von 0.5 Hz lässt sich in Graph 4 der Abbildung 3 erkennen. Nach der Übertragung des Messsignals in das wahre Signal per Funktion kann man in Graph 5 der Abbildung 3 die Geschwindigkeit in m/s erkennen.

Wegmessung

Die Messung des Weges erfolgt per Integration der Geschwindigkeit. Diese Messmethode erscheint sicherer zu sein, als die Messung direkt von den Hall-Signalen. Eine genaue detailierte Überprüfung dieses Sachverhaltes steht noch aus.

Quellcode

Nachfolgend abgebildet ist der Quellcode der Funktion get_direction.c :

// Author: Assad Al-Suleihi
// CASES:
//
//  A B C CaseNum  
//  1 0 1  1
//  1 0 0  2 
//  1 1 0  3
//  0 1 0  4
//  0 1 1  5
//  0 0 1  6

#define FORWARD 1
#define BACKWARD 0

// init
static int last_case = 0;
static int last_dir = FORWARD;
int state;
int case_num = 0;

state = 0;
// setzen des Status
if(HALL_A[0]>0){
    state +=100;
}
if(HALL_B[0]>0){
    state+=10;
}
if(HALL_C[0]>0){
    state+=1;
}

// Übersetzung des Status
switch(state){
    case 101:
        case_num = 1;
        break;
    case 100:
        case_num = 2;
        break;
    case 110:
        case_num = 3;
        break;
    case 10:
        case_num = 4;
        break;
    case 11:
        case_num = 5;
        break;
    case 1:
        case_num = 6;
        break;
    default:
        break;
}
// Ermittlung der Drehrichtung
//Case: Forward Wrap-Around 6->1
if(case_num == 1 && last_case == 6){
    direction[0] = FORWARD;
    last_dir = FORWARD;
    
//Case: Backward Wrap-Around 1->6    
}else if(case_num == 6 && last_case == 1){
    direction[0] = BACKWARD;
    last_dir = BACKWARD;
    
//Case: Forward 1->2 .. 5->6
}else if(case_num > last_case){
    direction[0] = FORWARD;
    last_dir = FORWARD;
    
//Case: Backward 6->5 .. 2->1
}else if(case_num < last_case){
    direction[0] = BACKWARD;
    last_dir = BACKWARD;
    
//Case: No change
}else if(case_num == last_case){
    direction[0] = last_dir;
}
current_state[0] = case_num;
//save current case number
last_case = case_num;

Nachfolgend abgebildet ist der Quellcode der Funktion meas_accel_rtlib.c:

// Author: Asaad Al-Suleihi
// init
static bool first_run = true;
const double disp_single_int = 1;
const double max_time = 171.827509221549;
static double last_time = 0;
static double last_interrupt_count = 0;
static double last_speed = 0;

static double acceleration = 0;

static double delta_interrupts = 1;

static double disp = 1;

double curr_time;
double delta_loops;
double dt;
double speed;

//displacement
#define FORWARD 1
#define BACKWARD 0
const double diameter = 0.0663; //m
#define M_PI 3.14159265358979323846
double circumference = M_PI*diameter; //0.2083 m
//disable for setting ratio in ControlDesk
const double ratio = 1; // 4 Motorumdrehungen = 1 Radumdrehung
const double hall_per_evo = 6;
double step = circumference / (ratio * hall_per_evo);
//filter array
#define BUFF_SIZE 100
static double circ_buff[BUFF_SIZE]={0};
static int buff_wr=0;
static int num_vals_in_buff = 0;
double rolling_mean;
int i;
double mean_speed;
static double last_mean_speed;
double mean_accel;
//

//time using timestamping
static double curr_sec;
static double last_sec;
double dsec;
double timestamp_vel;
//


//Ermittlung der Geschwindigkeit
if (first_run == true){
    first_run = false;
    #ifndef MATLAB_MEX_FILE
    ts_init(TS_MODE_SINGLE,0.0);
    last_sec = ts_time_read();
    #endif
 
    disp = 0;
}

#ifndef MATLAB_MEX_FILE
curr_sec = ts_time_read();
#endif


//Prüfen auf "false" Flanken
if ( (curr_sec - last_sec) > min_delta_t[0]){

    //dt = curr_time - last_time;
    dsec = curr_sec - last_sec;
    
        timestamp_vel = step / dsec;

        //last_time = curr_time;
        last_sec = curr_sec;
        
        if(direction[0] == FORWARD){
            disp += step;
        }else{
            disp -= step;
        }

    displacement[0] = disp;
    velocity[0] = timestamp_vel;
}

HIL Test

Datum: 02.09.2014 Teilnehmer: Al-Suleihi, Prof. Schneider

Aufbau

  • Signalgenerator erzeugt Rechteckflanken mit einer Frequenz von 735,2 Hz
  • Frequenz mit Oszilloskop geprüft
  • Signal geht auf dSpace Breakoutbox
  • Signalverarbeitung im Simulink Modell
  • Gesamte AMR Modell läuft mit.
  • Die Flanken starten einen 10uS Timer.
  • Zwischen den Flanken liegen 1,36ms
  • In Control Desk werden n=137 bzw. 138 Flanken gezählt.
  • Zu Testzwecken wurde die Frequenz ermittelt.
  • Die Frequenz liegt zwischen 724,6Hz und 729,92Hz.
  • Der Raddurchmesser beträgt 0,0663m.
  • Der Radumfang berechnet sich zu 0,2083m.
  • 4 Motorumdrehungen entsprechen 1 Radumdrehung.
  • Mit der neuen Schaltung werden die steigenden und fallenden Flanken des Hallgebers zu je einer steigenden Flanke gewandelt.
  • Pro Kanal A, b, c ergeben sich somit 2 Flanken.
  • Pro Motorumdrehung entstehen 6 Flanken.
  • Mit jeder Flanke hat sich das Rad um 0,008678m bzw. 8,7mm gedreht.
  • Die gefahrene Strecke sollte aus der Summe der Teilstrrecken ermittelt werden.
  • Der Geschwindigkeitsfehler berechnet sich zu:
  • Der maximale Geschwindigkeitsfehler liegt somit bei 4,6cm jede Sekunde.
  • Mit statistischen Mitteln (z.B. Tiefpassfilterung) sollte dieser Fehler um den Faktor 0,1 auf 5mm/s verbessert werden können.
  • Um die Auflösung zu erhohen, könnte mit jedem Timerimpuls die Stecke inkrementiert werden. Dies würde die Auflösung um den Faktor 137 erhöhen. Wenn je 8,7mm 137 Timerflanken gezählt werden sind dies 63um.

Nächste Schritte

Deadline: Freitag, 05.09.14 Bearbeiter: Asaad Al-Suleihi

  • Umsetzung der Testumgebung auf der Hardware (AMR)
  • Strecken und Geschwindigkeitsberechnung.
  • Tiefpassfilterung über 10 Werte
  • Autonome Fahrt in den Geschwindigkeiten 0,5m/s, 1m/s, 2m/s, 3m/s
  • Verifizierung des HIL-ergebnisse am Fahrzeug.
  • Absolute Referenzmessung der Strecke und Geschwindigkeit


Umsetzung der Lösung auf der Hardware (AMR)

Asaad Al-Suleihi

Die Lösung wurde auf Basis der in der HIL-Simulation gewonnenen Erkenntnisse auf der Hardware umgestzt. Dabei ist abweichend zu der HIL-Simulation zwecks der Ermittlung der Zeit nicht auf einem zyklischen Timer zurückgegriffen. Die Zeitmessung wurde auf Basis der dSPACE RTLib (Real-Time Library) implementiert. Die RTLib stellt C-Funktionen zur Verfügung, mit denen den Wert der Zeitgeber der Hardware gelesen werden kann. Diese stellt die höchste genauigkeit dar, die mit der Hardware erreicht werden kann.

Bei der Implementierung und Test hat sich herausgestellt, dass:

  • Die Geschwindigkeit des Fahrzeugs im aufgebockten Zustand wellenformig schwingt. Die Frequenz der Signale der Hall-Sensoren variiert Sinusformig.
  • Bei der Ausgang des XOR-Gatters zu Zusammenführung der Hall-Signale treten Ausreißer auf die einige 10µ-Sekunden breit sind. Diese sind aber ausreichend, um bei der Hardware ein Interrupt auszulösen. Die Ursache der Ausreißer und eine Möglichkeit zur hardwaremäßigen Lösung soll noch betrachtet werden.
    Ausreißer am Ausgang des XOR-Gatters

Die Detektion der Ausreißer könnte per Software gelöst werden. Es wurde ein mindest Abstand zwischen 2 Flanken definiert. Alle Flanken, die in einem kurzeren Abstand zu einander auftreten werden als Fehlflanken erkannt und nicht für die Geschwindigkeitsberechnung herangezogen.

Jedoch ist noch ein Rauschen auf Geschwindigkeitssignal festzustellen. Diese lässt sich durch minimal abweichenden Zeiten zwischen den Flanken erklären. Dieses Rauschen kann gefiltert werden. Zu Demonstration wurde das Signal in PT-1-Glieder unterschiedliche Frequenzen weiterbearbeitet.

Geschwindigkeitssignal vom AMR ungefiltert und mit PT1-Filter der Frequenzen 0,1Hz, 0,5Hz, 1Hz, 2Hz und 5Hz


Versionsablage

Sommersemester 2014


→ zurück zum Hauptartikel: Praktikum SDE