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).
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.
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
@ 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.
@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!
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
@ 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?
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.
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ß,
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?
>>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
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.
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.
@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.