Messung des Durchschnittsstroms mit uC und Stromshunt

Dies ist mein erster Beitrag. Ich bin ein Software-Typ, der versucht, Hardware zu machen, also sei sanft :)

Schaltkreis

Ich entwerfe eine kleine Schaltung (siehe Bild, und entschuldigen Sie den unordentlichen Schaltplan), die schlicht und einfach aus einer Reihe von MOSFETS und Gate-Treibern besteht, die zum Schalten von Widerstandslasten (in diesem Fall Heizpads) von einem Mikrocontroller ausgelegt sind. Die Heizelemente haben oft einen sehr niedrigen Widerstand, und um die Leistung auf dem gewünschten Niveau zu halten, werden die MOSFETs mit PWM geschaltet.

Messung

Neben dem rein funktionalen Aspekt gibt es auch einen pädagogischen Schwerpunkt. Ich möchte eine Rückmeldung zum Stromverbrauch erhalten. Und mein naiver Ansatz bestand darin, einfach einige aktuelle Shunt-Sensor-ICs einzubauen. Wenn ich ein Multimeter zum Messen der Ausgangsspannung des Sensors verwende, erhalte ich aufgrund der "Langsamkeit" des Amperemeters tatsächlich etwas, das wie der durchschnittliche Strom (mit PWM-Schaltung) aussieht. Aber wenn ich denselben Ausgang an z. B. einen Atmega328p-ADC anschließe, erhalte ich einige schlechte Messwerte - die Geschwindigkeit hier bringt einen Messwert irgendwo auf die PWM-Rechteckwelle.

Meine Frage ist also, wie ich den (durchschnittlichen) Strom beim Schalten mit PWM messe?

Es scheint, dass das Design in Ordnung ist, aber ich habe möglicherweise etwas sowohl im Design als auch in der Verwendung des uC-ADC in diesem Zusammenhang übersehen.

schematisch

Ich denke, ein Filter könnte verwendet werden, um eine mittlere Spannung aus der PWM zu erhalten. Ein interessanter Artikel, der einen solchen Filter und die verwendeten Werte anhand der PWM-Frequenz erklärt, ist dieser .
Es gibt einige verwandte Antworten in dieser Frage . Aber sie erwähnen nur die Verwendung von Shunts und ICs zur Strommessung. PWM wird jedoch nicht erwähnt.
Danke für die Kommentare. @alexan_e: TI zeigt einen Eingangsfilter im INA197-Datenblatt, aber ich war mir seiner Verwendung nicht sicher. Es könnte der richtige Weg sein, wenn keine stabile Spannung vorhanden ist.
Ich denke, es ist die Lösung für Ihr Problem, aber ich hätte lieber jemanden, der mehr Erfahrung damit hat, eine detaillierte Antwort zu geben, deshalb habe ich dies als Kommentar gepostet.
Da es sich bei dem Ausgang um PWM mit variablem Tastverhältnis handelt, können Sie eine Spitzendetektorschaltung verwenden und diese mit einem ADC messen.

Antworten (2)

Was einfach aussieht, ist manchmal gar nicht so einfach. Sie haben eine recht komplexe Messung durchzuführen, möchten aber ein einfaches Ergebnis. Was Sie messen möchten, ist nicht konstant, es variiert mit der Zeit. Je nach Anforderungsniveau können Sie eine oder mehrere Eigenschaften des Stromverbrauchs berechnen. Diese Eigenschaften helfen Ihnen, das System besser zu überwachen. Ich schlage Ihnen 3 verschiedene Lösungen in aufsteigender Komplexität vor.

Lösung 1: Durchschnitt

Sie möchten ein Ergebnis mit einem Wert erhalten -> erhalten Sie rechtzeitig den Durchschnitt. Verwenden Sie, wie bereits von @akellyirl vorgeschlagen, einen Tiefpassfilter. Berechnen Sie float y = alpha*input + (1-alpha)*yfür jede Probe, wo alphader Glättungsfaktor ist. Siehe Wikipedia für die Details.

Lösung 2: Max + Durchschnitt

Sie sind daran interessiert, den Durchschnitt und den Maximalwert zu erhalten. Die Überwachung des Max-Wertes könnte beispielsweise für die Bauteildimensionierung interessant sein.

if (y > max)
  max = y;

Lösung 3: Standardabweichung + Max + Durchschnitt

Warum?

Siehe nachstehende Diagramme. Es gibt 3 Signale unterschiedlicher Form. Ein Dreieck , ein Sinus und ein Spike -Signal. Sie sind alle periodisch mit der gleichen Periode, der gleichen Amplitude , dem gleichen Durchschnitt und dem gleichen Min und Max . Aber sie haben unterschiedliche Formen, und tatsächlich haben sie eine ganz andere Geschichte...

Signale und ihr Histogramm

Einer der Unterschiede ist die Standardabweichung. Deshalb empfehle ich Ihnen, Ihre Messungen zu erweitern und die Standardabweichung einzubeziehen. Das Problem ist, dass die Standardmethode zur Berechnung CPU-intensiv ist. Hoffentlich gibt es eine Lösung.

Wie?

Verwenden Sie die Histogrammmethode . Erstellen Sie ein Histogramm aller Messungen und extrahieren Sie effizient die Statistiken (Min, Max, Durchschnitt, Standardabweichung) des Datensatzes. Das Histogramm fasst Werte zusammen, die denselben Wert oder denselben Wertebereich haben. Der Vorteil besteht darin, dass das Speichern aller Abtastwerte (zunehmende Zählung in der Zeit) vermieden wird und eine schnelle Berechnung mit einer begrenzten Anzahl von Daten möglich ist.

Bevor Sie mit dem Erfassen von Messungen beginnen, erstellen Sie ein Array zum Speichern des Histogramms. Es ist ein 1-dimensionales ganzzahliges Array der Größe 32 zum Beispiel:

int histo[32];

Je nach Reichweite des Amperemeters untenstehende Funktion anpassen. Wenn der Bereich beispielsweise 256 mA beträgt, bedeutet dies, dass Bin 0 des Histogramms um einen Wert zwischen 0 und 8 mA erhöht wird, Bin 1 um einen Wert zwischen 8 und 16 mA usw. Sie benötigen also eine Ganzzahl zur Darstellung die Histogramm-Bin-Nummer:

short int index;

Suchen Sie jedes Mal, wenn Sie eine Probe erhalten, den entsprechenden Behälterindex:

index = (short int) floor(yi);

Und erhöhen Sie diesen Behälter:

histo[index] += 1;

Um den Mittelwert zu berechnen, führen Sie diese Schleife aus:

float mean = 0;
int N = 0;
for (i=0; i < 32 ; i++) {
  mean = i * histo[i]; // sum along the histogram
  N += i; // count of samples
}
mean /= N; // divide the sum by the count of samples.
mean *= 8; // multiply by the bin width, in mA: Range of 256 mA / 32 bins = 8 mA per bin.

Um die Standardabweichung zu berechnen, führen Sie diese Schleife aus:

float std_dev = 0;

for (i=0; i < 32 ; i++) {
  std_dev = (i - mean) * (i - mean) * histo[i]; // sum along the histogram
}
std_dev /= N; // divide the sum by the count of samples.
std_dev = sqrt(std_dev); // get the root mean square to finally convert the variance to standard deviation.

Die Strategie des Histogrammverfahrens besteht darin, die langsamen Operationen an einigen wenigen Bins statt an allen erfassten Signalabtastwerten durchzuführen. Je länger die Stichprobengröße, desto besser. Wenn Sie weitere Einzelheiten wünschen, lesen Sie diese interessante Seite Das Histogramm, Pmf und Pdf .

sehr ausführlich und verständlich erklärt. Wie stellen Sie auf praktischer Ebene sicher, dass die ADC-Abtastung "auf gute Weise" verteilt wird, dh nicht in irgendeiner Weise mit dem PWM-Signal verbunden ist? Ich muss zugeben, dass ich im Moment nur den Arduino (hw + sw) sowohl für die PWM- als auch für die ADC-Abtastung verwende. Es könnte sein, dass ich die eingebauten Timer selbst einrichten sollte. Ich denke, die Abtastfrequenz sollte etwas höher sein als die PWM-Frequenz, oder?
Sobald man mit dem Sampling beginnt, wird es ziemlich kompliziert. Das erste, was zu tun ist, ist das Nyquist-Shannon-Theorem im Auge zu behalten. Intuitiv ist, dass Sie umso mehr Informationen haben, je höher die Abtastfrequenz ist. Was jedoch nicht intuitiv ist, obwohl es grundlegend ist, ist, dass Sie vor dem Abtasten bei der Frequenz Fs das Signal bei Fs/2 absolut tiefpassfiltern müssen (im analogen/elektronischen Bereich). Andernfalls sind Sie vom Aliasing betroffen. Ich schlage vor, dass Sie die höchste Abtastfrequenz wählen. Etwa das 10-fache der PWM-Frequenz, wenn möglich.
Dies ist ein häufiges Missverständnis des Nyquist-Shannon-Theorems, das tatsächlich besagt, dass Sie mit der doppelten Bandbreite abtasten müssen. Aliasing kann hilfreich sein. Keine Respektlosigkeit beabsichtigt, aber das scheint eine Antwort aus einem Lehrbuch zu sein. In diesem Szenario eine etwa 10-fache PWM-Abtastung vorzuschlagen, wenn hochfrequente Details höchstwahrscheinlich irrelevant sind, ist übertrieben.

Sie verstehen das Problem richtig: Sie müssen den "Durchschnitt" der PWM erhalten, genau wie das Messgerät, das Sie für Messungen verwenden.

Sie könnten einen RC-Filter für die Signale A1,2,3 verwenden, dessen Zeitkonstante mindestens das Zehnfache Ihrer PWM-Periode beträgt. Das heißt, wenn Ihre PWM-Periode 10 Mikrosekunden betrug, sollte die RC-Zeitkonstante 100 Mikrosekunden betragen. Zum Beispiel 10kOhm x 10nF = 100us

Eine bessere Lösung besteht darin, die Signale wie folgt digital im Mikrocontroller zu filtern:

float y = (1-0.99)*input + 0.99*y; 

Ändern Sie den Wert „0,99“, um die Zeitkonstante dieses digitalen Filters zu ändern.

Achten Sie auf Aliasing, wenn Sie es im Code tun.
Aliasing ist nicht unbedingt ein Problem. Wir alle wissen, dass zur Rekonstruktion eines Signals die Abtastrate mindestens doppelt so hoch sein muss wie die höchste Frequenz. Aber wenn das Signal bandbegrenzt ist, müssen Sie nur mit der doppelten Bandbreite abtasten . Dies wird als Unterabtastung bezeichnet. Da das Signal vermutlich niederfrequent ist, weil es ein Heizkissen antreibt, sollten vernünftige Abtastraten im Bereich von 100 bis 1000 SPS in Ordnung sein. Siehe: ni.com/newsletter/50078/en
Es wäre ratsam sicherzustellen, dass die PWM-Rate und die Abtastrate bei Verwendung von Undersampling Primzahl sind.
Genau meine Gedanken - wenn über ADC gemessen und PWM in derselben MCU erzeugt wird, besteht möglicherweise die Tendenz, dass beide zeitlich gesperrt sind.
Das Signal hat eine PWM-Frequenz, nicht eine niedrige Frequenz. Wenn es eine niedrige Frq wäre, ist es wahrscheinlich weniger ressourcenintensiv, einfach über eine Periode und einen Durchschnitt abzutasten, als auf diese Weise Gleitkomma-Mathematik zu verwenden.
Wie ich es sehe, ist das Signal niederfrequent auf einen PWM-Träger moduliert. Das Stromsignal könnte einen hochfrequenten Inhalt haben, der bewahrt werden muss. Aber das sieht aus der Beschreibung nicht so aus.
Danke an alle. Ich werde ein bisschen mit dem Softwarefilter herumspielen und sehen, wo er mich hinführt. @akellyirl, wenn ich Sie richtig verstehe, schlagen Sie (wenn ein Hardware-RC-Filter gewählt wurde) einen Filter am Sensorausgang vor. Aber das Datenblatt sagt, es wäre besser, es auf den Eingang zu legen? Könnten Sie bitte auch erläutern, warum ein SW-Filter besser ist? Vielen Dank.
Das Anbringen des Filters am Eingang wird durch die niedrige Eingangsimpedanz des INA197 erschwert, die Offsets verursacht, die Sie sorgfältig reduzieren müssen (wie im Datenblatt beschrieben). Das Setzen des RC auf den Ausgang ist einfacher. Sie verlieren den Vorteil der sehr niedrigen Ausgangsimpedanz des INA197 (was gut zum Ansteuern von Lasten ist), aber im Datenblatt des Atemga328P heißt es: „Der ADC ist für analoge Signale mit einer Ausgangsimpedanz von ungefähr 10 kΩ oder weniger optimiert Quelle verwendet wird, ist die Abtastzeit vernachlässigbar". Die Verwendung eines 1kΩ-Widerstands sollte also in Ordnung sein. Der Grabenfilter benötigt keine Komponenten.