Dies ist mein erster Beitrag. Ich bin ein Software-Typ, der versucht, Hardware zu machen, also sei sanft :)
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.
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.
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.
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)*y
für jede Probe, wo alpha
der Glättungsfaktor ist. Siehe Wikipedia für die Details.
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;
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...
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.
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 .
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.
alexan_e
Ricardo
ltj
alexan_e
Martin