Wir steuern den Generator oder den Kampf gegen den ADC im STM32F030

Bei der STM32F030-Familie hat es historisch gesehen für mich irgendwie nicht geklappt. Vor ungefähr 5 Jahren habe ich versucht, mit ihnen zu arbeiten, und war lange Zeit überrascht über die ungeschickte Arbeit der meisten Peripheriegeräte und habe dann auf ihnen gewertet. Und neulich musste ich immer noch zu dieser Serie zurückkehren. Es war notwendig, die konstante Spannung an einer Bleibatterie (oder die Montage von bis zu 4 Teilen in Serie) von 8 bis 60 V mit einer Genauigkeit von nicht schlechter als ± 0,1 V bei einer niedrigen Abruffrequenz für minimales Geld zu messen.

Die Lösung des "frontalen" Problems ermöglichte es, die Spannung nur dann genau zu messen, wenn der Wert des ADC-Eingangs mehr als 1,5 ... 1,6 V beträgt, dh nur in der zweiten Hälfte des Bereichs, was für mich 30 ... 60 V anstelle der erforderlichen 8 ... bedeutete. .60V. Das Hauptproblem lag im Bereich von 0 bis 1,6 V, alles sah so aus, als ob mein Spannungsteiler „schwebend“ war oder die Referenzspannung für den ADC (V ref ) extrem instabil war.

Es war notwendig, das Problem schnell zu lösen, wenn auch nicht auf eleganteste Weise, aber zumindest ohne offensichtliche Krücken. Dazu war es zunächst erforderlich, das Problem zu untersuchen und zu verstehen, woher die „Beine“ wachsen, und dieses Problem dann zu beseitigen. Wenn es nicht funktioniert, umgehen Sie es zumindest, um schließlich ein funktionierendes Gerät zu erhalten und es an den Kunden zu senden.



Essenz der Aufgabe


Im Allgemeinen habe ich lange versucht, eine solche Kleinigkeit nicht in Angriff zu nehmen, aber dann wandte sich ein Verwandter an mich und in Teilzeit ein guter Mensch, der auch an Themen arbeitet, die mir nahe stehen - er sammelt irgendwo in der Region Moskau kleine SES. Ich wollte mich nicht weigern, und selbst in diesem Moment schien mir diese Aufgabe „ein paar Stunden Eisen + ein paar Stunden Code“. Das Projekt in Altium Designer hat wirklich ein paar Stunden gedauert, aber der Kampf gegen den ADC wurde den ganzen Abend über ausgetragen, und ich habe beschlossen, Informationen auszutauschen, damit andere keine Zeit verschwenden.

Das Gerät selbst ist extrem einfach, der Algorithmus ist wie folgt:

  • Messen Sie die Spannung an der Baugruppe von 1 ... 4 in Reihe geschalteten Bleibatterien.
  • Wenn die Spannung unter dem "unteren Schwellenwert" liegt, schließen Sie das Relais und schalten Sie den Generator ein, der unsere Batterien auflädt.
  • Wenn die Spannung über die "untere Schwelle + Hysterese" steigt, dh die Batterien auf die eingestellte Schwelle geladen werden, schalten Sie den Generator aus.
  • Wenn die Spannung über der "oberen Schwelle" liegt, verbieten wir das Einschalten des Generators für alle Fälle.

Das ist alles! Beispiel: Es gibt eine 12-V-Batterie, von der der Wechselrichter gespeist wird. Wenn die Spannung unter den "unteren Schwellenwert" fällt, ist der Standardwert 10,2 V, und schalten Sie den Generator ein. Wenn die Spannung an der Batterie auf "untere Schwelle + Hysterese" angestiegen ist, schalten Sie sie aus. Standardmäßig ist die Hysterese auf 2 V eingestellt und wird benötigt, damit der Benzingenerator nicht abschaltet, sobald die Batterie leicht auf 10,3 V aufgeladen wird. Beim konstanten Ein- und Ausschalten stirbt der Generator einfach ab. Nun, nur für den Fall, Schutz: Wenn die Spannung an der Batterie über 14,4 V liegt, schalten Sie den Generator nicht genau ein.

Der Algorithmus ist einfach und unkompliziert. Außerdem musste ein kleines Menü erstellt werden, damit drei Variablen geändert werden konnten: „untere Schwelle“, „Hysterese“, „obere Schwelle“. Nichts kompliziertes, aber der Teufel steckt im Detail.

Anfänglich verwendete das Unternehmen, in dem der Verwandte arbeitet, ein chinesisches Gerät mit ähnlicher Funktionalität. Von den kleinen Nachteilen war es unmöglich, die Hysterese zu ändern, da für die Stromversorgung eine zusätzliche Quelle von 5 V und eine Messung von nur 30 V benötigt wurde, dh für 1 oder 2 Batterien. Von den großen Minuspunkten - das chinesische Gerät friert manchmal ein und startet neu, wenn der von ihm gesteuerte Benzingenerator gestartet wird. Das letzte "Merkmal" wurde nur der Grund für den Versuch, die chinesische Entscheidung aufzugeben.

Sie wollten all diese Nachteile von mir beseitigen und dass der Preis des Geräts dem der Chinesen entsprach, dh 10 US-Dollar. Die „teuflische Kleinigkeit“ in diesem Fall war, dass sie ein fertiges Gerät von mir für 10 USD in Chargen von nur 20 bis 30 Stück kaufen wollten, obwohl es stabil und oft genug war. Das heißt, ich musste das Gerät in einer kleinen Serie viel besser und sehr viel billiger machen als die Chinesen, ich muss auch in Zukunft Geld verdienen. Ja, ich war auch in den ersten 10 Minuten lustig, aber als ich diese Situation erkannte, sagte ich bereits "JA", das heißt, es gab kein Land jenseits der Wolga für mich ...

Eisenprobleme lösen


Wie ich oben geschrieben habe, ist das Hauptproblem der instabile Betrieb des Geräts während des Starts des Generators. Als Ergebnis wurde ein chinesisches Gerät mit Aliexpress zum Testen und Forschen gekauft. Der Hauptgrund für den „Abriss des Kopfes“ lag nicht im Generator, sondern im Relais :)) Zum Zeitpunkt des Umschaltens der Stromversorgung durchlief ein Impuls mit einer Amplitude von ca. 25 V den 3,3-V-Bus, was darauf hindeutete ... Die Störung ging auch an die Signalstromkreise. In der chinesischen Schaltung standen zur Bekämpfung eines solchen Problems LL4148-Dioden, die den Interferenzweg blockierten. Dies stellte sich als ausreichend heraus, damit das Gerät normal auf dem Tisch funktioniert, jedoch nicht in einem Haufen externer zusätzlicher Störungen wie einem Generator und anderen Geräten. Um das oben Beschriebene dauerhaft loszuwerden, entschied ich mich für die galvanische Trennung durch eine Reihe von "Optokopplern + Gleichstrom / Gleichstrom", wodurch der elektrische Kontakt und der Störungsweg zwischen der Steuerrelais-Spule und dem Rest des Stromkreises vollständig beseitigt wurden.



Eine Alternative zu dieser Lösung war die Verwendung von TVS-Schutzdioden zusammen mit einer Gleichtaktdrossel sowie die Komplikation des Stromversorgungsfilters. Aber warum so eine Kollektivfarm? Das Einsetzen von DC / DC ist einfacher, aber in der Praxis stellte sich heraus, dass es noch billiger war - das chinesische Modul Mornsun B0505S-1WR2 kostete mich 0,4 USD, die Kosten für eine Gleichtaktdrossel pro kleiner Charge etwa 0,32 USD.

Infolgedessen begann das Gerät nach einer solchen Entscheidung und Prototypentests als Kalaschnikow-Sturmgewehr zu arbeiten, und die Probleme beim Neustart waren verschwunden. Im Allgemeinen bin ich ein wenig überrascht, dass das Relais + ein bisschen der Generator immer noch gezwungen war, das stm-ku neu zu starten. Die chinesischen Entwickler haben im Prinzip alles gut gemacht: 10 kOhm + 0,1 uF zum Zurücksetzen, Blockieren von Kondensatoren für Strom, Ferritperlen, alles war, aber es stellte sich trotzdem als dasselbe heraus nicht genug.

Das zweite Minus der "Chinesen" war der Bedarf an zusätzlicher Energie, die anscheinend bei Gleichstrom / Gleichstrom eingespart wurde. Ich habe das Problem in der Stirn gelöst - ich habe das Eingangssignal direkt von einem Stecker mit Strom versorgt. Um dies zu tun, mussten Sie nur Gleichstrom / Gleichstrom einlegen, der mindestens 4 * 14,4 V, d. H. 57,6 V, verdaut. Meine Wahl fiel auf den LMR16010PDDAR. Erstens ist dies Texas und das war's. Zweitens schlugen die asiatischen Genossen vor, diesen Chip sehr billig zu tragen.

Der vorige Absatz hat das dritte Minus umfassend entschieden - die Fähigkeit, bis zu 4 Batterien in Reihe zu schalten. DC / DC verdaut leicht 60 V und versucht erst bei 72 ... 73 V auszubrennen, so dass das Maximum von 57,6 V für ihn definitiv nicht beängstigend ist. Dem Spannungsteiler ist es im Allgemeinen egal, wie viel sich am Eingang befindet, daher wurde alles mit minimalem Aufwand entschieden.

Wie dies alles umgesetzt wird, sehen Sie im Diagramm hier - PDF . Das Schema ist groß genug, deshalb habe ich es nicht mit einem Bild gefüllt. Übrigens können Sie im PDF-Format auch Abmessungen mit einer Leiterplatte sehen, aber es gibt nichts Übernatürliches.

Infolgedessen wurden Komponenten für 10 Geräte für die erste Testcharge bestellt, und nach der Montage stellte sich Folgendes heraus:



Es war nicht ohne Zwischenfälle - als ich die Komponente für das DC / DC-Modul erstellte, mischte ich die Beine 1 und 2 stellenweise, ich musste eine kleine Farm nehmen. Obwohl ich es bei nachfolgenden Boards sorgfältiger gemacht habe, damit es niemand bemerkte, blieb das Board auf dem Foto als Debugging-Tool für alle Fälle oder für Softwareverbesserungen bei mir, wenn der Kunde während des Tests etwas einfiel.

Kampf gegen ADC-Genauigkeit


Kommen wir nun zum Hauptteil des Artikels. Wie ich am Anfang des Artikels schrieb, stellte sich heraus, dass der F030 ADC ungenau war, dh bis zu einer Spannung von 30 ... 32 V am Eingang des Geräts schwebten die Messwerte mit einer Abweichung von bis zu 15 ... 20%, und dann verschwand der Fehler reibungslos. Eines hat mich gefreut - auf den ersten Blick waren die Abweichungen regelmäßig, was bedeutet, dass dies kein zufälliger Fehler ist und Sie ihn verfolgen und versuchen können, ihn zu korrigieren.

Nehmen wir etwas mehr Details zum Fehler ... Nach der Konvertierung sendet der ADC die Rohdaten an das DR- Register, das einen Wert von 0 bis 4095 enthält (2 12 ). Um diesen Wert in Spannung umzuwandeln, müssen Sie ihn mit dem Quantisierungsschritt multiplizieren. In meinem Fall betrug die Spannung am VDDA-Pin, von dem der ADC die Unterstützung erhält, 3,3072 V, und dementsprechend beträgt der Schritt 3,3072 V / 4096 = 0,000807 V, ich habe ihn auf 0,0008 gerundet. Um die Spannung am Eingang des Geräts zu erhalten, muss die erhaltene Spannung mit dem Koeffizienten des Spannungsteilers multipliziert werden. In meinem Fall beträgt der Widerstand im Oberarm 100 kOhm und im Unterarm 4,7 kOhm, was den Teiler 22,2765 ergibt. Basierend darauf wird die Spannung am Eingang des Geräts, dh die Batteriespannung, unter Verwendung der folgenden Formel ermittelt:

float voltageReference = 0.0008; float voltageDivider = 22.2765; adcVoltageResult = (float)adcData * voltageReference * voltageDivider; 

Es stellt sich heraus, dass nach dem Lesen der Daten ADC1-> DR diese in den Typ float konvertiert und einfach mit den Koeffizienten multipliziert werden, die Konstanten sind, und wir das Ergebnis in den üblichen Volt erhalten. In der Praxis stellte sich heraus, dass alles mit Genauigkeit sehr schlecht ist.

Ich erinnerte mich an Hanlons Rasiermesser und suchte nach dem Ort, an dem ich einen Fehler gemacht hatte. Zuerst habe ich die Spannung am Bein des VDDA überprüft, ich dachte, dass es irgendwie schwimmt und von der Eingangsspannung abhängt, zum Beispiel ist der LDO fehlerhaft. Mit einem Desktop-Multimeter bewaffnet, überwachte er die Spannung am VDDA und änderte die Eingangsspannung von 8 auf 60 V, während die Spannung am Bein des VDDA bei 3,3072 V lag. Nur die folgenden 2 Zeichen schwebten, was für ein 10-Cent-Linearmessgerät sehr gut ist.

Der nächste Ort für einen möglichen Fehler war der Spannungsteiler. Obwohl es mir seltsam erschien, dass die Widerstände von Bourns ± 0,1% schwebend sind, so dass die Daten einen Fehler von bis zu 20% aufweisen und dieser Fehler nicht linear ist. Ich habe das gleiche Experiment durchgeführt: Ich habe die Spannung nach dem Teiler mit einem Multimeter gemessen und die Eingangsspannung in Schritten von 0,5 V geändert. Infolgedessen war der Teilerkoeffizient ebenfalls fest auf 22,2768 festgelegt.

In diesem Moment wurde es interessant. Es gab nur eine Komponente, an der ich zweifeln konnte - den Operationsverstärker LMV611MFX. Dieser Operationsverstärker ist als Spannungsfolger enthalten. Die Spannung VOR und NACH war bis zu 4 Dezimalstellen gleich. Seltsam ... Nach dem Datenblatt ist es nicht schlecht und es ist der gleiche TI. Ich bezweifelte es, entschied mich aber, es zu überprüfen, weil Es ist dieser Opamp, der nie benutzt wurde. Nur für den Fall, mein Favorit und getestet in einem Haufen von OPA320-Projekten, die ich in den Spulen habe, an seiner Stelle verlötet und er zeigte das gleiche Ergebnis.

Die letzte Komponente blieb - MK, nämlich sein ADC. Im Laufe der Jahre, in denen ich STM verwendet habe, bin ich es gewohnt, ihren Produkten zu vertrauen, zumal ich nur die Originale nehme, also dachte ich zuletzt bei MK. Das erste, was ich dachte, war, dass ich vergessen habe zu kalibrieren oder es falsch gemacht habe. Im Referenzhandbuch nützlich, forderten sie nicht nur, den ADC durch Schreiben von Null in das ADEN- Bit zu reduzieren , sondern auch 1 auf das ADDIS- Bit und 0 auf das DMAEN- Bit zu setzen. Die letzten beiden Schritte wurden nicht ausgeführt. Normalerweise habe ich den ADC heruntergefahren und alles funktioniert einwandfrei. Daher habe ich einen Code mit Kalibrierung korrigiert:

  /* disable ADC */ if (ADC1->CR & ADC_CR_ADEN) { ADC1->CR |= ADC_CR_ADDIS; while (ADC1->CR & ADC_CR_ADEN) {} } /* calibrate ADC */ ADC1->CR |= ADC_CR_ADCAL; while(ADC1->CR & ADC_CR_ADCAL) {} /* reset configuration */ ADC1->CFGR2 = 0; /* enable device */ ADC1->CR = ADC_CR_ADEN; while(!(ADC1->ISR & ADC_ISR_ADRDY)); 

Leider hat es nicht geholfen und beschlossen, das folgende Experiment durchzuführen ... Ich habe die Koeffizienten bereits überprüft und sie sind zu 100% korrekt. Daher werde ich die Spannung von der Labornetzversorgung an den Eingang anlegen, sie ändern und die Rohergebnisse der ADC-Messung auf einem Sieben-Segment-Indikator anzeigen und sie dann mit dem vergleichen, was sollte dort zu sein mit dem, was du wirklich gemessen hast. Als Ergebnis erhielt ich die folgenden Ergebnisse:



Wie Sie sehen können, weist der theoretische Graph eine ausgezeichnete Linearität auf, weil nicht an Eisen befestigt. Das auf realen Daten basierende Diagramm ist ebenfalls nahezu linear mit minimalen Abweichungen. Tatsächlich kann der Graph mit realen Daten durch parallele Übertragung auf eine bestimmte Konstante mit dem theoretischen Graph kombiniert werden. In der Sprache der Elektronik hat der ADC einen Offset!

Anhand der Daten, auf denen die Diagramme erstellt wurden, stellte ich fest, dass der ADC an verschiedenen Punkten einen Versatz von 71 ... 73 Schritten aufweist. Das war das Problem, und ich dachte „Nichtlinearität“, weil die Verschiebung von 71 Schritten bei 10 V etwa 14% und bei 30 V bereits 4% beträgt. Das heißt, wenn Sie ein Diagramm mit Abweichungen in% erstellen, hat die Abhängigkeit eine exponentielle Form, aber ein solches Diagramm ist nicht interessant.

Es wurde beschlossen, zur Verdeutlichung der Ergebnisse eine weitere Variable in die Formel einzufügen, die meine Werte nach oben verschiebt und die folgende Form hat:

 uint16_t offsetVoltage = 72; float voltageReference = 0.0008; float voltageDivider = 22.2765; adcVoltageResult = ((float)(adcData+offsetVoltage))*voltageReference*voltageDivider; 

Nach diesen einfachen Manipulationen begann mein Gerät, die Spannung genau zu messen, und die Daten schwebten nicht mehr. Bis zu diesem Moment lag es bei 72 * 0,0008 V * 22,2768 = 1,28 V , was bei der Steuerung einer Batterie sehr kritisch ist. Der Bleibatterie explodiert zwar nicht wie Li-Ion, stürzt aber dennoch schnell ab, insbesondere wenn er ständig nicht auf 10,2 V, sondern auf 8,92 V entladen wird.

Hier ist eine so kleine Geschichte über ein kleines Stück Eisen. Ich hoffe, jemand findet dieses Material nützlich oder zumindest nur interessant zu lesen. Sei vorsichtig mit all diesen ADCs und anderen fiesen Dingen :))

UPD olartamonov bittet sehr eifrig, die Leute nicht zu täuschen und den Kalibrierungscode aus dem Referenzhandbuch zu verwenden - nahm die Änderung mit Vergnügen vor. Leider hat dies in meinem Fall die Situation nicht verändert und die Verschiebung ging nirgendwo hin. Wahrscheinlich liegt das Problem im Chip selbst. wie vom State Department angewiesen warf gefälschte Produkte

Wettbewerb


Unter PCBway- Genossen findet ein Wettbewerb zwischen technischen Projekten statt, an dem jeder teilnehmen kann. Die Regeln sind einfach. Leiterplatten für Ihr Projekt sind kostenlos. Und vor allem Preise! Dies sind einige Grünbücher mit amerikanischen Herren über Ihr Paypal + virtuelle Währung, für die Sie Leiterplatten bestellen können + Ehre und Respekt + die Möglichkeit, irgendwo außerhalb der GUS ein Stellenangebot zu erhalten :)) Ich empfehle insbesondere Studenten zur Teilnahme, das technische Niveau ist dort nicht zu hoch Obwohl es aus der Erfahrung vergangener Wettbewerbe sehr starke Projekte gibt, kann eine „starke“ DIY-Box leicht in die Gewinner gelangen!

Source: https://habr.com/ru/post/de448202/


All Articles