Forum: Mikrocontroller und Digitale Elektronik Digitale Regelung und UART


von Alexander (Gast)


Lesenswert?

Hi,
ich habe eine grundlegende Frage bezüglich UART innerhalb eines 
Projektes, in der ein kleiner DC/DC Wandler mit digitaler Regelung 
betrieben wird.

1. Ich habe eine ISR, die alle 10us (Schaltfrequenz beträgt 100kHz) 
aufgerufen wird.
2. In dieser ISR entnehme ich die ADC Werte von Spannung und Strom
3. In dieser ISR vergleiche ich Soll- mit Istwert
4. In dieser ISR kommt der Fehler in einen PI Regler, der den neuen 
Tastgrad berechnet und anschließend an die PWM Module weitergibt.

Soweit funktioniert das Projekt sehr gut, und ich möchte es mit der UART 
Funktionalität erweitern, um neue Sollwerte bezüglich Ausgangsspannung 
an den uC zu übergeben (z.B. von 5V auf 8V). Meine Frage nun:

Bekommt der UART seine eigene ISR oder läuft der UART einfach im 
Hintergrund in der main() Funktionion und schreibt den neuen Wert für 
den Tastgrad sobald der Benutzer (in diesem Falle ich) die Tastatur 
betätigt?

Weitere Info:
Im Prinzip soll der uC nur die PWM Signale berechnen und die Regelung 
übernehmen, und das ganze Projekt ist eine reine Bastleraufgabe (um 
Theorie und Erfahrung auf dem Gebiet zu vereinbaren).

von Dampf T. (ouuneii)


Lesenswert?

Die 100kHz PWM moduliert per Interrupt rauszulassen ist Bullshit.
Was moeglich und sinnvoll ist, ist den PWM per hardware zu generieren, 
aber nicht jeden Cycle upzudaten. Die Strommessung wuer ich auch 
langsamer laufen lassen. Wozu wuerde denn die Regelbandbreite noetig 
sein ?

Ich denk eine Regelbandbreite von zB 1kHz waere immer noch genuegend, 
das waere eine Frage der Last. Falls ohmsch duerfte man das.

Denn das UART benoetigt auch Rechenzeit. Man kann's per Interrupt laufen 
lassen, und dann ist der timer Interrupt gesperrt, oder man kann pollen.

Falls eine schnelle Stromregelung, resp Kurzschlusserkennung noetig 
waere, wuerd ich das analog erledigen. Und zwar direkt : Ueberstrom 
nimmt die Pulsbreite zurueck.

: Bearbeitet durch User
von A. S. (Gast)


Lesenswert?

Interrupts sind Programmtechnisch einfach nur eine Sonderform von Tasks, 
die nicht vom RTOS-Scheduler sondern vom Prozessor selber gemanaged 
werden. Und main (ich nehme an, als Endlosschleife) ist einfach nur ein 
Background-Task.

Ob der USART in Main laufen kann, hängt von dessen Zykluszeit ab. Wenn 
main solange läuft, dass Zeichen verloren gehen, dann musst Du eine 
eigene Interrupt-Routine spendieren oder ihn im 10µs-Interrupt mit 
einlesen.

Je nachdem wie schnell Du eine Reaktion erwartest (relativ zur 
Main-Loopzeit) musst Du dann auf empfangene Telegramme im Interrupt oder 
in Main reagieren.

Es hängt also stark davon ab
- wie schnell der Uart läuft
- wie aufwendig (lang) die Telegramme sind
- von der bisherigen Main-Zykluszeit
- von Deinen Wünschen.
- von der Auslastung der 10µs-ISR

von Falk B. (falk)


Lesenswert?

@  Alexander (Gast)

>Projektes, in der ein kleiner DC/DC Wandler mit digitaler Regelung
>betrieben wird.

PICCOLO?

>Bekommt der UART seine eigene ISR

Kann man machen.

>oder läuft der UART einfach im
>Hintergrund in der main() Funktionion

Der UART läuft als Hardwaremodul so oder so parallel zur CPU. Die Frage 
ist halt, wann man die Daten abholt. Entweder per ISR, die muss dann 
aber von deinem 100kHz Reglerinterrupt unterbrechbar sein, denn dieser 
Interupt ist der allerwichtigste. Oder per Polling, das muss aber auch 
oft und schnell genug in einer Funktion der Hauptschleife main() 
erfolgen. Beides funktioniert, wenn man die Details richtig macht.

von Falk B. (falk)


Lesenswert?

@Dampf Tramp (ouuneii)

>Die 100kHz PWM moduliert per Interrupt rauszulassen ist Bullshit.

Du musst es ja wissen.

[ ] Du hast Anhung von digital geregelten DC/DC Wandlern.

>Was moeglich und sinnvoll ist, ist den PWM per hardware zu generieren,

Das tut er auch.

>aber nicht jeden Cycle upzudaten.

Eben das tut er., eben weil es sinnvoll ist und der Prozessor es kann.

> Die Strommessung wuer ich auch
>langsamer laufen lassen.

Genau DAS kann man bei einem echten Überstromschutz eben nicht. Viel 
mehr ist diese Funktion in den passenden Controllers schon in Hardware 
drin, weil dort auch die 100kHz Interruptroutine zu langsam wäre.

>Ich denk eine Regelbandbreite von zB 1kHz waere immer noch genuegend,
>das waere eine Frage der Last. Falls ohmsch duerfte man das.

Du weißt doch gar nicht, was die anderen Randbedingungen sind.

>Denn das UART benoetigt auch Rechenzeit. Man kann's per Interrupt laufen
>lassen, und dann ist der timer Interrupt gesperrt,

Du kennst gar nicht den Prozessor des OPs. Es gibt da schon ein paar 
mehr als VAR und Arduino.

>Falls eine schnelle Stromregelung, resp Kurzschlusserkennung noetig
>waere, wuerd ich das analog erledigen. Und zwar direkt : Ueberstrom
>nimmt die Pulsbreite zurueck.

Siehe oben.

http://www.ti.com/lsds/ti/power-management/digital-power-non-isolated-controller-products.page#

Hier gibt es sogar ICs, wo die GESAMTE Regelschleife mit allem Drum und 
dran voll in Hardware läuft, und das mit bis zu 2 MHz!

von Stefan K. (stefan64)


Lesenswert?

Alexander schrieb:
> Bekommt der UART seine eigene ISR oder läuft der UART einfach im
> Hintergrund in der main() Funktionion und schreibt den neuen Wert für
> den Tastgrad sobald der Benutzer (in diesem Falle ich) die Tastatur
> betätigt?

<Normalerweise> bekoomt sowohl RXD als auch TXD seinen eigenen 
Interrupt.
Benutzt Du einen ATmega? Der sperrt während einer ISR default alle 
anderen ISRs, was für Dein Timing kritisch werden könnte. Allerdings 
kannst Du andere ISRs innerhalb eines ISR auch wieder manuell freigeben. 
Das bietet sich in Deinem Fall für die TXD- und RXD-Interrupts an.

Die Behandlung von RXD/TXD in der Main-Schleife funktioniert auch, wenn 
Deine main-Zykluszeit schnell genug ist und/oder die Baudrate 
entsprechend niedrig.

Viele Grüße, Stefan

von Falk B. (falk)


Lesenswert?

@ Stefan K. (stefan64)

>Benutzt Du einen ATmega? Der sperrt während einer ISR default alle
>anderen ISRs, was für Dein Timing kritisch werden könnte.

Kann ein AVR SINNVOLL eine 100kHz Timer-ISR bedienen?

von Peter D. (peda)


Lesenswert?

Falk B. schrieb:
> Kann ein AVR SINNVOLL eine 100kHz Timer-ISR bedienen?

Bei 20MHz sind das 200 Zyklen. Ja, das geht.

Die UART darf allerdings nicht als Interrupt laufen, das ergäbe zuviel 
Jitter.

von Alexander (Gast)


Lesenswert?

Hallo an alle,
vielen Dank erstmal an euer Feedback. Meiner Recherche nach sind 100kHz 
noch in Ordnung, die ISR mit ADC und Regelung aufzurufen. Natürlich wäre 
es hierzu gut von mir gewesen, im Anfangspost den verwendeten uC zu 
erwähnen. Entschuldigt bitte für die fehlende Information.

Ich verwende den Delfino von TI (F28335) und habe den ISR bis jetzt über 
das PWM Modul erzeugt.
Ob der Delfino für die Anwendung overkill ist oder nicht, steht auf 
einem anderen Blatt. Momentan geht es mir primär um 
Erfahrungswerte/Lerneffekt.

Es war/ist angedacht, den ausgangsseitigen und eingangsseitigen 
Überstrom über externe Trigger (Trip Zone Submodule in den TI DSPs) 
abzusichern.

Falk B. schrieb:
> Der UART läuft als Hardwaremodul so oder so parallel zur CPU. Die Frage
> ist halt, wann man die Daten abholt. Entweder per ISR, die muss dann
> aber von deinem 100kHz Reglerinterrupt unterbrechbar sein, denn dieser
> Interupt ist der allerwichtigste. Oder per Polling, das muss aber auch
> oft und schnell genug in einer Funktion der Hauptschleife main()
> erfolgen. Beides funktioniert, wenn man die Details richtig macht.
Vielen Dank für deinen Hinweis. Polling habe ich bis jetzt noch nichts 
von gehört, und werde mich mal entsprechend einlesen.

Ursprünglich war angedacht, für UART eine ISR bereitszustellen, und 
dieser eine niedrige Priorität zu geben (wann genau der Sollwert nach 
Benutzereingabe aktualisiert wird, ist weniger kritisch. Soll heißen, 
wenn alle wichtigen Funktionen wie PWM, ADC und Regelung fertig sind, 
kann dann gerne der Sollwert aktualisiert werden).

Parallel zu diesem Ansatz werde ich mich noch mal ausgiebig mit dem 
Thema Polling auseinandersetzen, von dem ich bis jetzt noch nichts 
gehört/gelesen habe. Vielen Dank an alle für eure Hinweise. Wenn das 
Projekt fertig ist, werde ich hier noch mal ein Update geben.

Gruß,

von Alexander (Gast)


Lesenswert?

Peter D. schrieb:
> Die UART darf allerdings nicht als Interrupt laufen, das ergäbe zuviel
> Jitter.

Entschuldige bitte, ich habe deinen Beitrag erst gesehen, nachdem ich 
meinen abgeschickt habe.

Magst du das vielleicht ein wenig näher erläutern, inwiefern der UART im 
Interrupt Jitter erzeugt?

von Paul B. (paul_baumann)


Lesenswert?

>>Die 100kHz PWM moduliert per Interrupt rauszulassen ist Bullshit.

Falk B. schrieb:

> Du musst es ja wissen.
>
> [ ] Du hast Anhung von digital geregelten DC/DC Wandlern.

Er muß doch wenigstens erst einmal die Zeit bekommen, die Antwort 
anzukreuzen. Erst dann kannst Du beurteilen, ob er es wissen muß oder 
nicht.

Nicht immer so eine ungesunde Hektik verbreiten -wir sind doch hier 
nicht in einem 100Khz-Interrupt...

;-)

MfG Paul

von Peter D. (peda)


Lesenswert?

Alexander schrieb:
> Magst du das vielleicht ein wenig näher erläutern, inwiefern der UART im
> Interrupt Jitter erzeugt?

Das bezog sich nur auf die Annahme, daß ein AVR verwendet wird.
Andere Architekturen können Interruptlevel vergeben.

von A. S. (Gast)


Lesenswert?

Alexander schrieb:
> Magst du das vielleicht ein wenig näher erläutern, inwiefern der UART im
> Interrupt Jitter erzeugt?

Jitter*)erzeugt der Uart nur, wenn er nicht auf niedriger Priorität 
läuft oder den Interrupt der PWM unterbricht bzw. verzögert.

Solange der PWM-Interrupt jederzeit aktiv werden kann, gibt es keinen 
Jitter.

*) Hiermit ist gemeint, dass die PWM-ISR manchmal erst nach 11 oder 12 
oder nochmehr µs drankommt. Und beim nächsten Mal entsprechend 
schneller. Das kann ein Signal ziemlich verhageln, je nach Realisierung.

von Falk B. (falk)


Lesenswert?

@Achim S. (achs)

>> Magst du das vielleicht ein wenig näher erläutern, inwiefern der UART im
>> Interrupt Jitter erzeugt?

>Jitter*)erzeugt der Uart nur, wenn er nicht auf niedriger Priorität
>läuft oder den Interrupt der PWM unterbricht bzw. verzögert.

Jain.

>Solange der PWM-Interrupt jederzeit aktiv werden kann, gibt es keinen
>Jitter.

Stimmt nicht ganz. Wenn der 100 kHz Timerinterrupt sehr kurz nach dem 
UART Interrupt aktiv wird (1-wenige Takte), dann wird erstmal der Aufruf 
des UART-Interrupts angefangen. Das dauert auf einem größeren 32 Bit uC 
wie dem Delfino (großer Bruder vom PICCOLO einige Takte, so um die 
16 glaub ich). Erst dann kann ggf. ein höher prioritiserter Interrupt 
ausgelöst werden.
Wie das beim Delfino im Detail ist weiß ich nicht, ich fürchte aber, daß 
auch der keine Hardwareprioritäten für die Interrupts hat, ebenso wie 
der Piccolo, denn beide haben die gleiche CPU und Grundarchitektur.
Unterbrechenbare ISRs muss man dort wie beim AVR mit Software erzeugen 
8-0, damit wird der Jitter wieder um ein paar Takte größer.

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.