• .
  • Willkommen im Forum!
  • Alles beim Alten...
  • Du hast kaum etwas verpasst ;-)
  • Jetzt noch sicherer mit HTTPS
Hallo, Gast! Anmelden Registrieren


Rückspeisen
#61
Entwarnung. Ein FET, und ein IR2010. Aber in der je anderen Halbbrücke lachend
Pffffffffft. "Da entwich das Vakuum" - Heinrich Physik, 1857.
 
#62
Mist! Sad
 
#63
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.
 
#64
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).

[Bild: 825_1376135329_vorst.png]

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 lachend )

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.
 
#65
So. Fet war doch keiner hinne nur Treiber. Hab ich aber keine mehr Rolleyes

Gleich mal ein paar bestellt.
Pffffffffft. "Da entwich das Vakuum" - Heinrich Physik, 1857.
 
#66
Zitat:Original geschrieben von woody
So. Fet war doch keiner hinne nur Treiber. Hab ich aber keine mehr Rolleyes
Gleich mal ein paar bestellt.

Zwei Treiber hops. Und kein FET? misstrau Hört sich nach Masseproblem an lachend
 
#67
neee das kam wirklich durch das unbeabsichtigte Drehen. Davor lief die Kiste ja 1A.
Pffffffffft. "Da entwich das Vakuum" - Heinrich Physik, 1857.
 
#68
In jedem Fall ist das hochgradig faszinierend, was Du hier leistest! ;respekt
 
#69
Zitat:Original geschrieben von woody
...der kommt wie gesagt aus der Bastelkiste und kann etwas remanent sein.

Heißt das nicht "renitent"? misstrau
 
#70
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.
 
#71
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.
 
#72
War nur so eine Idee. Oder eben doch die Drossel Rolleyes
Mal warten bis ich wieder Treiber habe.
Pffffffffft. "Da entwich das Vakuum" - Heinrich Physik, 1857.
 
#73
Die Software krieg ich heute nicht mehr in die Birne. Bin etwas ausgebrannt.
 
#74
Sieh es dir morgen nochmal an. Die Schlichtheit ist das eigentlich schöne Big Grin
Pffffffffft. "Da entwich das Vakuum" - Heinrich Physik, 1857.
 
#75
Ich seh da ein paar - eher syntaktische - Dinge, die ich nicht verstehe.....

[*] Bei dem letzten "fistrun = 0" hast Du Dich wohl von meinem gestrigen Pornoseitengebrabbel verwirren lassen.... Wink

[*] "//Regler frisch angeschaltet, err[] nullen" würde ich keinesfalls in die ISR reinsetzen. Ich nehme aber an, dass dieser Teil eh nie ausgeführt wird, da sowohl."reglerOnOld" als auch "reglerOn" ewig auf "0" bleiben. Glaub ich jedenfalls.


Vermutlich muss nur bei der Variablen-Initialisierung ein Tippfehler beseitigt werden, damit die ISR zum Leben erwacht.

Floating finde ich auf Kleinst-Controllern immer unschön.
 
#76
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.
 
#77
Ich hab die Kommentare mehrfach gelesen.

Die Bedingung "if(reglerOn == 1 && reglerOnOld == 0)" wird trotzdem niemals wahr. Glaub ich jedenfalls.
 
#78
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.
 
#79
Zitat:Original geschrieben von woody
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.

ich finde das schwer genial... misstrau
 
#80
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.