06.08.2013, 06:55 PM
Mit angeschlossenem Trafen wird deutlich besser
Mein erstes Gedankenkonzept sah vor eine heruntergeiteilte Netzspannung als Referenz zu sampeln.
Das ist Murks (2x AD-Wandeln dauert zu lange). Ich will versuchen mit einem µC-internen Referenzsignal und einer Synchronisation auszukommen.
Dazu habe ich mir einen CPU-schonenden, periodenbasieren Regler überlegt, der theoretisch jede (periodische) Signalform perfekt stellen kann - auch bei nichtlinearer Strecke.
Die PWM ist so eingestellt, dass TOP=1023 (-> ca. 14kHz PWM bei 14MHz CPU-Takt), der ADC liefert Werte von 0...1023, wobei 512=0A gilt. -> Ich brauche nicht umrechnen und habe immerhin volle 10bit.
Für den Regler habe ich 2 Arrays à 200 Werten und zwei Variablen
int soll[200]; //hier ist eine Periode der gewünschten Funktion drin - 200x100µs = 20ms
int err[200]; // am anfang alles 0
int i = 0;
int ist = 0;
Ich gebe zu Beginn soll[0] aus und starte dann den Regelinterrupt
void regelinterrupt(void){ //alle 100us
-Aktuellen Istwert sampeln (ca. 60us) und in "ist" speichern
-err[i] = soll[i] - ist
-i++
-gebe soll[i] + err[i] aus
-wenn i=199 dann i=0
}
WENN das klappen sollte, dann kann ich evt. wirklich nur mit einer Synchronisation arbeiten...
Mein erstes Gedankenkonzept sah vor eine heruntergeiteilte Netzspannung als Referenz zu sampeln.
Das ist Murks (2x AD-Wandeln dauert zu lange). Ich will versuchen mit einem µC-internen Referenzsignal und einer Synchronisation auszukommen.
Dazu habe ich mir einen CPU-schonenden, periodenbasieren Regler überlegt, der theoretisch jede (periodische) Signalform perfekt stellen kann - auch bei nichtlinearer Strecke.
Die PWM ist so eingestellt, dass TOP=1023 (-> ca. 14kHz PWM bei 14MHz CPU-Takt), der ADC liefert Werte von 0...1023, wobei 512=0A gilt. -> Ich brauche nicht umrechnen und habe immerhin volle 10bit.
Für den Regler habe ich 2 Arrays à 200 Werten und zwei Variablen
int soll[200]; //hier ist eine Periode der gewünschten Funktion drin - 200x100µs = 20ms
int err[200]; // am anfang alles 0
int i = 0;
int ist = 0;
Ich gebe zu Beginn soll[0] aus und starte dann den Regelinterrupt
void regelinterrupt(void){ //alle 100us
-Aktuellen Istwert sampeln (ca. 60us) und in "ist" speichern
-err[i] = soll[i] - ist
-i++
-gebe soll[i] + err[i] aus
-wenn i=199 dann i=0
}
WENN das klappen sollte, dann kann ich evt. wirklich nur mit einer Synchronisation arbeiten...
Pffffffffft. "Da entwich das Vakuum" - Heinrich Physik, 1857.