Mittelwert mit float

Hallo,

ist eine gute Idee.

Auch wenn Du inzwischen eine andere Lösung bevorzugst, in der loop() meines Beispiels siehst Du den Zugriff auf die Werte

for (int i = 0; i < pinZahl; i++) {
    wert[i].messen();
    Serial.print(wert[i].getGleitend());
    Serial.print("\t");
  }
  Serial.println();
  for (int i = 0; i < pinZahl; i++) {
    Serial.print(wert[i].getGewichtet());
    Serial.print("\t");
  }

Mit wert[i].messen() wird der aktuelle Stand des Analogpins ermittelt und der gemittelte sowie auch der gewichtete Wert berechnet.

wert[i].getGleitend() retourniert den über die letzten (fenster) Werte gleitenden Mittelwert.

wert[i].getGewichtet() den nach Deinem Verfahren gewichteten Wert.

Erkläre bitte was du eingestellt hast und wofür?
Hast du dir die gesamte Timerkonfiguration angeschaut?
Also alle notwendigen Registereinstellungen?

Diese Timereinstellungen verhindern ein unangenehmes Fiepgeräusch durch die Pulsweitenmodulation an den Linearmotoren, es würde natürlich auch ohne funktionieren. Ist aber extrem unangenehm. Mit den Registereinstellungen habe ich mich nicht weiter befasst.

Hallo,

okay, woher willst du es auch wissen. Du hast die Timer nicht eingestellt, du hast sie verstellt. Wenn das aktuell irgendwie funktioniert, dann ist das Zufall. Wenn du dich nicht mit den Registereinstellungen beschäftigt hast, wie kommst du dann auf deine Einstellungen? Weißt du was die ganzen Bits im Register TCCRnB bedeuten?
Unter Arduino sind die Timer für delay() und analogWrite() voreingestellt. Fummelt man an Timer0 rum, verstellt man die Zeitbasis für delay() und millis(). Kann man machen, man sich nur dessen bewusst sein. Du hast laut meiner Meinung wilde Einstellungen vorgenommen. Du wolltest sicherlich nur die Frequenz ändern.

Lasse dir die Grundeinstellung beider Timer für TCCRnA und TCCRnB anzeigen, schaue ins Manual was damit eingestellt ist und überlege was geändert werden muss. Für Timer1 hast du bspw. einen reservierten Modi eingestellt, zufällig funktioniert das.

Was für ein Arduino Board hast du?

Wenn jedes Bit Bereiche abbildet:
2Bit: 0.00, 1.25, 2.50, 3,75, 5.00
Bei 2 Bit habe ich n=4 Bereiche mit 5 Werten.
Mit 3 Bit sind es n=8 Bereiche mit 9 Werten.
Bei 10 Bit n=1024 Bereiche mit 1025 Werten.

Laut Datenblatt wird bei n-1 bzw. 0x3FF, also 1023 5V abgebildet.

N-1 bei 2Bit: 4-1 = 3 Bereiche
2Bit: 0.00, 1.66, 3,33, 5.00
3Bit: 8-1 = 7 Bereiche.
Das bedeute 5/7 = 0,7143 für jeden Bereich
10Bit: 1024-1 = 1023 Bereiche

Wenn das nicht stimmt, was ist dann 1023?

// Edit:
Um das mit den 1Bit nochmal aufzunehmen: Es werden keine 2,5V abgebildet. Das ist der Umschaltbereich, bei dem erkannt wird, ob 5V oder 0V. Es wird durch 1 geteilt und nicht durch 2.

mal ganz allgemein, da das Datenblatt angesprochen wurde:

aus:

1 Like

1024 Werte == 1023 Bereiche.
0x3FF ist das Maximum.

??

Bleiben wir mal beim einfachen Beispiel 2 Bit:
Damit kann man 4 Werte darstellen (0 .. 3),
die 4 Bereichen entsprechen
( 0-1/4, 1/4-2/4, 2/4-3/4, 3/4-1 ) * Vref

Das einzige Problem ist, dass du gerne 5 Werte sehen möchtest, sowohl 0 als auch Vref.

Bei 10 Bit teilst du entsprechend durch 1024 und hast 1024 Bereiche/Werte

[Nachtrag]
Wenn du mit Gleitkomma (float) rechnest, kannst du die 1024 Bereiche/Werte bequem auf z.b. 101 Werte abbilden ( 0 .. 100 ), Anfangs- und Endbereich (Anzeige 0 bzw. 100) werden beim normalen Runden dann nur halb so breit wie die andern.

Hallo Thomas,

das ist mir jetzt peinlich.

TCCR1B = TCCR1B & 0b11111000 | 0x01;// Setzt Timer 1 Vertical   (Pin 9 und 10) auf 31300Hz 
TCCR0B = TCCR0B & 0b11111000 | 0x02;// Setzt Timer 0 Horizontal (Pin 5 und 6 ) auf 62500Hz

Du hast die Timer nicht grundlegend völlig verstellt. Du hast damit nur die Prescaler geändert. Ich hatte das & mit Bitmaske völlig falsch gelesen und deshalb falsch interpretiert. Sorry.

Wie soll das gehen?

  1. 0 - 1
  2. 1 - 2
  3. 2 - 3

Es ist doch unbestritten, dass der letzte Wert eben nicht am Ende festgestellt wird.
Der maximale Wert wird mit N-1 dargestellt.
Nach Deiner Rechnung würde die 2Bit Rechnung erst aufgehen, wenn 3 erreicht ist.

Stimmt, Delay und Millis verändern sich, aber nicht für alle Digitalausgänge. Habe die Schaltung so umgestrickt das ich diese betroffenen Ausgänge nicht nutze. Bei mir kommt ein Nano zur Anwendung. Nun muß ich das leidige Problem der " Glättung" der Sensorwerte noch lösen.

delay() und millis() haben nichts mit irgendwelchen Ausgängen zu tun!
Also muss du dich in dem Punkt irren.

Hallo my_xy_projekt,

das oben ist nur ein Bsp. deiner Antworten. Warum haust du immer alles wild durcheinander? Du springst zwischen absoluten Werten, Bereichen, Endwerte, Zwischenwerte munter hin und her. Warum?

Das was du hier erneut nachfragst, hat Michael nicht geschrieben und auch kein anderer.

Du weißt was Digit Wert vom ADC bedeutet?
Du weißt wie ein ADC funktioniert?
Du weißt was Messbereiche sind?

Um beim 1Bit ADC zu bleiben. Er kann nur 2 Informationen liefern. Entweder 0 oder 1. Also teilt sich die Messung in 2 Bereiche auf.
0 ... 2,5V
2,5V ... 5V.
Wo soll da jetzt ein 3. Bereich herkommen?
Oder bei 10 Bit deine ominösen 1025?
Bei 10 Bit gibt es den höchsten Endwert von 1023 den der ADC ausgeben kann. Er deckt jedoch 1024 Bereiche ab. Von 1025 irgendwas kann da keine Rede sein.

Ein 2 Bit ADC kann 4 Informationen liefern. Es gibt nur 4 Bitkombinationen.
00
01
10
11
Also teilt es sich in 4 Messbereiche auf. Wo sollen da jetzt nur 3 oder ein 5. Bereich herkommen?

nochmal 2 Bit ADC Messbereich:

0,00V … 1,25V
1,25V … 2,50V
2,50V … 3,75V
3,75V … 5,00V

Legst du an den ADC 2,6V an, liefert er in Digit 0b10, dezimal 2. Ein Selbstbaumessgerät würde dir 2,5V anzeigen. Jetzt kann man die 2,5V als bare Münze nehmen oder wenn man das Messgerät kennt, kann man sagen die zu messende Spannung liegt zwischen 2,5V … 3,75V. Mit modernen Messgeräten kann man die Anzeige als bare Münze nehmen, weil sie hoch auflösen, in Software noch paar Tricks haben und einem die letzte Kommastelle sowieso nicht interessiert.

Mit falscher Umrechnung ((10Bit) x/1023 statt x/1024) macht man nichts anderes, nur das man einen falschen Messbereich angezeigt bekommt. Wie der sich verschiebt hat combie schon vorgerechnet.

Ein ADC kann keine absoluten Messwerte für dich bestimmen. Er kann einem nur sagen das die zu messende Spannung in einem bestimmten Bereich liegt. Je höher seine Auflösung desto feiner kann er dir sagen in welchem Bereich der Wert liegt.

Wo willl ich denn 1025 haben? Eben genau nicht.

Das sind 5 Werte in 4 Bereichen.
Nichts anderes sage ich.
Will ich 1024 Werte darstellen, habe ich 1023 Bereiche. Und jeder Bereich steht für eine gleichbleibende Größe.

In Post #47 bspw.

Wo nimmst du erneut 5 Werte her? Wenn es nur 4 Bereiche gibt.
Einmal haste etwas zuviel, dann wieder zu wenig.
Überlege dir das nochmal in aller Ruhe. Mir scheint du verwendest ein Digit doppelt. Das geht aber nicht.

Anders. Um Bereiche überhaupt darzustellen zukönnen benötigt es mit 2Bit ADC 5 Absolutwerte um 4 Bereiche zu beschreiben. Man kann dennoch nur 4 Bereiche verwenden für die Rechnung. Man kommt in der Rechnung niemals zurück auf 5 Werte wenn man nur 4 Bereiche hat. Das ist die Krux beim digitalisieren, man hat Verluste. Die man entweder durch Auflösung ausreichend erschlägt oder andere Tricks.

Anderes Bsp. Du baust ohne Lücke 4 Fussballtore direkt nebeneinander zusammen. Du benötigst dafür 5 Stangen und hast dennoch nur 4 Tore. Niemand würde auf die Idee kommen von 5 Toren zu reden wenn nur 4 sichtbar vorhanden sind.

Das?

Die Zeile danach gehört dazu.

Niemand würde auf die Idee kommen, von einem Tor zu reden, wenn er nur einen Pfosten hätte.
Du kommst erst dann zu einem Tor, wenn Du zwei Pfosten hast.
Die Anzahl Tore ergibt sich aus den Pfosten - 1
Das erreichen des oberen Wertes erfolgt bei Referenzspannung - 1Bit
Ab 0x3FF werden 5V abgebildet.

Es gibt kein "ab 0x3ff" bei einem 10 Bit ADC.
5V, oder besser Uref, liegt auf keiner der Schaltstufen.

Ganz ehrlich. An der Stelle höre ich jetzt auf. Ich habe mich bemüht.

2 Likes

Da solltest Du auch nicht mehr Energie reinstecken. Es wurde schon im Jahre des Herrn 2022 eine überaus ausschweifende Diskussion mit @my_xy_projekt zu demselben Thema geführt. Da ging es ursprünglich um die Strommessung mit einer Rogowski Spule.

Trotz vieler Erklärungsversuchen ist da nichts angekommen…

2 Likes