Hallo zusammen, nachdem ich heute bereits hin und her probiert habe, wende ich mich nun an Euch. Im Anhang ist der Code für meine Maschinensteuerung. Da ich mich mit dem ADW des Atmega32 nicht so gut auskenne, aber gleich ein praktisches Problem dafür hatte, habe ich dieses Programm geschrieben. Zwei Maschinen hängen an den PWM-Ausgängen der Timer0 und Timer2. Die Pulsweite soll ein Poti bestimmen, das am ADW-Kanal 2 angeschlossen ist. Die Spannungen, die an den Maschinen anstehen, wwerden von OP-Verstärkern auf 0-5V gebracht und liegen an den ADW-Kanälen 0 und 1. Das Programm soll nun so funktionieren, dass es den Unterschied zwischen Sollwert (Poti) und der Spannung an der Maschine errechnet und die Pulsweite entsprechend neu berechnet. Ist die MAschine im linkslauf, stehen Spannungen zwischen 0 und 2,47V an. Im Rechtslauf Spannungen zwischen 2,61 und 5V. Durch den Spannungsbereich, in dem die Maschine (2,47V bis 2,61 V) nicht reagiert, weil die Pulsweite zu klein ist, entstehen die Werte 488 und 535, die auch dazu dienen, die Drehrichtung der Maschine zu ermitteln. Das Poti ist Teil eines Spannungsteilers und legt an den ADW eine Spannung zwischen 2,5 und 5V. Das Programm gibt Werte erstmal nur an OCR0, berechnet aber alles so, als wären beide Maschinen angeschlossen. Nun zum Problem: ---------------- Wenn ich am Poti drehe, dann passiert nix, obwohl ich zum Ergebnis gekommen bin, dass die Wandlungen funktionieren, weil ich mir das Ergebnis des Potis auf den PORTC habe anzeigen lassen. Irgendwo ist der Wurm bei den Berechnungen. vielleicht verliere ich auch Werte, weil ich so viel casten muss, um die Datentypen verträglich zu machen, und mich dabei vertan habe. Vielleicht liegt der Fehler aber auch ganz anderswo. Könnt Ihr mir helfen?
Sorry, hatte vergessen zu erwähnen, dass die Maschine sich dreht!! Aber nur im Maximum. Das Poti ist wirkungslos!!
dein eigentlich verständlich geschriebener text in ehren, aber ein schaltplan und der code sagen nunmal mehr als 1000 worte...
Ich musste leider von hand zeichnen... Hier der erste Plan (Sollwert)
Und zu Guterletzt die Spannungsmessung an der Maschine Ich habe leider keine entsprechende Software. Sorry, dass ich das mit der Hand zeichnen muss...
"setpoint = setpoint -512;" setpoint ist aber als int definiert. Irgendwo bewegst du dich ausserhalb des definierten Bereichs.
Nein, "setpoint = setpoint -512;" dürfte keine Probleme machen. int ist 16 Bit lang, d.h. Zahlen von -32768 bis 32767 Aber hier ist ein Problem: "offset[x] = (offset[x] & 0x7fff);" Die Zahlen sind im 2er Komplement kodiert, somit liefert das Abschneiden des ersten Bits nicht die entsprechende Minus-Zahl. Warum nicht einfach: "offset[x] = offset[x] * (-1);" Gruß, Johannes
> Aber hier ist ein Problem: > "offset[x] = (offset[x] & 0x7fff);" > Die Zahlen sind im 2er Komplement kodiert, somit liefert das Abschneiden > des ersten Bits nicht die entsprechende Minus-Zahl. Warum nicht einfach: > "offset[x] = offset[x] * (-1);" Geht auch nicht. Das hatte ich zuerst da stehen. Das war jetzt Mut der Verzweiflung bei mir! :(
Ich hab den Fehler gefunden.
1 | if (!((OCR0 - offset[0]) < 0)) // Unterlauf abfangen |
2 | {
|
3 | OCR0 = OCR0 - ((unsigned char) offset[0]); |
4 | // Neuen Spannungswert ausgeben
|
5 | }
|
6 | else
|
7 | {
|
8 | OCR0 = 0; // kleiner geht nicht |
9 | }
|
So ist es richtig.
Läuft zwar immer noch nicht einwandfrei, aber immerhin kann man mit dem Poti was einstellen.
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.