Modulo bringt unerwartete Ergebnisse

OP Persönliche Seite #933151
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.
1
UZelle = ADC*10;
2
mV = UZelle%2046;
3
UZelle = UZelle/2046;
4
_delay_ms(250);
5
set_cursor(0,2);
6
lcd_string("Zelle=");
7
lcd_string(utoa(UZelle, ASCII, 10));
8
lcd_string(",");
9
if(mV <= 9)
10
{
11
  lcd_string("0");
12
}
13
lcd_string(utoa(mV, ASCII, 10));
14
lcd_string("V  ");
Gast
Kannst du mal den Sinn folgender Zeilen erklären?
1
UZelle = ADC*10;
2
mV = UZelle%2046;
3
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?
OP Persönliche Seite
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
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.
Moderator (Firma: Titel) Persönliche Seite
>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).
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.

Antwort schreiben

Eine eigene Frage? Dieser Thread ist über 18 Jahre alt. Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.

Neuen Thread starten

Eine Lösung, Ergänzung oder Rückmeldung zu diesem Thread? Dann antworte hier.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.