Messung des Durchschnittsstroms mit uC und Stromshunt

12

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

Schaltkreis

Ich entwerfe einen kleinen Schaltkreis (siehe Bild und entschuldige den unordentlichen Schaltplan), der schlicht und einfach aus einer Reihe von MOSFETs und Gate-Treibern besteht, mit denen ohmsche Lasten (in diesem Fall Heizkissen) von einem Mikrocontroller geschaltet werden können. Die Heizelemente haben oft einen sehr geringen 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 ein Feedback zum aktuellen Verbrauch erhalten. Und mein naiver Ansatz war es, einfach einige aktuelle Shuntsensor-ICs einzusetzen. Wenn ich ein Multimeter zum Messen der Ausgangsspannung vom Sensor verwende, erhalte ich aufgrund der "Langsamkeit" des Amperemeter tatsächlich etwas, das wie der durchschnittliche Strom (mit PWM-Umschaltung) aussieht. Aber wenn ich den gleichen Ausgang an einen atmega328p-ADC anschließe, erhalte ich einige schlechte Messwerte - die Geschwindigkeit hier setzt irgendwo einen Messwert auf der PWM-Rechteckwelle.

Meine Frage ist also, wie ich beim Umschalten mit PWM den (durchschnittlichen) Strom messen soll.

Es scheint, dass das Design in Ordnung ist, aber ich könnte etwas sowohl im Design als auch in der Art und Weise, wie der uC-ADC in diesem Kontext verwendet werden sollte, verpasst haben.

schematisch

ltj
quelle
Ich denke, ein Filter könnte verwendet werden, um eine mittlere Spannung von der PWM zu erhalten. Ein interessanter Artikel, der einen solchen Filter und die auf der PWM-Frequenz basierenden Werte erklärt, ist dieser .
alexan_e
Zu dieser Frage gibt es einige verwandte Antworten . Sie erwähnen jedoch nur die Verwendung von Shunts und ICs zur Strommessung. PWM wird jedoch nicht erwähnt.
Ricardo
Danke für die Kommentare. @alexan_e: TI zeigt einen Eingabefilter im INA197-Datenblatt an, aber ich war nicht sicher, ob er verwendet wird. Dies könnte der richtige Weg sein, wenn keine stabile Spannung vorliegt.
9.
Ich denke, es ist die Lösung für Ihr Problem, aber ich hätte lieber jemanden, der mehr Erfahrungen damit hat und eine ausführliche Antwort gibt. Deshalb habe ich dies als Kommentar gepostet.
alexan_e
Da es sich bei der Ausgabe um eine variable Duty-Cucle-PWM handelt, können Sie eine Peak-Detektor-Schaltung verwenden und diese mit einem ADC messen.
Martin

Antworten:

6

Manchmal ist das, was einfach aussieht, nicht so einfach. Sie müssen eine recht komplexe Messung durchführen, möchten jedoch ein einfaches Ergebnis erzielen. Was Sie messen möchten, ist nicht konstant, sondern variiert in der Zeit. Abhängig von Ihrem Anforderungsniveau können Sie eine oder mehrere Eigenschaften des Stromverbrauchs berechnen. Mithilfe dieser Eigenschaften können Sie das System besser überwachen. Ich schlage Ihnen 3 verschiedene Lösungen in aufsteigender Komplexität vor.

Lösung 1: Durchschnitt

Sie möchten ein einwertiges Ergebnis erzielen -> den zeitlichen Durchschnitt ermitteln. 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 Details.

Lösung 2: Max + Durchschnitt

Sie sind daran interessiert, den Durchschnitt und den Maximalwert zu ermitteln. Die Überwachung des Maximalwerts kann beispielsweise für die Dimensionierung von Bauteilen interessant sein.

if (y > max)
  max = y;

Lösung 3: Standardabweichung + Max + Durchschnitt

Warum?

Siehe unten stehende Diagramme. Es gibt 3 Signale unterschiedlicher Form. Ein Dreieck , ein Sinus und ein Spitzensignal . Sie sind alle periodisch mit der gleichen Periode, der gleichen Amplitude , dem gleichen Durchschnitt und den gleichen min und max . Aber sie haben unterschiedliche Formen und in der Tat eine völlig andere Geschichte ...

Signale und ihr Histogramm

Einer der Unterschiede ist die Standardabweichung. Aus diesem Grund empfehle ich Ihnen, Ihre Messungen zu erweitern und die Standardabweichung einzubeziehen. Das Problem ist, dass die Standardmethode für die Berechnung die CPU beansprucht. 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, avg, Standardabweichung) des Datensatzes. Das Histogramm fasst Werte zusammen, die denselben Wert oder denselben Wertebereich haben. Der Vorteil besteht darin, dass nicht alle Abtastwerte gespeichert werden (zunehmende Anzahl von Daten) und eine schnelle Berechnung für eine begrenzte Anzahl von Daten möglich ist.

Erstellen Sie vor dem Erfassen von Messungen ein Array zum Speichern des Histogramms. Es handelt sich um ein eindimensionales ganzzahliges Array der Größe 32, zum Beispiel:

int histo[32];

Passen Sie je nach Reichweite des Amperemeter die folgende Funktion an. Wenn der Bereich beispielsweise 256 mA beträgt, bedeutet dies, dass Bin 0 des Histogramms um einen Wert zwischen 0 und 8 mA, Bin 1 um einen Wert zwischen 8 und 16 mA usw. erhöht wird. Sie benötigen also eine ganze Zahl zur Darstellung Nummer des Histogrammfachs:

short int index;

Suchen Sie jedes Mal, wenn Sie eine Probe erhalten, den entsprechenden Bin-Index:

index = (short int) floor(yi);

Und inkrementiere diesen Bin:

histo[index] += 1;

Führen Sie diese Schleife aus, um den Mittelwert zu berechnen:

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.

Führen Sie diese Schleife aus, um die Standardabweichung zu berechnen:

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 der Histogrammmethode besteht darin, die langsamen Operationen an einigen wenigen Behältern anstelle aller erfassten Signalabtastungen durchzuführen. Je länger die Stichprobe, desto besser. Wenn Sie weitere Informationen wünschen, lesen Sie diese interessante Seite Das Histogramm, Pmf und Pdf .

RawBean
quelle
sehr gründliche und klare Erklärung. Wie stellen Sie in der Praxis sicher, dass die ADC-Abtastung "auf eine gute Weise" verteilt wird, dh in keiner Weise mit dem PWM-Signal verriegelt ist? Ich muss zugeben, dass ich gerade das Arduino (hw + sw) für PWM- und ADC-Sampling verwende. Es kann sein, dass ich die eingebauten Timer selbst einrichten sollte. Ich denke, die Abtastfrequenz sollte etwas höher sein als die PWM-Frequenz, oder?
14.
1
Sobald Sie mit dem Sampling beginnen, werden die Dinge ziemlich kompliziert. Das erste, was Sie tun müssen, ist das Nyquist-Shannon-Theorem. Intuitiv ist, dass Sie umso mehr Informationen haben, je höher die Abtastfrequenz ist. Was aber nicht intuitiv ist, obwohl grundlegend, ist, dass Sie vor dem Abtasten mit der Frequenz Fs das Signal mit Fs / 2 unbedingt tiefpassfiltern müssen (im Bereich Analog / Elektronik). 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.
RawBean
Dies ist ein weit verbreitetes 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 dies scheint eine Antwort aus einem Lehrbuch zu sein. Das Vorschlagen einer ~ 10-fachen PWM-Abtastung in diesem Szenario, wenn Hochfrequenzdetails höchstwahrscheinlich irrelevant sind, ist übertrieben.
Akellyirl
1

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

Sie können ein RC-Filter für die A1,2,3-Signale 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 10 kOhm x 10 nF = 100 us

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

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

Ändern Sie den Wert "0.99", um die Zeitkonstante dieses Digitalfilters zu ändern.

akellyirl
quelle
1
Achten Sie auf Aliasing, wenn Sie es im Code tun.
Andy aka
Aliasing ist nicht unbedingt ein Problem. Wir alle wissen, dass für die Rekonstruktion eines Signals die Abtastrate mindestens doppelt so hoch sein muss wie die höchste Frequenz. Wenn das Signal jedoch bandbegrenzt ist, müssen Sie nur die doppelte Bandbreite abtasten . Dies nennt man Unterabtastung. Da das Signal vermutlich eine niedrige Frequenz hat, weil es ein Heizkissen antreibt, sollten vernünftige Abtastraten im Bereich von 100 bis 1000 SPS in Ordnung sein. Siehe: ni.com/newsletter/50078/de
akellyirl
Wenn Sie Unterabtastung verwenden, sollten Sie sicherstellen, dass die PWM-Rate und die Abtastrate miteinander übereinstimmen.
Akellyirl
Genau meine Gedanken - wenn über ADC gemessen und PWM in derselben MCU generiert wird, besteht möglicherweise die Tendenz, dass beide zeitlich begrenzt sind.
Andy aka
Das Signal hat eine PWM-Frequenz und keine niedrige Frequenz. Wenn es sich um einen niedrigen Wert für frq handelt, ist es wahrscheinlich weniger ressourcenintensiv, einfach über einen Zeitraum hinweg und im Durchschnitt zu arbeiten, als Gleitkomma-Mathematik auf diese Weise zu verwenden.
Scott Seidman