- Akku Tests und Balkonkraftwerk Speicher         
Seite 1 von 2 12 LetzteLetzte
Ergebnis 1 bis 10 von 13

Thema: ADC Auflösung umrechnen - Divisionsproblem

Hybrid-Darstellung

Vorheriger Beitrag Vorheriger Beitrag   Nächster Beitrag Nächster Beitrag
  1. #1
    Erfahrener Benutzer Roboter-Spezialist
    Registriert seit
    27.08.2007
    Alter
    34
    Beiträge
    324

    ADC Auflösung umrechnen - Divisionsproblem

    Ich beschäftige mich jetzt seit ein paar Tagen mit Schrittmotoren und nachdem ich nun einige Funktionen geschrieben habe, die mir deren Ansteuerung sehr erleichtern, dachte ich, es wäre schön, wenn ich den Schrittmotor über ein Poti steurn könnte - soll heißen der Schrittmotor fährt eine Position relativ zum Drehwinkel des Potis an. Das bedeutet, dass der ADC benötigt wird. Dieser hat beim Mega8 eine Auflösung von 10bit, was 1/1024 entspricht. Wenn ich das nun auf einen Schrittmotor mit 200 Schritten übertrage bedeutet dies das er 0 bis zu 5+(1/ Drehungen ausführen wird, je nachdem, wie ich das Poti einstelle. Dies klappt auch wunderbar. Nun möchte ich jedoch, dass 1024/1024 nicht 5+(1/ Drehungen, sondern nur 1 Drehung bedeuten. Mathematisch ist das Problem schnell gelöst:
    (ADC/1024 )*200. Leider kommt der µC mit dieser Berechnung nicht klar, was wohl an der fehlenden Darstellungmöglichkeit von Fließkommazahlen (wie sie am PC dur IEEE754 definiert sind) liegt. Eigentlich hatte ich angenommen, der µC würde die entstehenden Nachkommastellen einfach abschneiden, denn der Verlust dürfte sich wohl in Grenzen halten - was ist schon ein 1,8° Schritt mehr oder weniger... Jedenfalls rechtfertigt es für meine Anwendung keine Nachbildung einer Fließkommaarithmetik.
    Dem ist leider nicht so... Es tut sich nichts.
    Habt ihr einen Vorschlag?

    Srry, es ist wohl wieder ein Roman geworden...

  2. #2
    Erfahrener Benutzer Roboter Experte
    Registriert seit
    21.05.2008
    Ort
    Oststeinbek
    Alter
    34
    Beiträge
    607
    (ADC*200)/1024 sollte besser gehen, wenn es nicht wegoptimiert wird.

    ansonsten mit float rechnen.

    ADC ist ein wert, der kleiner ist als 1024. Wenn du ihn durch 1024 teilst, kommt ein wert unter 1 raus. Dieser Wert wird auf int (ganze zahlen) abgerundet, was dann 0 ergibt...

    Zuerst den Wert multiplizieren sollte dieses Poblem beheben.

    Gruß, Yaro

  3. #3
    Erfahrener Benutzer Roboter-Spezialist
    Registriert seit
    27.08.2007
    Alter
    34
    Beiträge
    324
    Da hätt ich auch drauf kommen können...

    Danke, ich werds gleich morgen ausprobieren

  4. #4
    Erfahrener Benutzer Robotik Visionär Avatar von oberallgeier
    Registriert seit
    01.09.2007
    Ort
    Oberallgäu
    Beiträge
    8.686
    Zitat Zitat von Barthimaeus
    ... hätt ich auch drauf kommen können ... ausprobieren ...
    Da bin ich ja gespannt, wie es der Compiler schafft, dem Controller für Werte über ADC = 328 die richtige Berechnungsvorschrift zu erstellen. Ich hab das Gefühl, dass er das nicht hinkriegt und dadurch der Überlauf der Grund für Fehler ist. 65500 ist ja schnell erreicht, und darüber bräuchte ich dann, rein gefühlsmässig, long integer (32 bit). Bei "ADC / 5" wäre der maximale Fehler schlappe 2,4 % im Vergleich zur genauen Rechnung. Ist ja nicht wenig, aber vielleicht reicht Dir das?
    Ciao sagt der JoeamBerg

  5. #5
    Erfahrener Benutzer Roboter-Spezialist
    Registriert seit
    27.08.2007
    Alter
    34
    Beiträge
    324
    Hi Oberallgeier! Wie du bereits prognostiziert hattest, ist es zu dem Überlauffehler gekommen, was sich darin äußerte, dass der Motor nach ca 1/4 Drehung auf 0 zurückspringt und wieder von vorne anfing. Daraufhin habe ich auf den uint32_t Datentyp gewechselt, und jetzt läuft alles wie geschmiert - die 2,4° sind für mein "Funktionsmodell" nicht von Bedeutung.
    Wenn ich das Poti voll aufdrehe fährt der Motor die gewünschten 200 Schritte ab, wenn ich zurückdrehe fährt er relativ zur Potidrehung rückwärts.

    Vielen Dank

    P.s.: Warum ist eigentlich die L297, L298 Schaltung so beliebt? Mit nur einem Mega8 zB. kann man doch locker drei Stepper ansteuern. Die Steuerung des µC könnte man dann per I2C realisieren -> mein nächstes (Ätz-)Projekt

  6. #6
    Erfahrener Benutzer Robotik Visionär
    Registriert seit
    26.11.2005
    Ort
    bei Uelzen (Niedersachsen)
    Beiträge
    7.942
    Der L297 ist schon ziehmlich alt, da waren µCs noch nicht so verbreitet.

    Man könnte das meiste auch mit einem µC machen. Die PWM Werte werden dann zwar kaum nach dem aktuell gemesen Strom, sondern nach berechneten Werten eingestellt, aber das sollte auch gehen. Ganz ohne Strommessung wird es aber wohl nicht gehen - man muß ja auf ggf. variable Belastung des Motors reagieren.

  7. #7
    Benutzer Stammmitglied
    Registriert seit
    09.05.2007
    Beiträge
    99
    Noch ne Idee aus der Schulzeit: Kürzen. Hier kürzen durch 8.
    Dann steht da: ADC*25/128
    Dann geht es, selbst mit int16_t, so genau wie Deine Lösung mit uint32_t.

    Bzw. Extremkürzing , wenn es 2% ungenauer sein darf: ADC/5 (siehe auch oberallgeier)

  8. #8
    Erfahrener Benutzer Robotik Visionär Avatar von oberallgeier
    Registriert seit
    01.09.2007
    Ort
    Oberallgäu
    Beiträge
    8.686
    Baaaa - das wirklich Gute hätte ich fast übersehen:
    Wenn man ADLAR verwendet, dann kriegt man die 1024er Auflösung nur noch von 0 bis 255 - das ist nach der Methode Milchmädchen fast 1 5tel. Und das recht genau (wie genau weiß ich nicht, weil ich die Arbeitsweise des ADwandlers nicht kenne, und daher seine Rundungstechnik nicht mal abschätzen kann). WENN so ein Ergebnis reicht, dann wäre das 1) s..kurz, 2) doch pfiffig (oder nicht?) und 3) s..schnell.
    Ciao sagt der JoeamBerg

  9. #9
    Erfahrener Benutzer Roboter Genie
    Registriert seit
    29.05.2005
    Beiträge
    1.018
    Hallo zusammen,

    nur mal so am Rande. (Weil oberallgeier die ADC-Geschichte anspricht.)

    Alle 6 ADC-Kanäle vom mega8 können 10 Bits wandeln. Bei 2'en davon wird aber in der Doku nur eine 8 Bit-Wandlung empfohlen weil da irgendwelche Taktsignale in der Hardwarenähe sind. (Allerdings kann man auch da 10 Bit nutzen wen man den mega im ADC-Sleep-Mode fährt)
    Bei der 8-Bit-Wandlung werden einfach nur die oberen Bits zurückgegeben. Intern macht die Kiste immer eine 10'ner Wandlung.

    Aber auch mit nur diesen 8 Bit muss ja noch Dreisatz befragt werden um auf die 200 Stepperschritte runterzurechen. Leider ist mein Schulwissen in Bezug auf das Kürzen dem Taschenrechner zum Opfer gefallen

    Gute Motersteuerung wünscht
    Sternthaler
    Lieber Asuro programieren als arbeiten gehen.

  10. #10
    Erfahrener Benutzer Roboter-Spezialist
    Registriert seit
    08.12.2005
    Beiträge
    535
    Und selbst rossirs Extremkürzung (ADC/5) kann man genau machen (im langfristigen Mittel), indem man die Divisionsreste aufaddiert. Dem Divisionsergebnis muss man immer dann eine Eins dazuzählen, wenn die Divisionsrest-Summe 5 übersteigt. Dabei natürlich auch von der Summe 5 abziehen.

    Analog immer Eins vom Ergebnis abziehen, wenn die Summe kleiner als -5 wird. Danach 5 zur Summe zuzählen. Bresenham lässt grüssen !

    mare_crisium

Seite 1 von 2 12 LetzteLetzte

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •  

fchao-Sinus-Wechselrichter AliExpress