www.mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik mmh wer findet den Fehler?


Autor: Dennis (Gast)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
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?

Autor: Dennis (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Sorry, hatte vergessen zu erwähnen, dass die Maschine sich dreht!! Aber 
nur im Maximum. Das Poti ist wirkungslos!!

Autor: David (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
dein eigentlich verständlich geschriebener text in ehren, aber ein 
schaltplan und der code sagen nunmal mehr als 1000 worte...

Autor: Dennis (Gast)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
Ich musste leider von hand zeichnen...

Hier der erste Plan (Sollwert)

Autor: Dennis (Gast)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
Relaisansteuerung zum Umpolen der Maschine..

Autor: Dennis (Gast)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
Motoransteuerung

Autor: Dennis (Gast)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
Und zu Guterletzt die Spannungsmessung an der Maschine

Ich habe leider keine entsprechende Software. Sorry, dass ich das mit 
der Hand zeichnen muss...

Autor: Gast (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
"setpoint = setpoint -512;" setpoint ist aber als int definiert. 
Irgendwo bewegst du dich ausserhalb des definierten Bereichs.

Autor: Johannes B. (jotschi)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
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

Autor: Dennis (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
> 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! :(

Autor: Dennis (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ich hab den Fehler gefunden.
        if (!((OCR0 - offset[0]) < 0))  // Unterlauf abfangen
        {
          OCR0 = OCR0 - ((unsigned char) offset[0]);
                        // Neuen Spannungswert ausgeben
        }
        else
        {
          OCR0 = 0;          // kleiner geht nicht
        }

So ist es richtig.

Autor: Dennis (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Läuft zwar immer noch nicht einwandfrei, aber immerhin kann man mit dem 
Poti was einstellen.

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.