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
> 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.
Ü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