Hallo zusammen, ich brauche mal ein bisschen Hilfe für den richtigen Weg. Ich möchte gern mit dem ADC einen Istwert einlesen und die errechnete Stellgröße mit dem DAC ausgeben. Im Interrupt klappt das auch schon Wunderbar. Der Controller hat nur leider kaum für anderes mehr Zeit, da die Regelung mit 1µs getaktet wird. Jetzt möchte ich das ganze einmal mit DMA probieren, also der ADC schreibt mithilfe von DMA in den Speicher und der DAC setzt das ganze Analog aus dem Speicher um. Ist das überhaupt der richtige Weg? Ich habe schon angefangen dieses zu programmieren. Einlesen vom ADC in den Speicher mit DMA funktioniert schonmal. Das Ausgeben mit dem DAC auch, hier benutze ich einen Timer als Trigger(geht das auch anders?). Ich habe nur keine Ahnung wo ich die Berechnung der Stellgröße durchführen kann? vielen Dank
Mit DMA werden die Daten nur von einer Speicherstelle zu einer anderen transportiert. Eine Berechnung muss durch die CPU erfolgen. Wie schnell muss dein Regler sein? Was willst du damit regeln?
Hallo, eine Spannung soll geregelt werden und diese halt im 1µs Takt. Es sollen verschiedene Kurvenverläufe dargestellt werden, als Stellglied benutze ich einfach den DAC und einen Spannungsfolger. Also der Regelkreis ist relativ Simpel. Nur mit der Umsetzung auf den µC bin ich noch nicht zufrieden. Vielleicht ist das auch der Falsche Ansatz mit DMA. Ich wollte, bis auf die Berechnung die CPU völlig raushalten, aber umso mehr ich darüber nachdenke ist die Rechnung notwendig und im Interrupt auch der größte Teil der Arbeitszeit, oder?
@ Michael (Gast) >eine Spannung soll geregelt werden und diese halt im 1µs Takt. Kann es sein, dass du eher 1ms meinst? 1µs (MIKROSEKUNDE) ist auch für einen schnellen ARM ziemlich wenig! > Es sollen >verschiedene Kurvenverläufe dargestellt werden, als Stellglied benutze >ich einfach den DAC und einen Spannungsfolger. Also der Regelkreis ist >relativ Simpel. Da braucht man aber sicher NICHT 1µs Takt. > Nur mit der Umsetzung auf den µC bin ich noch nicht >zufrieden. Vielleicht ist das auch der Falsche Ansatz mit DMA. Ich >wollte, bis auf die Berechnung die CPU völlig raushalten, Da nützt dir DMA aber kaum was, weil pro Regeldurchlauf einmal der ADC gelesen, der Ausgangswert mittles CPU berechnet und einmal die neue Stellgröße per DAC ausgegeben wird. > aber umso mehr >ich darüber nachdenke ist die Rechnung notwendig und im Interrupt auch >der größte Teil der Arbeitszeit, oder? Sieht so aus.
Hallo, 1µs ist schon richtig. Ich weiß, dass das wenig ist. Das Signal welches ich mir erzeugen will ist aber nur 100µs lang und damit habe ich schon nur 100 Stützstellen. Ich muss auch nicht viel rechnen ein P-Regler reicht aus, da die Regelstrecke schon einen Integrierenden Anteil hat. Ich suche nur nach der besten Möglichkeit, das ganze umzusetzen. Wie gesagt im Interrupt läuft das ganze schon, aber ich habe keine Zeit mehr für anderes. Der Controller läuft mit 16Mhz.
Michael schrieb: > 1µs ist schon richtig. Ich weiß, dass das wenig ist. [...] > Der Controller läuft mit 16Mhz. Wie soll das gehen. Der Controller macht in 1µs im besten Fall 16 Befehle. Interrupt-Latenz mit Rücksprung ist sicher größer. Selbst in einer Endlosschleife wirds schwierig, da was sinnvolles zu machen.
@ Michael (Gast) >Also egal wie ich es umsetze, ich bin am Arsch. Das ist man immer, wenn man nicht vernünftig kommunizieren kann. Siehe Netiquette.
Entschuldigung, war nicht böse gemeint. Ich wollte nur sagen, ob mit DMA oder Interrupt, zeitlich bringt mir das nicht viel.
Michael schrieb: > Der Controller hat nur > leider kaum für anderes mehr Zeit, da die Regelung mit 1µs getaktet > wird. Warum mit einem uC etwas loesen wollen was mit einem simplen OP einfacher geht? Muss man heute den alles mittels uC machen. Fuer einen OP ist das ueberhaupt kein Problem.
Michael schrieb: > Entschuldigung, war nicht böse gemeint. > > Ich wollte nur sagen, ob mit DMA oder Interrupt, zeitlich bringt mir das > nicht viel. Doch, wenn man Daten ohne CPU von A nach B kopieren will. Wie sieht deine Regelstrecke denn aus? Wenn da schon ein I Anteil ist, wirds so ganz schnell ja nicht sein.
Mit einer Endlosschleife in Assembler könntest du es vielleicht schaffen, auf die 16 Takte zu kommen, wenn das tatsächlich nur eine Multiplikation ist. Wenn den Controller einfach mal auf 32 MHz laufen lassen würdest, hättest du schon doppelt so viel Zeit. Die STM32 gehen bis 180 MHz hoch, und du hast dir den langsamsten ausgesucht...
Oder einfach nur der falsche Ansatz. Warum beschreibt man nicht einfach die Aufgabenstellung?
Also es geht um einen Piezoaktuator, welcher ja nichts anderes als ein Kondensator ist. Die Kapazität liegt bei ca. 1nF. Wird der Piezo geladen so dehnt er sich aus und umgekehrt(Piezoelektrischer Effekt). Die Spannung beträgt hierbei 0-40V. Der Weg liegt hierbei auch im µm Bereich. Diesen möchte ich Regeln, was ja auch schon funktioniert. Der Sollwert sind Kurven die um die 100µs lang sind. Es geht darum speziellen Ultraschall zu erzeugen.
Und wo ist da eine Regelschleife? Das hört sich mehr nach einer Steuerung an. Deine Kurven können zeitversetzt gelesen und ausgegeben werden. Dann macht DMA wieder Sinn. Daten per DMA speichern, die Werte im Block verarbeiten und dann wieder per DMA ausgeben.
@ Michael (Gast) >Bereich. Diesen möchte ich Regeln, was ja auch schon funktioniert. Kaum, denn sonst würdest du ja nicht schreiben, dass es in 1us nicht geht. > Der >Sollwert sind Kurven die um die 100µs lang sind. Es geht darum >speziellen Ultraschall zu erzeugen. Das ist noch lange keine REGELUNG! Wenn man nur einen Spannungsverlauf ausgeben will, macht man das sehr einfach mit DMA und einem Timer. Die CPU hat da gar nichts zu tun. Das ist dann aber keine Regelung, sondern reiner Stellbetrieb.
Hallo, die Spannung wird natürlich am Piezo gemessen, welche die Istgröße ist. Eine Steuerung reicht hier nicht aus. Die Steuerbarkeit ist leider nicht gegeben, es gibt nämlich Störgrößen im System. Ich habe geschrieben, das es funktioniert, ich aber für andere Dinge keine Zeit mehr habe. Deshalb wollte ich die CPU möglichst raushalten.
Ich verstehe jetzt die beiden Punkte 1. Eine vorgegebene Kurve per DAC ausgeben 2. Die ausgegebene Spannung per P Regler verstärken Das erste kann gut der uC per DMA machen und Das zweite per OP, wie schon einer geschrieben hat Der uC hat dann noch sehr viel Platz für andere Spielereien.
3. Er soll aber offensichtlich auch eine Abweichung ausregeln können. (Ich habe keine Ahnung wie sich die Ausdehnung des Aktors auf die angelegte Spannung auswirkt, um die Längendifferenz messen zu können)
@moeb Das ist in 2. enthalten, sonst bräuchte es keinen Regler. Die Kurve aus dem DAC ist der Sollwert!
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.