Forum: Mikrocontroller und Digitale Elektronik Einem µC eine analoge Eingangskurve "lernen"?


von Third E. (third-eye)


Angehängte Dateien:

Lesenswert?

Hallo,

ich stehe vor folgender Herausforderung:
Für eine Positionierungsaufgabe bekommt ein ATMega die Spannung eines 
analogen Sensors.
Im Verlauf der gesamten Wegstrecke gibt es charakteristische Spitzen und 
Ebenen (qualitativ im handgezeichneten Diagramm).
Die grün gekennzeichneten Punkte muss der Controller später zuverlässig 
erkennen.

Da der genaue Verlauf (zeitlich) als auch die exakten Spannungswerte 
vorher dem Controller nicht bekannt sind, würde ich gerne eine 
Kalibrierfahrt implementieren.
Der zweite Grund für die Kalibrierfahrt ist, dass sich im Laufe der Zeit 
durch Alterung usw. die Kurve leicht ändern kann. Da soll man dann auch 
eine Kalibrierfahrt machen können.

Hat jemand von Euch eine Idee, wie ich das ganze anstellen könnte?

Meine erste Idee für einen möglichen Ablauf:

1. Die Kurve wird durchgefahren und es werden von der Analogspannung 
gleitende Mittelwerte erzeugt.
Alle 10 ms wird je ein Wert in einem Array im RAM gespeichert.
Dafür bräuchte ich dann 500 * 2 Byte = 1000 Byte. Das passt auf jeden 
Fall ins RAM.

2. Das Array wird durchgegangen und Differenzenquotienten gebildet.
Dadurch weiß der Controller, ob er gerade eine Ebene oder eine Spitze 
hat.

3. Jetzt ist dem Controller die Lage und Spannung der Ebenen, als auch 
die Lage und Spannung der Spitzen bekannt.

4. Es ist vorher festgelegt, dass die Spannungswerte der Punkte von 
unten nach oben in der Reihenfolge Punkt 3, 1, 2, 4 kommen muss. Diese 
Punkte werden mit relativen Koordinaten zueinander im EEPROM 
gespeichert.
Damit ist die Kalibrierung beendet.

5. Im Normalbetrieb werden die Punkte noch mit gewissen Fenstern 
(Toleranzen) versehen.

Das war's.

Was haltet Ihr davon?

VG, Third Eye

: Bearbeitet durch Moderator
von Karl H. (kbuchegg)


Lesenswert?

Ich werd nicht schlau draus.

Wenn es darum geht, bestimmte Punkte des zu positionierenden Teiles 
zuverlässig anhand eines Sensors zu erkennen, dann fahr ich eben das 
Teil händisch in diese Position, drücke einen Knopf und teile dem µC so 
mit: jetzt gilts, das ist Position 3. In der Robotik nennt man sowas 
einen "Teach-In".

Der Teil, der mir allerdings überhaupt nicht klar ist, ist der Teil "Es 
handelt sich um eine Positionieraufgabe".
Das bedeutet ja doch wohl, dass der µC anhand eines Sensorwertes 
entscheiden muss, wie er verfahren muss, um einen bestimmten Punkt zu 
erreichen. Ich seh nicht, wie das bei deiner Kurve möglich sein soll. 
Die Spannung vom Sensor betrage zb 3V und der µC soll auf Punkt 2 
positionieren. Woher weiß der µC, in welche Richtung er verfahren soll? 
Je nachdem auf welchem Ast der Kurve sich das Bauteil gerade befindet, 
muss er bei einem Sensorwert von 3V entweder rechts oder links fahren, 
wobei dann auch noch der Fall dazu kommt, dass sich der Sensormesswert 
scheinbar auch noch verschlechtert, was allerdings nur temporär ist, 
solange er weit vom Zielpunkt entfernt ist.


Ansonsten: wenn du denkst, dass dein Verfahren grundsätzlich 
funktioniert - ja dann implementiere es.

> 2. Das Array wird durchgegangen und Differenzenquotienten gebildet.
> Dadurch weiß der Controller, ob er gerade eine Ebene oder eine Spitze

Dazu brauchst du kein Array. Bei 10ms Abtastintervall hast du zwischen 
den Abtastungen genügend Zeit um den Differenzenquotient zwischen dem 
jetzigen Messwert und dem vorhergehenden zu errechnen. 10ms sind für 
einen µC eine halbe Ewigkeit.

: Bearbeitet durch User
von rava (Gast)


Lesenswert?

fehlt nicht der Zusammenhang von ORT und Sensorspannung?
In diesem Graph ist nur die Zeit angetragen - das finde ich verwirrend.

gibt es einen monotonen Zusammenhang zwischen Ort und Spannung un das 
Ding fährt effektiv hin und her?
Oder ist bei dem Graph davon ausgegangen, dass mit konstanter 
Geschwindigkeit verfahren wird?

von Third E. (third-eye)


Lesenswert?

rava schrieb:
> Oder ist bei dem Graph davon ausgegangen, dass mit konstanter
> Geschwindigkeit verfahren wird?

Genau so ist es. Man könnte sich die Zeitachse auch als Wegachse denken.


Karl Heinz schrieb:
> Woher weiß der µC, in welche Richtung er verfahren soll?

Im Einschaltmoment steht er immer da, wo im Diagramm Zeitpunkt 0 ist.
Mir fällt aber gerade ein, dass er ja unterscheiden muss, ob er einen 
gewünschten Punkt von links oder von rechts anfährt.

Ich sehe, dass mein Vorhaben nur auf den ersten Blick einfach ist.
"Der Teufel steckt im Detail" bewahrheitet sich immer wieder.

Vielleicht wäre ein Teachbetrieb doch das Naheliegendere.

von Karl H. (kbuchegg)


Lesenswert?

Third Eye schrieb:

> Im Einschaltmoment steht er immer da, wo im Diagramm Zeitpunkt 0 ist.

Da fällt mir nur ein "berühmte letzte Worte".

Wenn jemand behauptet "das ist immer so" oder "das kommt bei uns nicht 
vor", dann werde ich hellhörig. :-)
Was anderes ist es natürlich, wenn nach dem Einschalten die Mechanik 
erst mal recht zwnagsgesteuert in eine Endlage gefahren wird, bis ein 
Endschalter anspricht. Dann kann man von gesicherten Verhältnissen 
ausgehen.

> Vielleicht wäre ein Teachbetrieb doch das Naheliegendere.

Na ja.
Da gehts ja nur darum, die 'Haltepunkte' zu finden. Am 
Positionierproblem ändert das ja nichts.

Was ist das überhaupt für eine Hardware und warum sieht deine Kurve so 
seltsam aus? Normalerweise hat man da ja einen linearen Zusammenhang 
zwischen 'Auslenkung aus der 0-Position' und Sensorwert. Aber im Moment 
kann ich mir keine Positionieraufgabe vorstellen, die ein derartiges 
Sensorwert/Zeit Diagramm ergeben würde. Das liegt allerdings sicherlich 
an meiner mangelnden Phantasie.

: Bearbeitet durch User
von Reinhard Kern (Gast)


Lesenswert?

Third Eye schrieb:
> Für eine Positionierungsaufgabe bekommt ein ATMega die Spannung eines
> analogen Sensors.

Positionieren kann so nicht funktionieren, für bestimmte Y-Werte in 
deinem Diagramm gibt es bis zu 4 verschiedene X-Werte, da ist eine 
Positionieraufgabe nicht eindeutig lösbar. Dafür müsste die Funktion des 
Sensors zwar nicht linear sein, aber zumindest monoton steigend oder 
fallend.

Der Rest deiner Überlegungen, wie man bestimmte Kurvenpunkte findet, ist 
ok, bloss Positionieren geht halt nicht.

Gruss Reinhard

von rava (Gast)


Lesenswert?

naja ganz so schlimm ist es nicht. Aber der Aufwand ist nicht ganz 
unerheblich.
Zum Thema Selbstlokalisation gibt es einige hilfreiche Infos im Netz, 
die sich genau mit einer solchen Problemstellung beschäftigen.
Stichworte:
- Bayes-Filter
- Partikelfilter
- Lokalisation

da sich das allerdings nach Kanonen und Spatzen anhört, würde ich mir 
erstmal die Frage stellen, warum zum Teufel die Kurve so krumm ist (und 
ob wirklich t~x).

Wenn du weißt, wo du bist, ist die Ableitung der Stellgrößen schon 
leichter!

von Dieter W. (dds5)


Lesenswert?

Wenn man davon ausgeht, dass die Kurve immer von links nach rechts 
durchlaufen wird, liegen alle Punkte in einem Bereich, in dem der 
Differenzquotient (zumindest kurzzeitig) gegen Null geht.

Jetzt käme es halt darauf an, ein passendes Kriterium für die Auswertung 
der letzten n Messwerte zu definieren.

: Bearbeitet durch User
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.