PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Spannung regeln mit ADuc7026



tnightlife
03.05.2015, 15:31
Hallo,

ich bin neu hier und erhoffe durch eure Unterstützung etwas in die Materie uC Programmierung rein zu kommen.

Im Rahmen meiner Bachelorarbeit muss ich auch mit einem uC arbeiten, um eine Regelung und die CAN Schnittstelle des Boards zu realisieren.
Zuerst will ich mich mit der Regelung beschäftigen.

Das Board ist soweit fertig und tut auch erstmal das, was es soll. (Bis auf die Regelung der Ausgangsspannung und die CAN Kommunikation)

Es soll die Eingangsspannung (ca. 60V DC) auf ca. 14V regeln, um damit eine herkömmliche Autobatterie laden zu können (IU Ladeverfahren).
Dies wird galvanisch getrennt mit einem Vollbrücken Gegentaktwandler gemacht. Auf der Primärseite werden 4 Mosfets (über Treiber) mit 2 PWM Signalen gesteuert.
Das ganze läuft derzeit ungeregelt. Bei ca. 45V am Eingang habe ich ca. 14V am Ausgang.

Die Batteriespannung wird als PWM Signal (ca. 120Hz) an den uC geschickt. Dies geschieht über einen Komparator, der die Batteriespannung mit einem erzeugten Dreiecksignal vergleich. Das wird dann über einen Optokoppler galvanisch getrennt an einen Eingang des uC gelegt.
Der Tastgrad dieses (PWM-)Signals stellt somit die Spannung der Batterie dar.

Da wären wir auch dort angekommen, wo ich nicht mehr weiterkomme ;D.

Verwendet wird ein ADuC 7026. Das PWM Signal der Batterie geht (laut Layout) an 42 P2.0/SPM9/PLAO[5]/^CONVstart.

Das was ich Anhand der Beschreibung im Datenbuch des uC verstehe ist, dass man dem Port Pin vorgeben kann, wie es sich verhalten soll (P2.0/SPM9/PLAO[5]/^CONVstart) bzw. wozu das Signal am Eingang dieses Port Pins verwendet werden soll.

Wie müsste ich diesen Pin für mein Vorhaben konfigurieren und wie kann ich diesen Wert dann ablesen bzw. mit welchem Kommando/Funktion/Variable?

Wie ermittelt man dann Anhand der Information aus der "Variable" welchen Tastgrad ich habe?

Das wären erstmal meine Fragen. Im nächsten Schritt würde ich mit diesen Informationen versuchen das PWM Signal, welches ich an die Mosfets gebe in Abhängigkeit des PWM Signals am Eingang zu regeln.

Danke

durchgebrannt
13.05.2015, 16:41
Hi,

Für dein Problem gibt es mehrere Ansätzen. Entweder es gibt ein Hardwaremodul, welches die Aufgabe übernehmen kann oder aber du musst die Erfassung des Tastverhätnisses vollständig in Software oder in Kombination mit einem Hardware-Modul ausführen.
Dafür gilt es natürlich erstmal das Datenblatt zu überprüfen: http://www.analog.com/media/en/technical-documentation/data-sheets/ADuC7019_20_21_22_24_25_26_27_28_29.pdf
Dort kannst du auch ermitteln, was die jeweiligen Bezeichnungen für den Pin bedeuten und ob das für deine Anwendung hilfreich ist. Letztendlich musst du den Weg zu deiner Lösung in deiner Arbeit sicherlich dokumentieren.
Für weitere Fragen stehe ich gerne zur Verfügung ;)
Gruß Jannis

tnightlife
14.05.2015, 13:51
Jannis, ich danke dir erstmal.

Also ich bin derzeit etwas weiter gekommen, eventuell könntest du mir bei meinen weiteren Hindernissen helfen.

Den Port Pin 2.0 werde ich als GPIO nutzen. Damit wäre klar, das ich mit den entsprechenden Registern den Port Pin 2.0 als Input und als GPIO konfigurieren muss.

Im nächsten Schritt geht es dann darum, den Tastgrad des PWM Signals (133 Hz) zu ermitteln, den ich an diesen Pin bekomme.
Dazu würde ich einen Timer nutzen (in diesem Fall den Timer1 (General Purpose Timer) des uC), um die Zeiten (Binär) zu ermitteln, in denen das Signal High und Low ist um daraus den Tastgrad bestimmen zu können.
Also will ich rein softwaretechnisch bestimmen, welchen Tastgrad ich habe.

Ich muss wohl in diesem Zusammenhang auch Interrupts nutzen. Also gleich 2 Dinge (Timer & Interrupt), wo ich nicht weiß wie ich vorgehen muss, damit es funktioniert. Hier könnte ich eben Hilfe gebrauchen.
Es kommen keine externen Interrupts in Frage, weil diese an diesem Port Pin nicht erfasst werden können.

Mein Timer 1 gibt mir folgende Möglichkeiten zur Konfiguration:
1: Teiler (Prescale) für die Quelltaktgeschwindigkeit
2: Das Format des Ergebnisses (Binär, h:min:sec)
3: Arbeiten im periodischen Modus
4: Ein und Ausschalten des Timer1
5: Einstellung zum hoch oder runterzählen
6: Die Quelle für die Taktgeschwindigkeit

Dann gibt es noch diese beiden Einstellungen, wo ich nicht weiß, ob die für mein Vorhaben von Interesse sein könnten:

7: Event select bit. Set by user to enable time capture of an event. Cleared by user to disable time capture of an event.
8: Event select range, 0 to 31. These events are as described in Table 160. All events are offset by two


Die Einstellungen sind nicht das Problem (bis auf 7 und 8, die ich erstmal disabled lasse). Auch das auslesen des aktuellen Werts ist über den entsprechenden Register kein Problem.
Anhand von Tutorials zu ganz anderen Mikrocontrollern versuche ich zu verstehen, wie ich das auf meinen uC und meine Problemstellung übertragen kann.

Also ich habe zu Beginn einfach den Register für die Interrupts genommen und dort eingestellt auf welchen Timer mein Interrupt Handler reagieren soll.

(GP_TIMER_BIT = 0x8;)

IRQEN = GP_TIMER_BIT;

Mein Interrupt Handler sieht wie folgt aus:

void IRQ_Handler (void) __irq
{

if (IRQSIG & GP_TIMER_BIT) // Interrupt über Timer 1 GB_Timer_Bit
{
....
....
T1CLRI = 1; // Timer1 interrupt löschen
}
}
An der Stelle habe ich Fragen:

a) War es das, damit ich meinen Timer nutzen kann oder muss da noch was beachtet werden?
b) Wie nutze ich das ganze jetzt bzw. wie gelange ich vom normalen Programmablauf (main) in den Interrupt?

Zu b: Ich verstehe nicht wie man bei einem Timer interrupt in das interrupt gelangt. Bei einem externen interrupt würde ich sagen, es gelangt in den interrupt, sobald am Eingang ein High Signal ansteht, doch bei dem Timer interrupt begreife ich das nicht.

Danke

durchgebrannt
15.05.2015, 20:57
Das klingt doch von der Herangehensweise schon mal sehr gut. Deine Einschätzung zu der Verwendung von Interrupts und des nicht Vorhandenseins eines Pin-Interruptes stimme ich zu. ;)
Wie du nun selber gesagt hast, gibt es am dem Pin keinen Interrupt. Auch das PLA (siehe Datenblatt) scheidet aus, da P2.0 da nur aus Ausgang vorgesehen ist. Ergo muss da ein anderer Weg gefunden werden, die Pegelveränderung am Pin mitzubekommen. Hier kommt der Timer ins Spiel.
Wie der Timer konfiguriert werden muss, ergibt sich aus der Anwendug des Timers. Aber soweit ist das Konzept ja noch nicht, das wird aber, der Weg ist richtig. ;)

Wie kommt man in den Interrupt?
Deine Beschreibung zum Pin ist natürlich absolut korrekt. Beim Timer ist der Sachverhalt zwar etwas komplexer aber an sich analog dazu. Der Timer ist nichts anderes, als ein Zähler, der ein Ende hat (2^16=65535). Ist dieser Punkt erreicht, läuft der Timer über und es wird ein Interrupt erzeugt, sofern dieser aktiviert ist.
Allgemein ist so, dass die Interrupts von der Hardware generiert werden und dann in den entsprechenden Handler gesprungen wird.

Hilft dir das insbesondere zu b) weiter?

Gruß Jannis

tnightlife
15.05.2015, 22:29
Wie kommt man in den Interrupt?
Deine Beschreibung zum Pin ist natürlich absolut korrekt. Beim Timer ist der Sachverhalt zwar etwas komplexer aber an sich analog dazu. Der Timer ist nichts anderes, als ein Zähler, der ein Ende hat (2^16=65535). Ist dieser Punkt erreicht, läuft der Timer über und es wird ein Interrupt erzeugt, sofern dieser aktiviert ist.
Allgemein ist so, dass die Interrupts von der Hardware generiert werden und dann in den entsprechenden Handler gesprungen wird.

Hilft dir das insbesondere zu b) weiter?

Gruß Jannis

Das verwirrt mich etwas ;D. Im Grunde gesehen muss ich doch eine if-Abfrage machen und nach dem Zustand des Ports fragen. Wenn dieser den Zustand ändert, muss ich den Zählerstand auf Null setzen, bei der nächsten Zustandsänderung muss ich den Zählerstand speichern, bei erneuter Änderung des Eingangs erneut Zählerstand speichern (eine Periode durchlaufen) und zurück setzen, damit ich die nächste Periode erfassen kann.

In diesem Fall würde ich doch nie ein Interrupt auslösen, wenn dieser nur bei Überlauf ausgelöst wird, da es sehr wahrscheinlich nicht so hoch zählen wird? Oder irre ich mich da?

Ich meine ein Interrupt wird mir in diesem Fall nichts bringen. Ich will ja den Zählerstand immer bei Zustandsänderung ermitteln und bei Ende der Periode wieder zurück setzen.
Ist meine Herangehensweise falsch? Müsste ich das anders lösen?

durchgebrannt
16.05.2015, 08:28
Bei dem von dir vorgeschlagenen Verfahren, das sicher funktionieren würde, gibt es einen Haken.
Pollst (dauerhaftes immer sich wiederholende Abfrage) auf den Pegel des Pins, hast du keine Prozessortakte mehr frei, um noch das CAN unterzubringen oder andere Aufgaben zu erledigen. Jetzt könnte man die Abfrage natürlich auch in eine große Schleife mit rein tun, die dann die anderen Aufgaben mit abarbeitet, dann ist aber der Zeitpunkt, wann der Pin überprüft wird, nicht mehr eindeutig.

----> in dieser Anwendung taugt das Konzept nicht.
Anhaltspunkte, was dein Konzept können sollte:
-Timerfunktion kommt drin vor
-Der Überlaufinterrupt kommt drin vor
-Die ISR(Interrupt Service Routine) enthält kein Polling

Gruß Jannis

PICture
16.05.2015, 09:30
Hallo!

Das muss ich zustimmen, weil das einzige was paralell läuft, sind Timer und CPU. Paralelles Laufen von mehreren Tasks ist nur auf CPUs mit mehreren Kernen möglich. Sonst muss man Prioritäten setzen und in CPU alles nacheinander verarbeiten.

Ich würde empfehlen vor echten Projekten mit einfachen 8- bzw. 16-bittigen µC die Grundlagen der Programmierung üben, weil mit 32-bittigen µCs es schweriger zu anfangen ist ._.

durchgebrannt
16.05.2015, 10:15
Der µC hat durchaus viele Module zu bieten, wie das PLA(Programmable Logic Array),die sind nur alle an dem Pin (P2.0) nicht verfügbar. Dem Designer des Boards könnte man in mancher Hinsicht gerne mal die Hand geben. Kein Capture-Mode möglich, PLA nicht einsetzbar, kein externer Interrupt auf dem Pin, das macht es nicht leichter:Haue
Dazu stand der Chip nicht zur Auswahl, was das nicht unbedingt leichter macht^^. An sich ist ein 32-Bitter nicht anders als ein 8-Bitter, man muss nur deutlich genauer lesen, um nicht von der Menge an Möglichkeiten erschlagen zu werden.

Gruß Jannis

tnightlife
19.05.2015, 08:51
Ich schaue mal wieweit mit dem von dir genannten Konzept komme. Komme die Tage auf jedenfall drauf zurück.

- - - Aktualisiert - - -

Ich stelle mir das ganze, grob, so vor.

In der while() Schleife wird das CAN abgearbeitet, worauf ich jetzt nicht weiter eingehe, weil ich erstmal nur die Regelung (nach dem IU-Ladeverfahren) realisieren möchte.

Per Interrupt gelange ich aus der while() Schleife in den Handler und führe dort eine Funktion aus, dessen Aufgabe die Erfassung des Tastgrades und die Regelung des Ausgangs ist.
Danach Timer zurück setzen und weiter mit der while() Schleife.

Muss nur noch in Erfahrung bringen, wie ich in dem Interrupt (in den ich per Timerüberlauf gelang) den Tastgrad bestimme.

durchgebrannt
19.05.2015, 14:17
Der Ansatz geht in die richtige Richtung, hat aber noch einen wesentlichen Haken: Die Frequenz deines Trägersignals, dessen Tastgrad zu bestimmen möchtest, liegt nach deiner Angabe bei 133Hz. Dein Prozessor läuft mit einer Frequenz im Bereich von mehreren Megahertz. Dementsprechend kannst du das nicht mit den vorher genannten Punkten vereinigen, wenn du in einer ISR das Tastverhätnis bestimmen möchtest.

Weiterhin halte ich es für nicht sinnvoll, die Aufgaben so strikt zu trennen. Nur mit der Erfassung bist du ja lange noch nicht fertig, die gemessenen Werte müssen noch in die Regelung mit eingerechnet werden. Dafür braucht es auch noch etwas Software, was sich aber an sich in Grenzen halten sollte, solange die Spannung nur konstant gehalten werden soll. Stichwort PID-Regler.

So langsam sollten alle Bausteine für ein brauchbares Konzept hier im Thread aufgetaucht sein. Nun muss mal das Studentenhirn angestrengt werden und daraus etwas passendes gestrickt werden. Auf deine Lösung bin ich gespannt ;)

Gruß Jannis

tnightlife
19.05.2015, 19:29
Der Ansatz geht in die richtige Richtung, hat aber noch einen wesentlichen Haken: Die Frequenz deines Trägersignals, dessen Tastgrad zu bestimmen möchtest, liegt nach deiner Angabe bei 133Hz. Dein Prozessor läuft mit einer Frequenz im Bereich von mehreren Megahertz. Dementsprechend kannst du das nicht mit den vorher genannten Punkten vereinigen, wenn du in einer ISR das Tastverhätnis bestimmen möchtest.

Weiterhin halte ich es für nicht sinnvoll, die Aufgaben so strikt zu trennen. Nur mit der Erfassung bist du ja lange noch nicht fertig, die gemessenen Werte müssen noch in die Regelung mit eingerechnet werden. Dafür braucht es auch noch etwas Software, was sich aber an sich in Grenzen halten sollte, solange die Spannung nur konstant gehalten werden soll. Stichwort PID-Regler.

So langsam sollten alle Bausteine für ein brauchbares Konzept hier im Thread aufgetaucht sein. Nun muss mal das Studentenhirn angestrengt werden und daraus etwas passendes gestrickt werden. Auf deine Lösung bin ich gespannt ;)

Gruß Jannis

An die Frequenz hatte ich schon gedacht. Seit deinem letzten (oder vorletzten) Post gehe ich mit meinen Gedanken schon in die Richtung, da du strikt auf Timerüberlauf und Timerinterrupt gedeutet hast.

Ich werde mich sicherlich melden.

Danke für deine Hilfestellungen und Zeit