Go Down

Topic: Schwebende Kugel: code umschreiben/optimieren (Read 3 times) previous topic - next topic

-Grisu-

Oct 10, 2010, 09:51 am Last Edit: Oct 10, 2010, 09:55 am by -Grisu- Reason: 1
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 ^_^


Könntet ihr so nett sein und mir helfen *liebschau* ^_^

Danke!!! :-)

lg,
Grisu.


Weitere Infos (eher elektrotechnischer Natur) gibts in diesem Thread




Bernd

Hallo,

Quote
Interrupts hab ich keine gefunden


attachInterrupt(interrupt, function, mode)

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

Bernd

-Grisu-

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

uwefed

#3
Oct 10, 2010, 08:59 pm Last Edit: Oct 10, 2010, 09:00 pm by uwefed Reason: 1
Hallo -Grisu-
Hast Du einen Vorwidertand an das LED geschaltet? 2,3 V ist die Spannung in Durchlaßrichtung eines LEDs.
Grüße Uwe

-Grisu-

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.



Go Up