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.
Antworten:
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)*y
für jede Probe, woalpha
der 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.
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 ...
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:
Führen Sie diese Schleife aus, um die Standardabweichung zu berechnen:
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 .
quelle
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:
Ändern Sie den Wert "0.99", um die Zeitkonstante dieses Digitalfilters zu ändern.
quelle