DST EINFÜHRUNG IN MRT V1 (90 min) - zielinski.fh-aachen.de fileDST –EINFÜHRUNG IN MRT...
Transcript of DST EINFÜHRUNG IN MRT V1 (90 min) - zielinski.fh-aachen.de fileDST –EINFÜHRUNG IN MRT...
DST – EINFÜHRUNG IN MRT
Projektaufbau
13.10.2016 1DST - MRT - Einführung
V1 (90 min)
Projekt Versuch 1.1:
Gegeben ist ein Atmel uC.
An PortA sind 8 Taster angeschlossen.
An PortC sind 8 LEDs.
Geben Sie die Taster - Information an den LEDs aus.
(Wenn Taster betätigt, entspr. LED an)
DST – EINFÜHRUNG IN MRT
Projektaufbau als uC - Programmierer
13.10.2016 2DST - MRT - Einführung
V1 (90 min)
Projektannalyse:
Möglicher Ablauf des Projektes (direkt im C - Code)
int main (void)
{
// --- Initialisierungen ----------------------------------------------
// --- Endlosschleife im Hauptprogramm --------------------------------
while(1) { // Endlosschleife
// Controller haben nie ein Programm-Ende)
}
// --- Programm Ende --------------------------------------------------
return 0; // wird nie erreicht!
}
DST – EINFÜHRUNG IN MRT
Projektaufbau als uC - Programmierer
13.10.2016 3DST - MRT - Einführung
V1 (90 min)
// --- Function Deklarationen -----------------------------------------
void Taster_init(void); // PortA (8-Bit-Taster-Port) als Input
void LEDs_init(void); // PortC (8-Bit-LED-Port) als Output
void Algorithm(void); // gibt den Zustand von PORTA nach PORTC
Taster_init(); // PortA (8-Bit-Taster-Port) als Input
LEDs_init(); // PortC (8-Bit-LED-Port) als Output
Algorithm(); // gibt den Zustand von PORTA nach PORTC
Der Programmierer schreibt: main.c, Taster.c, LEDs.c und Algo.c und erstellt, die oben
verwendeten leeren Routinen, so dass das Projekt von Anfang an lauffähig ist, aber nichts macht!
DST – EINFÜHRUNG IN MRT
Projektaufbau als uC - Programmierer
13.10.2016 4DST - MRT - Einführung
V1 (90 min)
Projektannalyse:
Möglicher Ablauf des Projektes (direkt im C - Code)
Analyse und Recherche der Hardware-Komponenten
Wie kann ich die Tasten anschließen ?
ANSCHLÜSSE DES AT-MEGA32
13.10.2016 5DST - MRT - Einführung
Port Platine Robi
PA0 i -Taste 1
PA1 i -Taste 2
PA2 i -Taste 3
PA3 i -Taste 4
PA4 i -Joystick
PA5 i -Joystick
PA6 i -Joystick
PA7 i -Joystick
PB0 LCD RS
PB1 LCD R/W
PB2 i U2 RxD
PB3 o U2 TxD
PB4 SD XSS
PB5 SD XMOSI
PB6 SD XMISO
PB7 SD XSCK
PC0 o -LED 0
PC1 o -LED 1
PC2 o -LED 2
PC3 o -LED 3
PC4 o -LED 4
PC5 o -LED 5
PC6 o -LED 6
PC7 o -LED 7
PD0 i U1 RxD
PD1 o U1 TxD
PD2 LCD E
PD3
PD4 b LCD DB4
PD5 b LCD DB5
PD6 b LCD DB6
PD7 b LCD DB7
DIGITALER INPUT ÜBER MECH. KONTAKT
13.10.2016 6DST - MRT - Einführung
DIGITALER INPUT „PULL DOWN“
13.10.2016 7DST - MRT - Einführung
DIGITALER INPUT „INTERNER PULL UP“
13.10.2016 8DST - MRT - Einführung
Falls der Controller keinen
schaltbaren Pullup Wider-
stand besitzt, muss natürlich
ein externer Widerstand
eingesetzt werden!
Das ist in der Regel, die meist-
benutzte Schaltungsrealisierung.
Sie ist in „negativer Logik“ und
damit Versorgungsspannungs-
unabhängig!
PORT - BLOCKSCHALTBILD
13.10.2016 9DST - MRT - Einführung
DST – EINFÜHRUNG IN MRT
Projektaufbau
13.10.2016 10DST - MRT - Einführung
V1 (90 min)
Projektannalyse:
Möglicher Ablauf des Projektes (direkt im C - Code)
Analyse und Recherche der Hardware-Komponenten
Analyse und Recherche der Software-Komponenten
DST – EINFÜHRUNG IN MRT
Analyse und Recherche der Software-Komponenten
13.10.2016 11DST - MRT - Einführung
V1 (90 min)
#include <avr/io.h> => <portpins.h> => <iom32.h>
/* Port A */
#define PINA _SFR_IO8(0x19)
#define DDRA _SFR_IO8(0x1A)
#define PORTA _SFR_IO8(0x1B)
DST – EINFÜHRUNG IN MRT
Analyse und Recherche der Software-Komponenten
13.10.2016 12DST - MRT - Einführung
V1 (90 min)
PortA0 .. PortA7 = Input
PortA0 .. PortA7 Pull-Up-Widerstände
PortC0 .. PortC7 = Output
DDRA = 0b00000000;
PORTA = 0b11111111;
DDRC = 0b11111111;
Test-Software :
Sinnvoll ist es immer mit einer Ausgabe zu beginnen:
Jetzt Live
DST – EINFÜHRUNG IN MRT
Steuerungs- und Regelungssysteme
13.10.2016 13DST - MRT - Einführung
V1 (90 min)
DST – EINFÜHRUNG IN MRT
Heizungs - Regelung
13.10.2016 14DST - MRT - Einführung
HEIZUNGS – REGELUNG
13.10.2016 15DST - MRT - Einführung
5
5
4
1
1 => 16 x Temp.
5 x Durchflußmenge
HEIZUNGS – REGELUNG
13.10.2016 16DST - MRT - Einführung
Uhrzeit & Datum für Algo.
Anzeige und Tasten für Specs.
HEIZUNGS – REGELUNG
13.10.2016 17DST - MRT - Einführung
-20 °C <= T < 100 °C
HEIZUNGS – REGELUNG
13.10.2016 18DST - MRT - Einführung
HEIZUNGS – REGELUNG
13.10.2016 19DST - MRT - Einführung
HEIZUNGS – REGELUNG
13.10.2016 20DST - MRT - Einführung
5
5
4
1
1 => 16 x Temp.
5 x Durchflußmenge
NTC 0,10 € -80 .. +150 °C
Pt100 2,00 € -100 .. +200 °C
Durchfluss-
Sensor 2,00 €
Platine &
Bauteile 1,50 €
Gehäuse 0,80 €
Lohn & . . . 1,90 €
Software kompl. 0,25 € 250.000,00 €
Summe 16,05 € (150 €)
Gewinn 130 Mio €
DST – EINFÜHRUNG IN MRT
Steuerungs- und Regelungssysteme
13.10.2016 21DST - MRT - Einführung
Mikroprozessoren
Signalprozessoren
Programmierbare Bausteine
SYSTEMAUFBAU
13.10.2016 22DST - MRT - Einführung
BUS SYSTEM
13.10.2016 23DST - MRT - Einführung
BUS TIMING
Schreiben eines Datenbytes zum Speicher 12345H (0x12345)
13.10.2016 24DST - MRT - Einführung
PERIPHERIE
Digitale Ports (I/O)Parallel
Seriell
Analoge Ports (I/O)AC
DC
13.10.2016 25DST - MRT - Einführung
TASTER - AUFAGBE
Taster oder Kontakt: soll ein Ereignis auslösen (event) ?Wie muss der Taster betätigt sein ?Zeitbestimmung der Betätigung ?Darf der Taster auch mal nicht erkannt werden ?
13.10.2016 26DST - MRT - Einführung
Lösung:Tastenzähler soll um 1 erhöht werden!10 Betätigungen sollen pro Sekunde erkannt werden!Prellzeit < 20ms (alle kleineren Taster) => fTast Max < 25Hz!Jede Betätigung > 10ms soll erkannt werden!
TASTER - LÖSUNG
++TAST_WERTfTastenabfrage ~ 100HztPrell = 20 ms
13.10.2016 27DST - MRT - Einführung
Lösung per Softwareschleife:
nur möglich, wenn die Schleife alle 10 msdurchlaufen wird!
Lösung per Interrupteingang:
nur möglich, wenn nicht so viele Kontakte (Taster) im
System vorkommen!
Lösung per Timerinterrupt:
universellste Lösung!
TASTER – LÖSUNG (MIT TIMERINT.)
++TAST_WERTfTastenabfrage ~ 100HztPrell = 20 ms
13.10.2016 28DST - MRT - Einführung
FCPU = 16MHz => 1 Assemblerbefehl ~ 2Zyklen=> 80.000 Befehle pro Interrupt (100Hz -> 10ms)=> 8.000 einfache C-Anweisungen pro Interrupt!
TASTER – LÖSUNG (MIT TIMERINT.)
13.10.2016 29DST - MRT - Einführung
TASTER – LÖSUNG (MIT TIMERINT.)
13.10.2016 30DST - MRT - Einführung
TASTER – LÖSUNG (MIT TIMERINT.)
13.10.2016 31DST - MRT - Einführung
TASTER – STATEMACHINE (1)
13.10.2016 32DST - MRT - Einführung
unsigned int T0_Wert = 0; // globaler Speicher
// Zählt die Tastenbetätigungen
void T0_State_Machine(void) { // 100 Hz also alle 10 ms
static int State = 0; // permanente State Nummer
switch(State) {
case 0: { // 0 warte auf keine Taste
if ((PINA & 0b001) == 0) {State = 100;}
break;
}
case 100: { // 100 warte auf Taste
if ((PINA & 0b001) != 0) {++T0_Wert; State = 0;}
break;
}
default: {
break;
} } }
TASTER – LÖSUNG (MIT TIMERINT.)
13.10.2016 33DST - MRT - Einführung
TASTER – STATEMACHINE (MIT ENTPR.)
13.10.2016 34DST - MRT - Einführung
unsigned int T0_Wert = 0; // globaler Speicher
// Zählt die Tastenbetätigungen
void T0_State_Machine(void) { // 100 Hz also alle 10 ms
static int State = 0; // permanente State Nummer
static int Cnt = 0; // permanente Counter
switch(State) {
case 0: { // 0 warte auf keine Taste
if ((PINA & 0b001) == 0) {Cnt = 2; State = 50;}
break;
}
case 50: { // 20 ms entprellen
--Cnt; if (Cnt == 0) {State = 100;}
break;
}
case 100: { // 100 warte auf Taste
if ((PINA & 0b001) != 0) {Cnt = 2; ++T0_Wert; State=150;}
break;
}
case 150: { // 20 ms entprellen
--Cnt; if (Cnt == 0) {State = 0;}
break;
} } }
TASTER – LÖSUNG (MIT TIMERINT.)
13.10.2016 35DST - MRT - Einführung
TASTER – STATEMACHINE (200MS BETÄT.)
ENTPR.)
13.10.2016 36DST - MRT - Einführung
unsigned int T0_Wert = 0; // globaler Speicher
void T0_State_Machine(void) { // 100 Hz also alle 10 ms
static int State = 0; // permanente State Nummer
static int Cnt = 0; // permanente Counter für div. Aufgaben
switch(State) {
case 0: { // 0 warte auf keine Taste
if ((PINA & 0b001) == 0) {Cnt = 2; State = 50;}
break;
}
case 50: { // 20 ms entprellen
--Cnt; if (Cnt == 0) {State = 100;}
break;
}
case 100: { // 100 warte auf Taste
if ((PINA & 0b001) != 0) {Cnt = 2; State = 150;}
break;
}
case 150: { // 20 ms entprellen
--Cnt; if (Cnt == 0) {Cnt = 20; State = 200;}
break;
}
case 200: { // Taste muss 200 ms gedrückt sein
--Cnt; if (Cnt == 0) {++T0_Wert; State = 0;}
if ((PINA & 0b001) == 0) {State = 0;}
break;
} } }
TIMER / COUNTER ALS INTERRUPTGEBER
13.10.2016 37DST - MRT - Einführung
Interruptfrequenz soll 10 kHz betragen
TIMER / COUNTER ALS INTERRUPTGEBER
13.10.2016 38DST - MRT - Einführung
Interruptfrequenz soll 10 kHz betragen
// Prescaler 101=1024 | 100=256 | 011=64 | 010=8 | 001=1
// f=16MHz/8/200 = 10.000,0 Hz => 0,100 ms
TCCR0 = (0<<CS02) | (1<<CS01) | (0<<CS00); // :8
TIMER / COUNTER ALS INTERRUPTGEBER
13.10.2016 39DST - MRT - Einführung
Interruptfrequenz soll 10 kHz betragen
// Prescaler 101=1024 | 100=256 | 011=64 | 010=8 | 001=1
// f=16MHz/8/200 = 10.000,0 Hz => T = 0,100 ms
TCCR0 = (0<<CS02) | (1<<CS01) | (0<<CS00); // :8
TCCR0 |= (1<<WGM01); // Enable CTC Mode
CTC = Clear Timer On Compare Match
TIMER / COUNTER ALS INTERRUPTGEBER
13.10.2016 40DST - MRT - Einführung
Interruptfrequenz soll 10 kHz betragen
// Prescaler 101=1024 | 100=256 | 011=64 | 010=8 | 001=1
// f=16MHz/8/200 = 10.000,0 Hz => 0,100 ms
TCCR0 = (0<<CS02) | (1<<CS01) | (0<<CS00); // :8
TCCR0 |= (1<<WGM01); // Enable CTC Mode
OCR0 = 200-1; // Output Compare Register = Teiler-1
TCNT0 = 0; // Startwert · Hauptsache <= 199
TIMSK |= (1<<OCIE0); // Timer Interrupt Ausgang Enable
TIFR = (1<<OCF0); // Timer Interrupt Flagregister
// wenn Output Compare == 0
TIMER ALS ZEITBASIS
13.10.2016 41DST - MRT - Einführung
Interruptfrequenz soll 10 kHz betragen !
Es sollen die Funktionen des H.P. (main.c) aufgerufen werden:
volatile uint16_t tim0_iz; // volatile: akt Wert
volatile unsigned char uhr_sek_um = 0; // steht immer im
// Speicher
ISR(TIMER0_COMP_vect) {
++tim0_iz;
if (tim0_iz >= 10000) { tim0_iz = 0; uhr_sek_um++; }
sei();
int10kHz(); // 10 kHz Interrupt
if((tim0_iz % 10) == 5) int1kHz(); // 1 kHz Interrupt
if((tim0_iz % 100) == 88) int100Hz(); // 100 Hz Interrupt
if((tim0_iz % 1000) == 627) int10Hz(); // 10 Hz Interrupt
if((tim0_iz ) == 1243) int1Hz(); // 1 Hz Interrupt
}
int10kHz();
int1kHz();
int100Hz();
int10Hz();
int1Hz();
PRAKTIKUMSBOARD MIT AT-MEGA32
13.10.2016 42DST - MRT - Einführung
PRAKTIKUMSBOARD MIT AT-MEGA32
13.10.2016 43DST - MRT - Einführung
Tastenzähler +Flanke max Wechsel -Flanke
+Flanke Wechsel -FlankePort-Bits
Software-
Realisierte
Entprellung
Prellzeit
GRUNDBOARD MIT AT-MEGA32
13.10.2016 44DST - MRT - Einführung
ANSCHLÜSSE DES AT-MEGA32
13.10.2016 45DST - MRT - Einführung
Port Platine Robi
PA0 i -Taste 1
PA1 i -Taste 2
PA2 i -Taste 3
PA3 i -Taste 4
PA4 i -Joystick
PA5 i -Joystick
PA6 i -Joystick
PA7 i -Joystick
PB0 LCD RS
PB1 LCD R/W
PB2 i U2 RxD
PB3 o U2 TxD
PB4 SD XSS
PB5 SD XMOSI
PB6 SD XMISO
PB7 SD XSCK
PC0 o -LED 0
PC1 o -LED 1
PC2 o -LED 2
PC3 o -LED 3
PC4 o -LED 4
PC5 o -LED 5
PC6 o -LED 6
PC7 o -LED 7
PD0 i U1 RxD
PD1 o U1 TxD
PD2 LCD E
PD3
PD4 b LCD DB4
PD5 b LCD DB5
PD6 b LCD DB6
PD7 b LCD DB7
PORT - BLOCKSCHALTBILD
13.10.2016 46DST - MRT - Einführung
PORT - PROGRAMMIEREN
13.10.2016 47DST - MRT - Einführung
// PortA alle 8-Bits als Input
DDRA = 0b00000000;
// PortC alle 8-Bits als Output
DDRC = 0b11111111;
// PortB Bit 0-3 als Input
// und Bit 4-7 als Output
DDRB = 0b11110000; // n.u.
// Daten von PortA lesen
// und an PortC wieder ausgeben
PORTA = 0b11111111; // Pull-up-Wid.
while(1) {
PORTC = PINA;
}
ANWENDUNG
13.10.2016 48DST - MRT - Einführung
Aktive Raddrehzahlfühler mit eigener Auswerteelektronik
auch: AMR-Sensor (Anisotroper Magnetoresistiver Effekt)
Der Rad-Drehzahlsensor
(Abk.: DF = Drehzahlfühler) wurde zuerst für den Einsatz im Antiblockiersystem (ABS)
entwickelt. Anfänglich handelte es sich um einen passiven induktiven Sensor
(Induktivgeber). Mittlerweile hat aber der aktive Sensor mit eigener Auswerteelektronik
immer mehr an Bedeutung gewonnen.
Positiver Nebeneffekt: Die Rad-Drehzahlinformationen können auch von via CAN-Bus
von Getriebe-, Motor-, Navigations- und Fahrwerksregelsystemen genutzt werden.
Funktionsweise und Messprinzip
Dieser Sensor arbeitet nach dem Hall-Prinzip und hat die Besonderheit, dass er Vorwärts
- und Rückwärtsbewegungen erkennt.
Aktive Raddrehzahlfühler
ANWENDUNG
13.10.2016 49DST - MRT - Einführung
Aktive Raddrehzahlfühler
1 Geberring,
2 Sensor IC mit Hallsensor,
3 Sensorgehäuse
ANWENDUNG
13.10.2016 50DST - MRT - Einführung
Die Drehrichtungserkennung ist durch den internen Signalversatz von drei
entsprechend angeordneten Hallelementen im Sensor möglich. Bei einem
solchen Raddrehzahlsensor übernehmen Magnete die Funktion der Zähne des
Inkrementenrades. Die Magnete sind in Nordpol und Südpol unterschieden und
sind wechselweise auf einen Polring (Geberring) angeordnet.
Anders als beim passiven Raddrehzahlsensor wird der aktive Raddrehzahlsensor
mit einer definierten Spannung versorgt und liefert schon ein im
Raddrehzahlsensor erzeugtes Rechtecksignal in Form eines Datenprotokolls zum
Steuergerät. Dieses Datenprotokoll wird als Stromsignal im
Pulsweitenmodulationsverfahren (PWM) übertragen.
Aktive Raddrehzahlfühler
ANWENDUNG
13.10.2016 51DST - MRT - Einführung
Aktive Raddrehzahlfühler