mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik 10bit ADC Atmega32 und dann?!


Autor: Stevens_D (Gast)
Datum:

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

Autor: Bensch (Gast)
Datum:

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

Autor: Teplotaxl X. (t3plot4x1)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Oder einfach /4 rechnen ;)

Autor: Timmo H. (masterfx)
Datum:

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

Autor: Sebastian (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Wieso so kompliziert? Rechnerisch skalieren, oder das High-Byte des 
Wandlungsergebnisses einfach ignorieren.

Autor: Stevens_D (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Wenn ich das Ergebnis zweimal schiebe, dann mache ich einen Fehler von 
0,75V / 0,3A / 0,45°C ..

Autor: Stevens_D (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Auf Seite 217 steht was über die JTAG-Interface?

Autor: cdg (Gast)
Datum:

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

Autor: freddyk (Gast)
Datum:

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

Autor: Gast (Gast)
Datum:

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

Autor: Timmo H. (masterfx)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
>Stevens_D (Gast)
>Auf Seite 217 steht was über die JTAG-Interface?
ATmega32 Datenblatt Rev. 2503K–AVR–08/07, siehe Bild

Autor: Stevens_D (Gast)
Datum:

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

Autor: Timmo H. (masterfx)
Datum:

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

Autor: Stevens_D (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Das Display hat einen Controller KS0073.

Autor: Matthias Lipinsky (lippy)
Datum:

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

Autor: Gast (Gast)
Datum:

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

Autor: Peter Dannegger (peda)
Datum:

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

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.