avr adc streuung ausgleichen

OP #8104258
Lesenswert?
• ▲
▼

ich möchte per m328-adc die Spannung eines 15kW-48-V-PV-Akkus messen und danach den WR an- und ausschalten. Der ADC streut um ca.1v. Wie gleiche ich das am besten aus? Wie viele Messungen, Höchstwert, Mittelwert, Unterwert? Welche genauigkeit ist erreichbar?

1
int16_t adc_read(u8 ADCchannel)
2
{
3
    // Select ADC channel (0-7) by setting the lower bits of ADMUX
4
    ADMUX = (ADMUX & 0xF8) | (ADCchannel & 0x07);
5
    
6
    // Start the conversion
7
    ADCSRA |= (1 << ADSC);
8
    
9
    // Wait for the conversion to complete
10
    while (ADCSRA & (1 << ADSC));
11
    
12
  
13
  
14
    // Return the ADC result
15
    return ADC;
16
}
17

18

19
int16_t adc_read_volt()
20
{
21

22
u32 val=adc_read(1);
23
val=val*100/106;
24
return val;
25
}
#8104271
Lesenswert?
• ▲
▼

Der AVR Mega328 hat einen 10 Bit-Wandler. Wenn der um 1V streut, machst du was grundsätzlich falsch. Erläutere deinen Aufbau sowie die Schaltung (Stromlaufplan), vielleicht kann man helfen.

Nach meiner Erfahrung mit den moderneren ATTiny mit 12 Bit-Wandler, kann man bei einmaligen Auslesen die beiden unteren Bits vergessen.

Durch starke Überabtastung / Mittlung, was ja bei einer Batteriemessung ohne weiteres geht, ist die nominale Auflösung erreichbar.

Mal ein älterer Beitrag zu dem Thema: Beitrag "[AVR] ADC oversampling, nutzbarer Wertebereich"

OP #8104276
Lesenswert?
• ▲
▼

Ki-Antwort: 2. Welche Filtermethode ist am besten? Ich würde für deinen Fall mit 32 Messungen, Verwerfen der Extremwerte und anschließendem Mittelwert anfangen. Verfahren Vorteil Nachteil Empfehlung

  • Einzelmessung Schnell Sehr störanfällig Nicht für Schaltentscheidungen

  • Mittelwert aus 8 Messungen Einfach Filtert starke Ausreißer nur begrenzt Gute erste Verbesserung

-Mittelwert aus 32 Messungen Reduziert zufälliges Rauschen Reagiert langsamer; hilft nicht gegen systematische Fehler Sehr gut

  • Minimum/Maximum Zeigt Schwankungen Einzelne Störungen verfälschen den Wert stark Zur Diagnose

  • Median aus 9 Messungen Unterdrückt einzelne Ausreißer Bei normalem Rauschen weniger effizient als Mittelwert Gut bei Störspitzen

  • 32 Messungen, Extremwerte verwerfen Gute Kombination aus Glättung und Ausreißerunterdrückung Etwas mehr Rechenaufwand

Meine Empfehlung Du musst nicht den höchsten und niedrigsten Wert jeder Messreihe speichern, um daraus die Akkuspannung zu bestimmen. Du kannst beide Werte verwerfen und die übrigen Messwerte mitteln. Minimum und Maximum kannst du zusätzlich zur Diagnose ausgeben.

1
uint16_t adc_read_filtered(uint8_t channel)
2
{
3
    uint32_t sum = 0;
4
    uint16_t min_val = 1023;
5
    uint16_t max_val = 0;
6

7
    for (uint8_t i = 0; i < 32; i++) {
8
        uint16_t v = adc_read(channel);
9

10
        sum += v;
11

12
        if (v < min_val) min_val = v;
13
        if (v > max_val) max_val = v;
14
    }
15

16
    // Je einen kleinsten und größten Wert entfernen.
17
    sum -= min_val;
18
    sum -= max_val;
19

20
    return (uint16_t)(sum / 30);
21
}

Antwort schreiben

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.