Forum: Mikrocontroller und Digitale Elektronik STM32L152 Regelung mit ADC, DAC und DMA


von Michael (Gast)


Lesenswert?

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

von anderer Ansatz möglich? (Gast)


Lesenswert?

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?

von Michael (Gast)


Lesenswert?

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?

von anderer Ansatz möglich? (Gast)


Lesenswert?

Ja.

von Falk B. (falk)


Lesenswert?

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

von Michael (Gast)


Lesenswert?

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.

von rmu (Gast)


Lesenswert?

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.

von Michael (Gast)


Lesenswert?

Also egal wie ich es umsetze, ich bin am Arsch.

von Falk B. (falk)


Lesenswert?

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

von Michael (Gast)


Lesenswert?

Entschuldigung, war nicht böse gemeint.

Ich wollte nur sagen, ob mit DMA oder Interrupt, zeitlich bringt mir das 
nicht viel.

von Helmut L. (helmi1)


Lesenswert?

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.

von anderer Ansatz möglich? (Gast)


Lesenswert?

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.

von Dr. Sommer (Gast)


Lesenswert?

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

von anderer Ansatz möglich? (Gast)


Lesenswert?

Oder einfach nur der falsche Ansatz. Warum beschreibt man nicht einfach 
die Aufgabenstellung?

von Michael (Gast)


Lesenswert?

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.

von DMA (Gast)


Lesenswert?

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.

von Falk B. (falk)


Lesenswert?

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

von Michael (Gast)


Lesenswert?

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.

von DMA (Gast)


Lesenswert?

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.

von moeb (Gast)


Lesenswert?

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)

von DMA (Gast)


Lesenswert?

@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
Noch kein Account? Hier anmelden.