Forum: Compiler & IDEs Mittelwertbildung von Messwerten in C mit Mega8


von Guenter B. (gbl)


Lesenswert?

Hallo,
kann mir einer sagen warum meine Mittelwertbildung nicht funktioniert ?
Ich addiere 5 mal den Wert result: 15 + 15 + 15 + 15 + 15 (Momentanwert)
Dividiere diesen durch 5 und heraus kommt 241.
Warum ?
Hat jemand einen Link zum "Rechen mit C" ? Ich hatte schon bei der 
Umrechnung vom ADC zum Temperaturwert Probleme.
Geht
1
void adc_messung(void)
2
{
3
unsigned long temp;
4
unsigned int result;
5
unsigned int mittelwert;
6
unsigned int temp2;
7
8
for (uint8_t i=0; i<=5; ++i) 
9
{
10
ADCSRA |= (1<<ADSC);
11
loop_until_bit_is_clear (ADCSRA,ADSC);
12
temp = 50 * ADC;    
13
result = (temp*10/1024)-273;   
14
//Result passt noch mit 15
15
temp2 = mittelwert + result;
16
mittelwert = temp2;
17
_delay_ms(300);
18
}
19
result = mittelwert / 5;
20
//hier kommt nun als result-Wert 241 raus
21
itoa( result, Text, 10 );// und in Text verwandeln
22
return;

von Helmut L. (helmi1)


Lesenswert?

>for (uint8_t i=0; i<=5; ++i)

Deine Schleife läuft über 6 Additionen

und du must Mittelwert auch mal am Anfang auf 0 setzen.

Gruss Helmi

von Guenter B. (gbl)


Lesenswert?

Danke

von Sebastian B. (mircobolle)


Lesenswert?

kennt ihr die einfachste Methode um den Mittelwert zweier Zahlen in C zu 
bekommen?

Voraussetzung:
Vorzeichenlose Ganzzahl Operanden, bei der Schnittstelle muss sicher 
gestellt werden, dass bei der Addition der Wertebereich von u8 nicht 
überschritten wird.

(Methode für höhere Präzission, Addieren + letztes Bit verwerfen)
1
u8_mittelwert = (u8_a1 + u8_a2) >> 1;

Alternative:
+ größerer Dynamik-Bereich
- ungenauer
1
u8_mittelwert = (u8_a1 >> 1) + (u8_a2 >> 1);

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.