mikrocontroller.net

Forum: Compiler & IDEs Modulo bringt unerwartete Ergebnisse


Autor: Robin Tönniges (rotoe) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo erstmal,

zu Anfang: Ich habe vor ein kleines Ladegerät zu basteln. Dafür brauche 
ich auch einen ADC. Ich möchte auf 2 Kommastellen genau messen. Aber 
wenn ich z.B. 2,5V anlege bekomme ich mittels Modulo: 2,1108 raus. 
Irgendwie steh ich aufm Schlauch. Ich habe keine Ahnung warum der 
soviele Stellen anzeigt. Momentan hab ich sowieso nen totalen BlackOut. 
Irgendwie verstehe ich nicht wie Modulo die Kommastellen begrenzt. Wenn 
z.B. die Zahl 4,448827364232 ist läuft meine Variable hofnungslos über 
oder begrenzt Modulo das von sich aus?
Hier mal der Relevante Code. Wenn ihr mehr wollt sagt bescheid. Ist 
vieleicht etwas unübersichtlich. Wenn ich morgen wieder bei klarmen 
verstand bin und es nötig ist werde ich ein paar Kommentare einfügen.
UZelle = ADC*10;
mV = UZelle%2046;
UZelle = UZelle/2046;
_delay_ms(250);
set_cursor(0,2);
lcd_string("Zelle=");
lcd_string(utoa(UZelle, ASCII, 10));
lcd_string(",");
if(mV <= 9)
{
  lcd_string("0");
}
lcd_string(utoa(mV, ASCII, 10));
lcd_string("V  ");

Autor: Matthias Lipinsky (lippy)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Kannst du mal den Sinn folgender Zeilen erklären?
UZelle = ADC*10;
mV = UZelle%2046;
UZelle = UZelle/2046;



Frage:
- Welche Referenzspannung hat der ADC?
- Welche Auflösung? 10bit => 1024 ?
- Welcher Spannungsbereich liegt am ADC-Eingang so an?
- Wie soll das Ausgangssignal normiert sein? in Millivolt?

Autor: Peter Dannegger (peda)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Wenn Du 2 Kommastellen haben willst, mußt Du %100 und /100 verwenden.

Ab ATmega8 darf man auch float verwenden.
Alle 250ms eine float Zahlenausgabe tut nicht weh.


Peter

Autor: Robin Tönniges (rotoe) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Matthias Lipinsky wrote:
> Kannst du mal den Sinn folgender Zeilen erklären?

> UZelle = ADC*10;
Da wird der eingelesene ADC_Wert mal 10 genommen um die Auflösung zu 
verbessern.
> mV = UZelle%2046;
Da "sollen" die mV ausgrerechnet werden.
Um auf 5V zu kommen muss 1024 / 204,6 genommen werden. Weil mal 10 
genommen also 2046.
[c]
> UZelle = UZelle/2046;
Hier werd die Spannung ausgerechnet.


> Frage:
> - Welche Referenzspannung hat der ADC?
5V
> - Welche Auflösung? 10bit => 1024 ?
10Bit
> - Welcher Spannungsbereich liegt am ADC-Eingang so an?
0-5V
> - Wie soll das Ausgangssignal normiert sein? in Millivolt?
1,23V

Autor: Andreas K. (a-k)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Robin Tönniges wrote:

>> UZelle = ADC*10;
> Da wird der eingelesene ADC_Wert mal 10 genommen um die Auflösung zu
> verbessern.

0..5V => 0..10230.

>> mV = UZelle%2046;
> Da "sollen" die mV ausgrerechnet werden.

0..2045    => 0..2045
2046..4091 => 0..2045
4092..6137 => 0..2045
usw.

M.a.W: Ab diesem Zeitpunkt ist es Unfug.

Autor: Andreas K. (a-k)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Bei 5V Referenz und 10 Bit ADC entspricht ein ADC-Schritt 5V/1024.

Also in mV: UZelle = (ADC * 5000L) / 1024.

Autor: Lothar Miller (lkmiller) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
>Ab diesem Zeitpunkt ist es Unfug.
Schon vorher, wenn nämlich aus dem AD-Wert 0..1023 (also 1024 Schritten) 
dann irgendwann nur noch 0..2045 (also 2 * 1023 Schritte) mit ca. 1 
Promille Fehler wird.
Das wird immer wieder gern mal falsch gemacht, und so ein klitzekleiner 
Steigungsfehler in die AD-Kennlinie gebracht.

Wir fangen hier bei Null an. Und Null ist nicht einfach nichts, sondern 
durchaus brauchbare Information. Richtigerweise müsste hier also modulo 
2048 gerechnet werden (wenn überhaupt).

Autor: Andreas K. (a-k)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Lothar Miller wrote:

> durchaus brauchbare Information. Richtigerweise müsste hier also modulo
> 2048 gerechnet werden (wenn überhaupt).

Naja, einen Wert 0..1023 mit %2048 zu traktieren ist nicht sinnvoller 
als ein paar NOPs einzubauen.

Autor: Robin Tönniges (rotoe) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
> Lothar Miller wrote:
> Naja, einen Wert 0..1023 mit %2048 zu traktieren ist nicht sinnvoller
> als ein paar NOPs einzubauen.

Es wird ja nicht 0..1023 mit %2048 sondern o..1023*10 also 0..10230 
%2048 genommen.

Autor: Falk Brunner (falk)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@ Peter Dannegger (peda)

>Alle 250ms eine float Zahlenausgabe tut nicht weh.

Nöö, aber mal 5 min über Festkommaarithmetik nachdenken auch nicht . 
. . ;-)

MfG
Falk

Autor: Peter Dannegger (peda)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Falk Brunner wrote:
> Nöö, aber mal 5 min über Festkommaarithmetik nachdenken auch nicht .
> . . ;-)

Sehe ich hier aber nicht.
Es wird über %2046 oder %2048 gestritten. Und beides ist Schwachfug, 
wenn man Dezimalzahlen ausgeben will.


Peter

Autor: Falk Brunner (falk)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@ Peter Dannegger (peda)

>Es wird über %2046 oder %2048 gestritten. Und beides ist Schwachfug,
>wenn man Dezimalzahlen ausgeben will.

Ein Grund mehr, über Festkommaarithmetik nachzudenken ;-)

MFG
Falk

Autor: Robin Tönniges (rotoe) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Falk Brunner wrote:
> Ein Grund mehr, über Festkommaarithmetik nachzudenken ;-)

Mal davon abgesehen das ich von Anfang an Festkommaarithmetik verwendet 
habe.
Hat aber nichts mit dem eigentlichen Problem zu tun. Ich versuche den 
Rest der Teilung von 10230 / 2048 herauszufinden und hinter 5, zu 
hängen.

Autor: Matthias Lipinsky (lippy)
Datum:

Bewertung
0 lesenswert
nicht lesenswert

Autor: Robin Tönniges (rotoe) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ah ok. Problem gelöst. Ich werds jetzt in mV umwandeln wies hier schon 
jemand gesagt hat dann %1000 fertig.
Danke für eure Hilfe

Autor: Matthias Lipinsky (lippy)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
>jemand gesagt hat dann %1000 fertig.

Geht auch ohne. (siehe meine geposteten Links)

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.