10bit ADC Atmega32 und dann?!

Gast #1030071
Lesenswert?

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.
Gast #1030076
Lesenswert?

> 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
Gast #1030109
Lesenswert?

> 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.
Gast #1030119
Lesenswert?

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
Gast #1030132
Lesenswert?

>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.
Gast #1030145
Lesenswert?

Ü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.
Gast #1030232
Lesenswert?

>Ü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.
#1030325
Lesenswert?

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

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren