Probeklausur 6 - Lösungen
Zurück zu den Aufgaben · Formelsammlung
Alle Werte sind exakt durchgerechnet. Der rote Faden: MCK = 84 MHz (A1) -> f_s = 42 MHz / 952 = 44117,647 Hz (A2) -> alle weiteren Aufgaben. Wer mit gerundeten Zwischenwerten rechnet, driftet ab.
Aufgabe 1 - Taktbaum (10 P) [Kap. 2]
1.1 . .
1.2 Der Kommilitone hat das "+1" im Zähler vergessen und mit gerechnet, also . Der PLLA multipliziert laut Datenblatt mit (MULA + 1), weil das Register den Wert 0 als "mal 1" interpretiert. Korrekt ist , (dies ist auch die reale MCK des Arduino Due).
Falle: Das fehlende +1 ist der klassische PLL-Fehler. Er würde jede folgende Aufgabe verfälschen.
Aufgabe 2 - Abtast-Timer und Quantisierungsfehler (16 P) [Kap. 5]
2.1 , tatsächliche Rate :
| Quelle | f_Quelle | RC (gerundet) | tatsächliche f_s | Fehler |
|---|---|---|---|---|
| TCLK1 = MCK/2 | 42 MHz | 952 | 42e6/952 = 44117,65 Hz | +400 ppm |
| TCLK2 = MCK/8 | 10,5 MHz | 238 | 10,5e6/238 = 44117,65 Hz | +400 ppm |
| TCLK3 = MCK/32 | 2,625 MHz | 60 | 2,625e6/60 = 43750,00 Hz | -7937 ppm |
| TCLK4 = MCK/128 | 0,65625 MHz | 15 | 0,65625e6/15 = 43750,00 Hz | -7937 ppm |
2.2 TCLK1 und TCLK2 liefern denselben kleinsten Fehler von +400 ppm (+0,040 %); TCLK3/TCLK4 sind mit -0,79 % rund 20-mal schlechter. Man wählt daher TCLK1 (MCK/2, RC = 952) - das höhere RC bietet die feinste Zeitauflösung (TCLK2 wäre energetisch minimal günstiger, ist frequenzgleich).
2.3 Exakt wäre - keine ganze Zahl. Da RC ganzzahlig sein muss, ist 44,1 kHz nicht exakt erreichbar. Es gilt
Falle: Wer RC = 952,38 stehen lässt oder auf 44,1 kHz "rundet", rechnet ab hier mit einer falschen Rate.
Aufgabe 3 - Aliasing mit realer Abtastrate (14 P) [Kap. 7]
Mit .
3.1 Nyquist .
3.2 Eine Linie über der Nyquist-Frequenz (aber unter ) faltet auf :
| Linie | Lage | Ergebnis |
|---|---|---|
| 8 kHz | < Nyquist | korrekt erfasst, kein Alias |
| 19 kHz | < Nyquist (knapp) | korrekt erfasst, kein Alias |
| 27 kHz | > Nyquist | Alias |
| 40 kHz | > Nyquist | Alias |
3.3 Ein Alias fällt genau dann ins Nutzband , wenn , also . Der Filter muss also ab ca. 24,12 kHz wirksam dämpfen - nicht erst ab der Nyquist-Frequenz (22,06 kHz) und erst recht nicht erst ab .
3.4 Die 27-kHz-Linie faltet auf 17117 Hz - mitten ins Nutzband und in die Nähe einer eventuell echten 17-kHz-Komponente. Das Alias ist dann von einem echten Signal nicht mehr unterscheidbar und nicht rückgängig zu machen. (Die 40-kHz-Linie stört bei 4,1 kHz ebenso, liegt aber isolierter.)
Falle: 19 kHz liegt trotz Nähe zur Bandgrenze noch unter Nyquist und ist damit sauber; gefährlich sind die scheinbar "hohen, egalen" 27 und 40 kHz.
Aufgabe 4 - ADC-Puffer und DMA (12 P) [Kap. 6]
4.1 Werte.
4.2 12-Bit-Werte in 16-Bit-Worten = 2 Byte je Wert. Doppelpuffer (2 Halbpuffer): .
4.3 PDC-Zähler je Halbpuffer: US_RCR = 441. ENDRX feuert bei jedem vollen Halbpuffer: .
4.4 Reale Dauer . Nicht exakt 10 ms, weil von 441,18 auf 441 abgerundet wurde - die Rundung aus 4.1 verkürzt den Puffer minimal.
Hinweis: 12 Bit in 16 Bit verschenkt 25 % Speicher; gepackt (3 Byte je 2 Werte) wären es nur 1323 Byte - im Datenstrom später relevant.
Aufgabe 5 - USART-Durchsatz: Engpassanalyse (16 P) [Kap. 4]
5.1 Nutz-Datenrate . 8N1 = 1 Start + 8 Daten + 1 Stopp = 10 Bit/Byte -> minimale Baudrate .
5.2 . Kaufmännisch gerundet: BRGR = 6. Echte Baudrate . Maximale Byte-Rate .
5.3 Bedarf 88235,3 Byte/s, Angebot nur 87500 Byte/s:
Der Sendepuffer läuft also pro Sekunde um ~735 Byte über -> Datenverlust. Mit dem Sequenzbyte + CRC aus Aufgabe 6 (Zusatz-Overhead je Halbpuffer) wird das Defizit sogar noch größer. BRGR = 6 ist unbrauchbar.
5.4 Man muss BRGR abrunden, denn ein kleinerer Teiler ergibt eine höhere Baudrate: -> ausreichend. Entscheidend ist die Rundungsrichtung: Für garantierten Durchsatz rundet man den Teiler nach unten (Baudrate nach oben), nie kaufmännisch. Die "Abweichung" der Baudrate von einem Wunschwert ist hier kein Kriterium: Sender und Empfänger werden beide auf 1,05 Mbaud eingestellt; UART verlangt nur gleiche Taktung auf beiden Seiten, keine Standard-Baudrate. Maßgeblich ist allein Angebot >= Bedarf.
Falle: Kaufmännisches Runden ist bei Baudraten-Teilern falsch - es kann den Datenstrom lautlos abschneiden.
Aufgabe 6 - CRC-Sicherung (10 P) [Kap. 10]
6.1 Sequenzbyte .
6.2 Generator 10011 (Grad 4). Nachricht + 4 Nullen = 101110010000, Modulo-2-Division:
1 0 1 1 1 0 0 1 0 0 0 0 : 10011
1 0 0 1 1
---------
0 0 1 0 0 0 0 1 0 0 0 0
1 0 0 1 1
---------
0 0 0 0 0 1 1 1 0 0 0 0
1 0 0 1 1
---------
0 0 0 0 0 0 1 1 1 1 0 0
1 0 0 1 1
---------
0 0 0 0 0 0 0 1 1 0 1 0
1 0 0 1 1
---------
0 0 0 0 0 0 0 0 1 0 0 1 -> Rest (4 Bit) = 1001
Prüfbits (FCS) = 1001.
6.3 Gesendetes Codewort = Daten + FCS = 10111001 + 1001 = 101110011001. Der Empfänger dividiert das komplette Codewort durch 10011; Rest 0000 -> fehlerfrei, jeder andere Rest -> Fehler erkannt.
Aufgabe 7 - Echtzeit: Deadline und Shared Data (12 P) [Kap. 6]
7.1 . In Takten: .
7.2 Worst Case: die niederpriore Task hat gerade Interrupts gesperrt (kritischer Abschnitt), wenn der Abtast-Trigger kommt. Die ISR wird erst blockiert und läuft dann selbst:
Das ist größer als -> die ISR wird nicht rechtzeitig fertig, der nächste Abtastwert geht verloren -> Deadline verletzt.
7.3 Die mittlere CPU-Auslastung (: Zyklen/s bei 84e6) sagt nur, dass die CPU im Mittel viel Leerlauf hat. Für Echtzeit zählt aber der schlechteste Einzelfall: eine einzige zu lange Interrupt-Sperre blockiert die hochpriore ISR über ihre Deadline hinaus. Auslastung ist nicht gleich Planbarkeit (Schedulability) - Blockierung durch kritische Abschnitte kann die Deadline sprengen, obwohl die CPU zu zwei Dritteln idle ist.
7.4 Zulässig ist nur eine Blockierung von (). Bessere Lösung des Shared-Data-Problems ohne Interrupt-Sperre: doppelt gepufferter, sperrfreier Zugriff (Ping-Pong mit atomarem Umschalten eines Puffer-Index) - der die ISR nie blockiert -, alternativ nur eine sehr kurze atomare Zeigeroperation statt eines langen gesperrten Abschnitts.
Aufgabe 8 - Regelung: PI-Regler mit Windup (10 P) [Kap. 8]
8.1 . (je Einheit Regeldifferenz).
8.2 , , , danach auf begrenzen:
| k | y[k] | e[k] | I[k] | u_raw[k] | u[k] |
|---|---|---|---|---|---|
| 0 | 0 | 100 | 0 + 0,11333·100 = 11,333 | 200 + 11,333 = 211,33 | 100 (Sättigung) |
| 1 | 20 | 80 | 11,333 + 0,11333·80 = 20,400 | 160 + 20,400 = 180,40 | 100 (Sättigung) |
| 2 | 35 | 65 | 20,400 + 0,11333·65 = 27,767 | 130 + 27,767 = 157,77 | 100 (Sättigung) |
8.3 Windup-Erkennung: Der Ausgang ist ab k=0 in der Sättigung (u_raw weit über 100), trotzdem wächst der Integrator ungebremst weiter: . Folge: Sobald den Sollwert erreicht und das Vorzeichen wechselt, muss dieser aufgeblähte I-Anteil erst wieder abgebaut werden - der Regler hält die Stellgröße zu lange auf Maximum -> starkes Überschwingen / träges Zurückregeln. Gegenmaßnahme: Anti-Windup, z. B. bedingte Integration (Integrator anhalten, solange die Stellgröße gesättigt ist) oder Back-Calculation. Wirkung: bleibt während der Sättigung auf 11,333 stehen (statt auf 27,8 zu klettern), sodass der Regler beim Erreichen des Sollwerts sofort reagieren kann.
Falle: Der ganze Verlauf hängt an und damit an aus Aufgabe 2. Ein falsches verschiebt alle drei Schritte.