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 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...
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)