Menu Close

Mikroprozessorsysteme (Praktikum 4)

Aufgabe 1

Das Programm aus Termin4-Aufgabe1.c soll übersetzt und getestet werden. Wie groß ist die gemessene Periodendauer TPA4? Verändert sich die Periodendauer bei Belastung der Waage.

  • Die Periodendauer TPA4 beträgt bei unbelasteter Waage(0g) 1999,71001μs, also ungefähr 2ms.
  • Bei einer Belastung der Waage um bspw. 50g steigt die Periodendauer von TPA4
#include "../h/pio.h"
#include "../h/tc.h"
#include "../h/pmc.h"

// für die Initialisierung der Zähler TC4 & TC5 // Define TC5_INIT aus Platzgründen gelöscht
#define TC4_INIT TC_CLKS_MCK2 | TC_LDBSTOP | TC_CAPT | TC_LDRA_RISING_EDGE | TC_LDRB_RISING_EDGE

int main(void)
{
volatile int captureRA1 = 0, captureRA2 = 0; volatile int captureRB1 = 0, captureRB2 = 0;
volatile int capturediff1 = 0, capturediff2 = 0; volatile float Periodendauer1 = 0, Periodendauer2 = 0;

StructPMC* pmcbase = PMC_BASE;
StructPIO* piobaseA = PIOA_BASE; StructPIO* piobaseB = PIOB_BASE;
StructTC* tcbase4 = TCB4_BASE; StructTC* tcbase5 = TCB5_BASE;

pmcbase->PMC_PCER = 0x06f80; // Clock PIOA, PIOB, Timer5, Timer4, Timer1 einschalten
piobaseB->PIO_PER = KEY3; // PIO kontrolliert SW2 // Key2
piobaseB->PIO_ODR = KEY3; // als Eingang

// Periodendauer der Waagensignale messen
// Signal aud TIOA4 ca. 16kHz entspricht ca. einer Periodendauer von 62,5us
// durch den Teiler von 32 ergeben sich ca. 2ms
// Zähler mit positiver Flanke starten

piobaseA->PIO_PDR = 0x090;
tcbase4->TC_CCR = TC_CLKDIS; tcbase5->TC_CCR = TC_CLKDIS;
tcbase4->TC_CMR = TC4_INIT; tcbase5->TC_CMR = TC5_INIT;
tcbase4->TC_CCR = TC_CLKEN; tcbase5->TC_CCR = TC_CLKEN;

while((piobaseB->PIO_PDSR & KEY3)) // Wenn KEY3 gedrückt wird
{
int temp = tcbase4->TC_SR & 0x40; // vor SWTRG beide Timer-Statusregister lesen
temp = tcbase5->TC_SR & 0x40;
tcbase4->TC_CCR = TC_SWTRG; tcbase5->TC_CCR = TC_SWTRG;
while (!( tcbase4->TC_SR & 0x40));
while (!( tcbase5->TC_SR & 0x40)); // Capture Register B wurde geladen -> Messung abgeschlossen
captureRA1 = tcbase4->TC_RA; captureRB1 = tcbase4->TC_RB; capturediff1 = abs(captureRB1) - abs(captureRA1);
Periodendauer1 = abs(capturediff1) / 12.5; // Zeit in us

captureRA2 = tcbase5->TC_RA; captureRB2 = tcbase5->TC_RB;
capturediff2 = abs(captureRB2) - abs(captureRA2);
Periodendauer2 = abs(capturediff2) / 12.5; // Zeit in us
Periodendauer2 = abs(capturediff2) / 12.5; // Zeit in us
}
return 0;
}

Aufgabe 2

Das Programm soll so erweitert werden, dass auch die Periodendauer TPA7 erfasst wird (Siehe Code auf Seite 1). Es soll getestet werden, ob sich auch hier die Periodendauer um die 2ms bewegt.

→ Der Test hat gezeigt, dass sich auch die Periodendauer von TPA7 um 2ms bewegt.

Aufgabe 3

Aus dem Verhältnis der Frequenzen fPA4 und fPA7 lässt sich mit der folgenden Gleichung die Masse m berechnen:

m = C1 * [(fPA7/ fPA4) -1] – C2

oder

m = C1 * [(TPA7/ TPA4) -1] – C2,

wobei C1, C2 = wägezellenspezifische Konstanten sind. Die Frequenz an PA4 wird mit zunehmendem Gewicht kleiner, während die Frequenz von PA7 mit zunehmendem Gewicht größer wird.

Um die Messwerte des Programms zu verifizieren, soll die Masse m, die auf der Waage liegt, zur Kontrolle berechnet werden (WaSim: C1 = 2000, C2 = 0).

Eingestelltes GewichtTPA4TPA7Errechnete Masse m
0 g1999,76001 μs1999,76001 μs0 g
50 g1974,71997 μs2024,64001 μs49,31g
100 g1950,88000 μs2048,56006 μs100,13 g

Aufgabe 4

void Timer_Init(void)
{
StructTC* tcbase4 = TCB4_BASE; StructTC* tcbase5 = TCB5_BASE;
StructPIO* piobaseA = PIOA_BASE;
// Periodendauer der Waagensignale messen
// Signal aud TIOA4 ca. 16kHz entspricht ca. einer Periodendauer von 62,5us
// durch den Teiler von 32 ergeben sich ca. 2ms
// Zähler mit positiver Flanke starten
piobaseA->PIO_PDR = 0x090;
tcbase4->TC_CCR = TC_CLKDIS; tcbase5->TC_CCR = TC_CLKDIS;
tcbase4->TC_CMR = TC4_INIT; tcbase5->TC_CMR = TC5_INIT;
tcbase4->TC_CCR = TC_CLKEN; tcbase5->TC_CCR = TC_CLKEN;
}

int MessungderMasse(void)
{
StructPMC* pmcbase = PMC_BASE;
StructPIO* piobaseA = PIOA_BASE; StructPIO* piobaseB = PIOB_BASE;
StructTC* tcbase4 = TCB4_BASE; StructTC* tcbase5 = TCB5_BASE;
volatile int captureRA1 = 0, captureRA2 = 0; volatile int captureRB1 = 0, captureRB2 = 0;
volatile int capturediff1 = 0, capturediff2 = 0;
volatile float Periodendauer1 = 0, Periodendauer2 = 0;
volatile int C1 = 2000; volatile int C2 = 0;
volatile float m; // Masse

while((piobaseB->PIO_PDSR & KEY3)) // Wenn KEY3 gedrückt wird
{
volatile int temp = tcbase4->TC_SR & 0x40; // vor SWTRG beide Timer-Register lesen
temp = tcbase5->TC_SR & 0x40;
tcbase4->TC_CCR = TC_SWTRG;
tcbase5->TC_CCR = TC_SWTRG;
while (!( tcbase4->TC_SR & 0x40));
while (!( tcbase5->TC_SR & 0x40)); // Capture Register B wurde geladen Messung abgeschlossen
captureRA1 = tcbase4->TC_RA; // captureRB1 = tcbase4->TC_RB;
capturediff1 = abs(captureRB1) - abs(captureRA1);
Periodendauer1 = abs(capturediff1) / 12.5; // Zeit in us

captureRA2 = tcbase5->TC_RA; // captureRB2 = tcbase5->TC_RB;
capturediff2 = abs(captureRB2) - abs(captureRA2);
Periodendauer2 = abs(capturediff2) / 12.5; // Zeit in us
Periodendauer2 = abs(capturediff2) / 12.5; // Zeit in us

m = C1*((Periodendauer1/Periodendauer2)-1)-C2;
return m; }
}

int main(void)
{
StructPMC* pmcbase = PMC_BASE;
StructPIO* piobaseA = PIOA_BASE;
StructPIO* piobaseB = PIOB_BASE;
volatile int Masse;
PIO_Init();
Timer_Init();

while(!(piobaseA->PIO_ODSR & KEY3))
{
Masse = MessungderMasse();
}
return 0;
}

Es soll eine Funktion int MessungderMasse(void) zur Ermittlung der Masse in Gramm erstellt werden.

Hinweis: Es sollte der Mittelwert aus mehreren Messungen gebildet werden um die Masse möglichst genau bestimmen zu können.

Schreiben Sie einen Kommentar

Ihre E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert

Diese Website verwendet Akismet, um Spam zu reduzieren. Erfahren Sie, wie Ihre Kommentardaten verarbeitet werden.

Index