Hallo zusammen, ich beschäftige mich im Moment mit dem ADC des Atmega 32. Und kann ehrlich gesagt keinen Weg finden, wie ich das 10bit-Signal angemessen in ein 8bit-Signal für ein Display umgewandelt bekomme. Da ich drei verschiedene Messungen (Spannung, Strom und Temperatur) machen muss, komme ich mit dem SRAM nicht hin, wenn das Wandlungsergebnis als Offset einer Tabelle dienen soll. Vielleicht habe ich auch einfach nur ein Brett vorm Kopf, aber ich komme zu keiner Lösung. Kann man den ADC nicht auch mit einer Auflösung von 8bit betreiben? Oder kennt jemand eine andere Möglichkeit, die 10bit im Bereich der Kapazitäten des µC in ein 8-bit-Befehl für das Display umzuwandeln? D.
> Vielleicht habe ich auch einfach nur ein Brett vorm Kopf, aber ich komme zu keiner Lösung. Ja. > Kann man den ADC nicht auch mit einer Auflösung von 8bit betreiben? Nein. > Oder kennt jemand eine andere Möglichkeit, die 10bit im Bereich der Kapazitäten des µC in ein 8-bit-Befehl für das Display umzuwandeln? 2x shift
Besser wäre das ADLAR auf 1 zu stellen und nur das ADCH auslesen. Da sind dann auch die 8 MSBs drin. (siehe Seite 217). Spart einige Schiebe- und Read/Write-Operationen
Wieso so kompliziert? Rechnerisch skalieren, oder das High-Byte des Wandlungsergebnisses einfach ignorieren.
Wenn ich das Ergebnis zweimal schiebe, dann mache ich einen Fehler von 0,75V / 0,3A / 0,45°C ..
> Wenn ich das Ergebnis zweimal schiebe, > dann mache ich einen Fehler von 0,75V / 0,3A / 0,45°C .. Wie wäre es denn mit "die 10 Bit" 6x nach rechts schieben ? Aber besser natürlich sofort als 8-Bit lesen.
Wenn man schon eine Tabelle für die Umrechnung der Sensoren machen möchten gehört diese ins FLASH und nicht ins RAM. Zum Anderen kann man die Umrechnung ja mit einer Formel annähern und dann die Werte im Controller berechnen. gruß, freddyk
>Wenn ich das Ergebnis zweimal schiebe, dann mache ich einen Fehler von >0,75V / 0,3A / 0,45°C .. Deine Antworten sind nicht gerade erhellend. Vielleicht solltest Du mal ein paar Details über Dein Problem verraten. Eventuell wäre auch der magische Satz "Also eigentlich will ich folgendes machen..." der Sache förderlich. Ich bezweifele, ob man Dir sonst effizient helfen kann. Noch ein Tipp: An solchen Threads verlieren die Leute erfahrungsgemäß ziemlich rasch ihr Interesse. Warte nicht solange.
>Stevens_D (Gast) >Auf Seite 217 steht was über die JTAG-Interface? ATmega32 Datenblatt Rev. 2503K–AVR–08/07, siehe Bild
Über zwei Messwandler bekomme ich einmal die Spannung (230V) von 0-10V und den Strom (Bis 32A) als 0-20mA. Außerdem noch die Temperatur. Alle Signale werden durch eine OP-Schaltung auf 0-5V angeglichen und an den ADC gegeben. Jetzt sollen da die Messergebnisse digitalisiert und auf ein Display gegeben werden. Das Display ist von Electronic-Assembly und zweizeilig. Nun muss ich das Wandlungsergbnis ja so verarbeiten, dass der Controller vom Display damit arbeiten kann. Für die Zahlen 0 bis neun muss immer nur das lower Nibble ändern, weil sich die Zahlen in einer Spalte befinden. Problem ist nur, dass ich nicht weiss wie ich das innerhalb der Kapazitäten des Controllers anstellen soll. Wenn das Wandlungsergebnis als Offset für einen Zeiger dienen soll, der durch eine Tabelle mit den Display-Werten springt, dann kann ich das nicht für alle drei Messungen machen, weil dann sowohl Flash als auch SRAM nicht ausreichend sind. Also, welche Technik kann ich da anwenden, um dem Display-Controller die richtigen Werte für die entsprechenden Zahlen zu senden?! Grüße, d.
Was für einen Controller hat das Display? Üblicher Weise schickt man einfach die Bytes die man darstellen will an das Display und ggf. noch die Position auf dem Display. Ist das bei dir anders?
>Also, welche Technik kann ich da anwenden, um dem Display-Controller die >richtigen Werte für die entsprechenden Zahlen zu senden?! Beitrag "Re: Problem mit ADC an mega128"
>Über zwei Messwandler bekomme ich einmal die Spannung (230V) von 0-10V >und den Strom (Bis 32A) als 0-20mA. Außerdem noch die Temperatur. Alle >Signale werden durch eine OP-Schaltung auf 0-5V angeglichen und an den >ADC gegeben. OK. Dann könntest Du folgendes machen: Gleich die OP-Schaltung so ab, dass der ADC bei 250 V Messspannung gerade den Wert 1000 ausgibt. Entsprechend bei 32 A den Wert 640. Den ADC-Spannungswert (0...1000) teilst Du durch zweimaligen Rechtsshift durch 4. Das Ergebnis liegt im Bereich 0...250 und stellt somit direkt die Spanungszahl in Volt dar. Beim Strom analog. Hier unterwirfst Du den ADC-Wert nur einem Rechtsshift. Das Ergebnis liegt dann im Bereich 0...320 und stellt direkt die Spannungzahl in der Einheit 1/10 Ampere dar. Jetzt brauchst Du noch eine Funktion, die Dir aus den binären Werten 0...250 bzw. 0...320 die zugehörigen Zeichenfolgen generiert, also z. B. 289 --> '2', '8', '9'. Im Grunde handelt es sich dabei um eine Zahl-zu-String-Konvertierung. Das Stichwort dazu lautet "Binär-zu-BCD-Umwandlung" (BCD = binary coded decimal). Zu diesem Thema gibt es hier schon x Threads; bemühe die Forumssuche und Du wirst schnell fündig werden. Da eine solche Funktion weder kompliziert noch rechenintensiv ist, wäre eine Lookup-Tabelle dafür reine Speicherplatzverschwendung. Im Prinzip arbeitet die Binär-zu-BCD-Umwandlungsfunktion nach folgenden Schema: Angenommen, der fragliche Wert ist 16 bit breit. Dann subtrahiert sie davon zunächst solange 10000, bis das Ergebnis negativ wird. Wie oft das geht, wird mitgezählt. Der Zählerstand am Ende ist die Zehntausernder-Ziffer. Dann addiert man wieder einmal 10000 dazu, um die Zahl wieder positiv zu bekommen. Danach wiederholt man dasselbe mit 1000, um die Tausender-Ziffer zu bekommen, danach mit 100 und schließlich mit 10. Für die Einerstelle braucht man nichts mehr rechnen; sie ist das, was nach der 10er-Subtraktion übrigbleibt. Wenn unerwünschte führende Nullen entstehen, kann man das am Schluss gesondert prüfen und sie einfach durch Spaces ersetzen. Da diese Funktion oft gebraucht wird, gibt es sie in C oder Basic schon fertig programmiert. Bei dem Stromwert musst Du zwischen der vorletzten und der letzten Ziffer noch einen Dezimalpunkt '.' aufs Display schreiben. Wenn Du magst, kannst Du die Bits, die beim oben erwähnten Rechtsschieben verloren gehen, natürlich vorher abspeichern und dann für eine zusätzliche "verkrüppelte" Stelle verwenden, die nur "0" und "5" anzeigen kann. Die Auflösung Deines Displays wäre dann 0.5 V bzw. 0.05 A.
Stevens_D wrote: > Jetzt sollen da die Messergebnisse digitalisiert und auf ein Display > gegeben werden. Bloß, wo ist denn das Problem? Mach die Rechnung und gib den Wert aus, z.B. Anzeige = ADCWERT * 230 / 1024 > Problem ist nur, dass ich nicht weiss wie ich das innerhalb der > Kapazitäten des Controllers anstellen soll. Mit 32 Bit Integer reicht ein ATtiny24, mit 16 Bit float ist ein ATtiny44 zu empfehlen. D.h im großen ATmega32 gruseln sich die wenigen Codebytes, weil sie so einsam sind. Peter
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.