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.
:
Bearbeitet durch User
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.
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.