Schwebende Kugel: code umschreiben/optimieren

Hi Leute!

Ich mache derzeit ein Projekt von meiner FH aus, in dem eine Kugel zum schweben gebracht werden soll, sowas kennen einige von euch eh sicher schon.

Hier ein Bild vom damaligen Aufbau, jetzt hat sich ein bissl was verändert:

Hatte früher das EVALBOARD mit C167, welches ich aber leider geschossen habe.

Daraufhin einen Arduino Duemilanove besorgt.

Jetzt hab ich leichte Probleme bei dem Übertragen des Codes von C167 KEIL-Umgebung auf ATMEGA328P in der Arduino Umgebung.
Das Programm ist durch die Arduino Umgebung recht eingeschränkt worden, Interrupts hab ich keine gefunden und sonst wird das Programm auch in ein paar Punkten eingeschränkt was Schaltgeschwindigkeiten angeht.

Programmierkenntnisse... sagen wir so: ich verstehe das Programm, das ich weiter unten angehängt habe, aber selber hätte ich es nicht so gut/durchdacht hinbekommen (ein Freund hat mir dabei geholfen).

Hier der vorläufige Schaltplan, getestet wurde die Schaltung noch nicht, wird sie aber heute Mittag bis Nachmittag, zumindest mal die Positionserkennung:
(Aja, sind die Optokoppler überhaupt notwendig?, hier ist ja gar keine Galvanische Trennung möglich, da ja alles über einen Akku läuft, reichen einfache Widerstände? Wenn ja wie hoch?)

Den Code kann ich denke ich leider nicht so einfach posten, da ich eine Bachelorarbeit drüber schreiben muss, ich verwende den Code in der Arbeit... und wenn ich den hier direkt poste, würde das die Plagiatsprüfung finden denke ich. (oder weiß jemand mit SICHERHEIT, das wenn ich den Code mit dem Code-Fenster einfüge, dass er dann NICHT von der Plagiatsprüfung gefunden werden kann?)

Hey, hier kann man ja gar keine Files/Textdateien anhängen, oder irre ich mich da? Das ist ja echt blöd...

Na dann halt vorläufig mal als Bilder:


Hier der alte C167 Code:



Hier der neue Arduino-Code un der Versuch so nahe wie möglich an die Funktionsweise des alten Programms ranzukommen:




Aja, die Funktion ADEinlesen im Arduino Programm gehört glaub ich VOR die PID Regler-Funktion, oder?

Hier noch ein Schaltbildild des Motortreibers und die Ansteuerung:

Ich denke da muss ich im Programm noch ein bissl was ändern, dritten Pin für ansteuerung (Brake) hinzufügen?
Das System soll rückspeisefähig sein, d.h. die Spannung wird umgedreht und der Reststrom in der Spule fließt entgegen der Spannung in den Akku zurück.
Das hat den Vorteil, dass der Reststrom schneller stehen bleibt und die Spule somit schneller auf die Steuerbefehle vom Regler reagiert.

Vielleicht kann mir auch wer beim Implementieren der Current-Sense funktion helfen...(ich mein wenn's schon ein Sensor-output gibt, warum nicht verwenden?)... die könnte recht praktisch sein, ich hab bis jetzt einen 150? yC und einen 10? Motortreiber geschossen :-/

Hier eine schnelle Zeichnung wie die Regelung von statten gehen soll:

  • Praktisch ein ständiges Umschalten zwischen Forward und Brake (Rückspeisen).

  • Die x-Achse stellt den gewünschten Regelpunkt dar, in dem die Kugel nicht angezogen werden muss

  • y Achse ist VSpule, entspricht auch Position der Kugel.

  • Wenn y(Abstand) kleiner als Nullpunkt, soll der Duty Cycle kleiner 0 werden (=Anziehen)

  • Wenn y größer null, soll der Treiber auf Reverse schalten (=>Direction) also die Forward-Stromrichtung umgedreht werden... (das ist im Programm noch nicht implementiert, hatte vorher einen anderen Treiber, der anders funktionierte) (hier wären also auch Tipps nicht schlecht)... die Kugel soll also Abgestoßen werden.

Ich denke diese Angehensweise ist nicht optimal. Wenn die Regelposition exakt im Nullpunkt ist, schwingt das System viel mehr auf. Denn die Kugel wandert rauf, bis sie den 0-Punkt überschreitet und droht hinaufzuschnalzen, wird nach unten abgestoßen - wandert runter, bis sie wieder angezogen werden muss um nicht ganz runter zu fallen - das kann sich aufschwingen.

Da gibts sicher eine bessere Lösung... nur wie man das implementiert ist die Frage, ich denk es ist nicht soo schwer aber ich hab kaum zeit, ich muss bis Mi. mit dem Projekt + 25 Seiten Bacc. Arbeit fertig sein :slight_smile:

Könntet ihr so nett sein und mir helfen liebschau :slight_smile:

Danke!!! :slight_smile:

lg,
Grisu.

Weitere Infos (eher elektrotechnischer Natur) gibts in diesem Thread

Hallo,

Interrupts hab ich keine gefunden

attachInterrupt(interrupt, function, mode)

http://www.arduino.cc/en/Reference/AttachInterrupt

Bernd

Danke. komisch, wir haben gesucht und gesucht gehabt, aber dieses Kapitel ist uns entgangen...

Jetzt ist ein wirkich dummes Problem aufgetreten.

Der Motortreiber ist angeschlossen, funktioniert, jedoch fällt die Spannung von 24V (oder 12V, egal) auf 2,3 Volt ab sobald ein Verbraucher (hier: eine LED) angeschlossen wird. Selbst wenn man den PWM Anschluss direkt auf 5V hängt, damit der Treiber voll durchschaltet - sobald man was anschließt, fällt die Spannung von 24 auf ca. 2,3V ab.

So knapp davor dass es geht - es geht sogar halbwegs mit PWM und so - und dann scheiterts an sowas wie dass Der Treiber den Strom nicht treibt! :-/

(Wir haben jetzt übrigens einen Hallsesnor genommen, der liefert brav lineare Werte, wenn man sich mit dem Magneten entfernt.... das wäre super gelaufen heute, wenn nur der verdammte Motortreiber nicht so spinnen würde. )

Mein Freund hat gemeint, das müsste eigentlich ein Spannungsversorgungsproblem sein, aber wir haben (die meisten) Anschlüsse überprüft, und an allem gerüttelt soweit sitzten alle Anschlüsse... könnt ihr euch das erklären?

lg,
Grisu

Hallo -Grisu-
Hast Du einen Vorwidertand an das LED geschaltet? 2,3 V ist die Spannung in Durchlaßrichtung eines LEDs.
Grüße Uwe

Klar.

Hier der Schaltplan des aktuellen Aufbaus:

Die 2,3V sind interessanter Weise aber unabhängig vom Vorwiderstand, hab 1k 500 und 100 Ohm ausprobiert, alles dasselbe.

Meines Wissens zieht eine Led immer soviel wieviel sie braucht, korrigiert mich wenn ich falsch liege - wenn du auch 1M R davor schalten würdest, die Led zieht sich ihre 2.3V aus dem Treiber durch den Widerstand. Das ist doch der Sinn eines Treibers?

Tausche mal die Led mit einer anderen mit signifikant höheren Durchlasspannung - zB Rot mit Blau. (~2V vs ~3,4V)

hallo alle
@apogee
Die Led hat eine Ddiodenkennlinie wobei der Spannungsanstieg bei 1,6 bis 3,4V beginnt (je nach Farbe und Halnleitermaterial aus dem sie gebaut ist) Die Kurve steigt dann steil nach oben, sodaß klene Spannungänderungen eine große Stromänderung nach sich ziehen, das zum Hitzetod der LED führt. Eine Diodenkennlinie hier: http://www.ieap.uni-kiel.de/plasma/ag-piel/elektronik/f9_29.jpg . Die ist von einer Zenerdionde gilt aber auch für eine LED wenn auch mit anderen Werten des Stroms und der Spannung.

Eine Led muß immer mit einer Strombegrenzung betrieben werden ( Vorwiderstand oder Konstantstromquelle) da sie ansonsten zuviel Strom zieht. Sieh sie wie einen Dipol der immer eine fast konstante Spannung hat. wenn Du dann eine größere Spannung anlegst ist der Strom nur durch die Leitungswiderstände und Innenwiderstände begrenzt, die idealeweise sehr klein sein sollten.

@-Grisu-

Ist das Schaltbild falsch oder Deine Schaltung?

Bezüglich des Schaltbildes Deines vorigen Beitrags:
Du mußt die Masse der 5V (Des Arduinos) und der 24V Spannungsquelle zusammenschalten ansonsten kann kein Strom über den Motor/ L298 fließen. Das Schaltbild des Motortreibers in Deinem ersten Post entspricht nicht dem des L298, Der hat BJ-Transistoren nicht MOSFET als Leistungstufe.
Wieso verbindest Du den Eingang des Quarzes (XTAL1) mit dem Eingang des L298?
Vcc des L298 muß auf 5V nicht mit Masse verbunden werden (Stromversorgung des logikteils des L298)
ENABLE_B des L298 muß auf 5V nicht auf Masse.
SEN_B des L298 muß auf Masse. In Verbindung mit einem L297 diehnt der Widerstand zur Strommessung und zum Abschalten der Außgangstransistoren zur Strombegrenzung. Der Widerstand kann in diesem Fall weggelassen werden.

Grüße Uwe

@apogee
Sind gelbe LED's. Blaue hab ich leider keine. Dafür viele grüne. Und nur eine rote ^_^.

Das im ersten Post ist der LMD18200, der hat eben nicht funktioniert, deswegen dann auf den L298 ausgewichen.

Hier der Schaltplan vom L298:

So, ich denk das müsste jetzt passen, hatte mich mit dem Ground und Vcc vertan und irgendwie alles miteinander verbunden.

Den INPUT4 hatte ich auf XTAL2 gelegt, weils beim Arduino eben Pin 10 ist :slight_smile: und ich nicht wusste was XTAL2 bedeutet.
Habs jetzt auf irgend nen anderen gelegt. Ist jedenfalls in Realität ein PWM Ausgang, das passt schon so.

MUSS SEN_B auf Ground?
Ist es vielleicht daran gelegen, dass so gut wie kein Strom durch die LED geflossen ist (Leuchtet ganz schwach) und die Spannungso stark abgefallen ist? (Hoffentlich)

Hier das Datenblatt des L298

Hoffe jetzt sind alle Missverständnisse aufgeklärt.

lg,
Grisu

Vielleicht taugt dieser Artikel etwas zur Inspiration:
http://www.weltderphysik.de/de/259.php

Lol, die schwebende Kreissäge ist ja nicht schlecht :slight_smile:

SEN_B mußt Du noch auf Masse legen
Uwe





Hey Leute, vielen Dank für eure Hilfe bis jetzt.

Ich habe jedoch eingesehen, dass es nichts bringt krampfhaft zu versuchen das System bis Do. zum laufen zu bringen,
dafür wäre einfach noch viel zu viel zu tun.
Außerdem muss ich bis dahin noch meine Bacc. Arbeit fertig schreiben die bis jetzt nur halb fertig ist... stress stress :stuck_out_tongue: :slight_smile:

Höchstwahrscheinlich werd ich etwas später privat weiter machen, aber derweil werd ich den realen Aufbau mal auf Eis legen.

Ich nehm den Thread wieder auf sobald ich weitermache, versprochen!

(Und ohne eure wertvollen Hinweise und Tipps wär ich sowieso aufgeschmissen ;D)

lg,
Grisu





Hmm, zwei Fragen hätt ich doch noch:

Erstens zur Wärmeentwicklung: Ich habe eine Spule, Hohlzylinerform:
H: 35mm
DMaußen: 35mm
DMinnen: 9,5mm

Widerstand: 3,8 Ohm

Drahtdurchmesser: 0,7mm

Wenn ich jetzt sagen wir mal (Hausnummer) im Mittel 1A Dauerstrom habe, wie stark und in welcher Zeit erwärmt sich die Spule?

Könnt ihr mir Formeln, bzw. einen gerechneten Weg aufzeigen?

Zweitens: Die Regelstrecke der Kugel ist ja instabil und es nimmt die Anziehungskraft exponentiell (4-5 Potenz glaub ich) mit der Entfernung ab.
Zu beachten ist das Magnetfeld des Permanentmagnets und der Spule.

Es wird theoretisch nach folgendem Pronzip vorgegangen:
Innerer Regelkreis: Motortreiber gibt Stromstärkenwerte zurück, diese wird für den inneren Regelkreis genommen um das PWM signal soweit zu glätten, dass es wie ein Konstantstrom wirkt. Dieses system läuft viel schneller als der äußere Regelkreis. Dieser regelt dann die Enfernung der Kugel, die von der Magnetkraft abhängig ist, die wiederum vom Spulenstrom abhängig ist usw...

Auch wenns unhöflich klingt: Bitte keine "wischiwaschi"-Antworten, die keinen konkreten Inhalt haben oder unnötige Kommentare wie "Weiß ich auch nicht"... mit dem kann keiner was anfangen.

Und wenn ich schon so wählerisch bin ;-):
Super währ halt wenn jemand es so sage könnte:

"Du brauchst (Hausnummer) einen PID-T2 Regler, weil... bla bla... und der ergibt sich mit der Regelstrecke aus dieser Formel, weil die Regelstrecke sich aus der und der Formel zusammensetzt" usw. ^^

Hier ein Scan wie man die Magnetkraft theoretisch berechnen kann.
Hat mir mein Prof einmal versucht zu erklären, ich habs aber leider in keinster Weise verstanden, vielleicht kann wer von euch was mit den Fomeln anfangen (ich glaub das erste Blatt ist eben für die Berechnung MIT Permanentmagneten an der Kugel, das jeweils andere wäre dann für eine Stahlkugel/Körper)

Bitte wenn dann bis heute abend antworten (ja arg... was der alles will :cheesy: ),
morgen muss ich nämlich dann abgeben :wink:

...wenn sich halt wer die Mühe machten will mir bei dieser recht kniffligen Frage zu helfen....