Member
Beiträge: 3.915
Themen: 24
Registriert: Sep 2009
Entwarnung. Ein FET, und ein IR2010. Aber in der je anderen Halbbrücke
Pffffffffft. "Da entwich das Vakuum" - Heinrich Physik, 1857.
Member
Beiträge: 3.915
Themen: 24
Registriert: Sep 2009
Und ich sollte den Wandler mal degaussen - der kommt wie gesagt aus der Bastelkiste und kann etwas remanent sein.
Pffffffffft. "Da entwich das Vakuum" - Heinrich Physik, 1857.
Member
Beiträge: 3.915
Themen: 24
Registriert: Sep 2009
Zitat:Original geschrieben von woody
Läuft, aber Sinus wird nicht schön. Irgendwas sättigt, obwohl das nicht sein kann.
Die Drossel kann glaub scheinbar 6A (muss am Montag mal schauen wie das Teil genau heißt). Und irgendwie habe ich mir das schon so gedacht: sinus-PWM raus ergibt schon annähernd sinusförmigen Strom (solang nichts sättigt).
In real ist das aber - wie man z.b. am Anfang des Videos sehen kann aber überhaupt nicht so... (Wobei der Regler das dann gut in den Griff bekommt
)
Wobei ich auch immer nur den Ausgang vom Stromwandler angeschaut habe. Daher habe ich den irgendwie in Verdacht. Mal mit Shunt messen.
Pffffffffft. "Da entwich das Vakuum" - Heinrich Physik, 1857.
Member
Beiträge: 3.915
Themen: 24
Registriert: Sep 2009
So. Fet war doch keiner hinne nur Treiber. Hab ich aber keine mehr
Gleich mal ein paar bestellt.
Pffffffffft. "Da entwich das Vakuum" - Heinrich Physik, 1857.
Member
Beiträge: 3.915
Themen: 24
Registriert: Sep 2009
neee das kam wirklich durch das unbeabsichtigte Drehen. Davor lief die Kiste ja 1A.
Pffffffffft. "Da entwich das Vakuum" - Heinrich Physik, 1857.
Member
Beiträge: 3.915
Themen: 24
Registriert: Sep 2009
EDIT: Fehler korrigiert am 14.8. - 18:50
Ich habe heute (mit anderer Hardware) nochmal mit dem Regler experimentiert und finde das Teil recht interessant. Der bereits gezeigte Code war ja nur rudimentär und beinhaltete einen logischen Fehler beim Übergang vom letzten Ausgabewert zum ersten (ein Fehler wurde dabei nicht gespeichert).
Vielleicht kann das ja auch ein anderer brauchen.
Worum geht es genau:
- Digitaler Regler, der ein vorgegebenes Signal wiederholend (Periodisch) in eine (theoretisch beliebig) nichtlineare Strecke einregelt
- es werden mehrere Signalperioden benötigt, bis die maximale Genauigkeit erreicht ist
- Der Rechenaufwand ist denkbar minimal dafür der Speicheraufwand erhöht
- Eine bekannte oder Vermutete Phasendrehung in der Strecke kann vorgesteuert werden, indem die Fehlerwerte "verschoben" in das Fehlerarray geschrieben werden (s.u.)
- Mit einer Totzeit in der Strecke funktioniert der Regler in dieser Form nicht.
- Über das Fehler-Array misst "der" Regler quasi on-the-fly die Strecke aus - diese Streckeninformation kann man auch weiterverwenden
- Ist der Regler ausgeschaltet, wird das Sollsignal mit seiner einfachen Amplitude augegeben. Nach dem Anschalten des Reglers wird langsam die gewünschte Amplitude angefahren.
Funktion:
Code:
[navy]//2 Arrays der Länge n. Eines enthält eine Periode (Achtung, deckt sich hier nicht mit dem klassischen Periodenbegriff!) des Sollsignals (Bereich z.b. -1.0f...1.0f). Das andere nur Nullen.[/navy]
const float soll[n] = {-1.0, -0.99, ...}
float err[n] = {0.0, 0.0, ...}
[navy]//ein paar Steuervariablen (von "außen" modifizierbar)[/navy]
int reglerOn = 0;
float sollAmplitude = 1;
float kr = 0.2;
[navy]//Variablen für den Ablauf[/navy]
float error, ist;
int reglerOnOld = 0;
int firstrun = 1;
int i, j;
[navy]//Interrupt, der im immer gleichen Zeitabstand aufgerufen wird.[/navy]
void c_int(void){
...if(reglerOn == 1 && reglerOnOld == 0){....[navy]//Regler frisch angeschaltet, err[] nullen[/navy]
......for(j = 0; j < n; j++){
.........err[j] = 0.0;
......}
...}
...if(firstrun == 1){
......setOut(soll[0]);
...}else{
......ist = getIst();
......error = (sollAmplitude * soll[i]) - ist;
......err[i] += error * kr;
......if(i == n - 1){
.........i = -1;
......}
......i++;
......if(reglerOn == 1){
.........setOut(soll[i] + err[i]);
......}else{
.........setOut(soll[i]);
......}
...}
...firstrun = 0;
...reglerOnOld = reglerOn;
}
Pffffffffft. "Da entwich das Vakuum" - Heinrich Physik, 1857.
Member
Beiträge: 1.770
Themen: 25
Registriert: Jan 2010
Zitat:Original geschrieben von woody
Und ich sollte den Wandler mal degaussen - der kommt wie gesagt aus der Bastelkiste und kann etwas remanent sein.
Meiner Erfahrung nach ist das nicht nötig...Falls der Kern magnetisch in eine Richtung vormagnetisiert ist symmetriert sich das im Betrieb normal von selber aus, weil die Verluste mit steigender Magnetisierung mitsteigen. Das dürfte nicht lange dauern bis der Kern von selber in seine "magnetische Mitte" läuft.
Member
Beiträge: 3.915
Themen: 24
Registriert: Sep 2009
War nur so eine Idee. Oder eben doch die Drossel
Mal warten bis ich wieder Treiber habe.
Pffffffffft. "Da entwich das Vakuum" - Heinrich Physik, 1857.
Die Software krieg ich heute nicht mehr in die Birne. Bin etwas ausgebrannt.
Member
Beiträge: 3.915
Themen: 24
Registriert: Sep 2009
Sieh es dir morgen nochmal an. Die Schlichtheit ist das eigentlich schöne
Pffffffffft. "Da entwich das Vakuum" - Heinrich Physik, 1857.
Member
Beiträge: 3.915
Themen: 24
Registriert: Sep 2009
Au ja. Aber der Trick geht grade nicht.
Lies mal die Kommentare, dann wird das mit dan variablen klarerer. Was wie die ISR aufruft tut ja nix zur Sache.
Das mit dem Nullen kann man schon tun, die Laufzeit der ISR ist ansonsten unabhängig von Regler an oder aus gleich.
Auf dem AVR hatte ich das Teil mit int laufen. Geht auch prima. Dann macht man eben statt "* kr" eine Division durch eine Zweierpotenz. Es ging ja eher ums allgemeine Prinzip.
Pffffffffft. "Da entwich das Vakuum" - Heinrich Physik, 1857.
Ich hab die Kommentare mehrfach gelesen.
Die Bedingung "if(reglerOn == 1 && reglerOnOld == 0)" wird trotzdem niemals wahr. Glaub ich jedenfalls.
Member
Beiträge: 3.915
Themen: 24
Registriert: Sep 2009
Klar. Ich sag ja reglerOn ist von "außen" beeinflussbar. z.B. UART. Dann trifft das genau ein mal zu...
Pffffffffft. "Da entwich das Vakuum" - Heinrich Physik, 1857.
Member
Beiträge: 3.915
Themen: 24
Registriert: Sep 2009
Angenommen n=128 und ich wöllte -90° Phase (0...31=32; 128/4=32) vorsteuern, dann sähe das so aus:
Code:
[navy]//Interrupt, der im immer gleichen Zeitabstand aufgerufen wird.[/navy]
void c_int(void){
...if(reglerOn == 1 && reglerOnOld == 0){....[navy]//Regler frisch angeschaltet, err[] nullen[/navy]
......for(j = 0; j < n; j++){
.........err[j] = 0.0;
......}
...}
...if(firstrun == 1){
......setOut(soll[0]);
...}else{
......ist = getIst();
......error = (sollAmplitude * soll[i]) - ist;
......[navy][code]
......if((i - 31) < 0){
.........err[i - 31 + 128] += error * kr;
......}else{
.........err[i - 31] += error * kr;
......}
[/navy]
......
......
......if(i == 127){
.........i = -1;
......}
......i++;
......if(reglerOn == 1){
.........setOut(soll[i] + err[i]);
......}else{
.........setOut(soll[i]);
......}
...}
...firstrun = 0;
...reglerOnOld = reglerOn;
}
[/code]
anstatt dem einfachen
Code:
err[i] += error * kr;
Pffffffffft. "Da entwich das Vakuum" - Heinrich Physik, 1857.