Forum: Mikrocontroller und Digitale Elektronik Cortex M3 als flexibler Analogregler, Ideen gesucht


von Frank (Gast)


Lesenswert?

Hallo,

ich benötige eine Lösung für folgende Problemstellung

Randbedingungen:
- Cortex M3/ 32-bit/ Clock Frequenz 72MHz
- 8 A/D Kanäle (wir nennen das mal X)
- 8 D/A Kanäle (wir nennen das mal Y)
- Abtastraten jeweils ca. 200Hz (konstant)

Aufgabe:

Y=F(X)

Wobei F() nicht fix ist, sondern durch den Anwender per UART vom
PC aus einstellbar ist.
Ein Beispiel wäre:

y1 = 0.5 * (x1 + x2);
wenn x3 < 0.5 y2 = 0 sonst y2 = 1;
y3 = 0.25 * x4^2;

y4 = x4 + 0.5 * x5;

Ok, klar ist, dass das Set an Möglichkeiten eingeschränkt werden muss 
und
die Rechenzeit ausreichen muss, um alles einmal pro 200Hz-Zyklus zu 
berechnen. Das Compilieren der Funktionen ist nicht möglich. Es wird zur 
Laufzeit konfiguriert.


Frage:
Wie könnte die Beschreibung der Abbildung F() im PC erfolgen und wie 
könnte man alles im Cortex M3 so vorbereiten, dass er dann so flexibel 
rechnen kann?

Gruss

- Frank

von chris (Gast)


Lesenswert?


von Olaf (Gast)


Lesenswert?

> Vielleicht so:

Noe, der Processor des OPs ist doch bereits erwachsen. Also flex, bison, 
Yacc usw.

Olaf

von Frank (Gast)


Lesenswert?

Hallo Olaf,

also was chris meinte hab' ich verstanden und ist im Prinzip die Lösung, 
wenn auch nicht so simpel.
Kannst Du mir bitte nochmal erklären, wie ich z.B. yacc benutze? Meinst 
Du, ich compiliere es für den Cortex M3 und lasse es dort laufen oder 
ich lasse es auf dem PC laufen und schicke was zum uC?

Danke & Gruss

- Frank

von chris (Gast)


Lesenswert?

Ja, ich bin auch schon gespannt, wie dieser Informatikpraktikant dein 
Problem mit Yacc auf die Schnelle löst.

von Olaf (Gast)


Lesenswert?

> Meinst
> Du, ich compiliere es für den Cortex M3 und lasse es dort laufen oder
> ich lasse es auf dem PC laufen und schicke was zum uC?

Also ich habe ein vergleichbares Problem (forth-compiler) vor einigen 
Jahren mal mit flex geloest. Da beschreibst du die Syntax mit der 
flex-Sprache und das Programm erzeugt dir dann einen C-Source. Den 
kannst du dann in deinem Project uebersetzen.
Du definierst also z.b was eine Zahl sein soll, was ein Operator usw. 
Der Parser wird automatisch generiert und ruft dann deine Funktionen auf 
die mit den einzelnen Elementen arbeiten. Das ist natuerlich nicht ganz 
so effizient als wenn du alles selber von Hand machen wuerdest, hat aber 
den grossen Vorteil das du deine Sprache einfach um neue Elemente 
erweitern kannst. Mit anderen Worten fuer einen Mega8 wohl nicht die 
beste Loesung, fuer deinen Prozessor sollte das aber wohl gehen.

Schau dir mal die Datei forth.lex an, da siehst du das Prinzip.
http://www.criseis.ruhr.de/st6/st61.html

> Ja, ich bin auch schon gespannt, wie dieser Informatikpraktikant
> dein Problem mit Yacc auf die Schnelle löst.

Und was ist mit dir? Bischen rumstaenkern ohne es besser zu koennen oder 
war es dir nur langweilig unter deinem Stein?

Olaf

von Frank (Gast)


Lesenswert?

Hallo Olaf,

danke, dass Du nochmal geantwortet hast.
Ich hab's immer noch nicht verstanden. Kannst Du bitte nochmal erklären, 
wo ich was laufen lasse und wer wann was übersetzt. Vielleicht ein 
Beispiel zum Verständnis?
Sorry, dass ich so auf dem Schlauch stehe! ;-)

Gruss

- Frank

von Frank K. (fchk)


Lesenswert?

Frank schrieb:
> Hallo,
>
> ich benötige eine Lösung für folgende Problemstellung
>
> Randbedingungen:
> - Cortex M3/ 32-bit/ Clock Frequenz 72MHz
> - 8 A/D Kanäle (wir nennen das mal X)
> - 8 D/A Kanäle (wir nennen das mal Y)
> - Abtastraten jeweils ca. 200Hz (konstant)
>
> Aufgabe:
>
> Y=F(X)

Wenn Dir lineare Abbildungen ausreichen, kannst Du Dein Problem in 
Matrizenform formulieren:
(jetzt mal für n=2 dargestellt)

Das kann man dann relativ effizient ausrechnen

von chris. (Gast)


Lesenswert?

Benute eine Lib, die die Rechnung parst und entsprechend auswerted.
Wenn Geschwindigkeit gefragt ist, kann dieselbe Funktion die Gleichung 
nach Präzedenz entschlüsseln, asm zurechtlegen und den codeblock 
abspeichern/ausführen, je nach dem wie das gelöst wird mit der 
permanenten Datenspeicherung.
hier ein Beispiel wie ich es meine, dies ist nicht die lib auf die ich 
mich
beziehe, die ist auf einem anderen Rechner, es ist eine ähnliche 
einfachere Sache, aber das Prinzip ist dasselbe.

http://www8.cs.umu.se/~isak/snippets/eval.c

von Olaf (Gast)


Lesenswert?

> Ich hab's immer noch nicht verstanden. Kannst Du bitte nochmal erklären,
> wo ich was laufen lasse und wer wann was übersetzt. Vielleicht ein
> Beispiel zum Verständnis?

Hm..ganz einfach. Du brauchst einen Parser. Also ein Programm das deinen 
Eingabestring zerlegt in Dinge mit denen ein Computer arbeiten kann.

Hast du dir mal die von mir erwaehnte Datei angeschaut?

Da wird definiert wie die Elemente ausehen. In meinem Beispiel also
also Zahlen und Befehle. Diese Datei mit der Endung .lex wird auf deinem 
Computer mit flex in ein C-Source uebersetzt. Den kannst du dann 
ueberrall, also auch auf deinem Controller einbinden.
Du bekommst dann einen Source dem du deine Eingabe geben kannst und der 
von dir zu schreibende C-Funktionen aufruft wenn er eine Zahl findet 
oder sagen  wir mal einen Operator wir * oder +. Du siehst so ein 
Programm nimmt dir die dumme fehlerintensive Arbeit ab. Rechnen musst du 
aber hinterher noch selber.
Interessant wird es natuerlich hinterher mit dem rechnen. Du koenntest 
natuerlich das was der Parser dir liefert jedesmal erneut ausrechnen. 
Und du bist ja recht langsam. Allerdings haengt die Geschwindigkeit 
natuerlich auch von der Eingabefunktion ab. Es koennte also sein das du 
sie ersetzen musst du sagen wir mal eine Funktion n'ter Ordnung. Damit 
verlierst du vielleicht an Genauigkeit, dafuer ist deine Rechnenzeit 
vorhersagbar.
Auf jedenfall eine interessante Aufgabe die du dir da ausgesucht hast. 
:-)

> Wenn Dir lineare Abbildungen ausreichen, kannst Du Dein Problem in
> Matrizenform formulieren:

Sowas ist natuerlich am einfachsten. Aber dann muss der Anwender immer 
vorher arbeiten was der Programmierer an Aufwand gespart hat. :-)

Olaf

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.