Forum: Mikrocontroller und Digitale Elektronik Regelproblem


von Tilo (Gast)


Lesenswert?

Hallo

Ich habe ein Regelproblem und hoffe, von euch ein paar Tips zu bekommen.

Ich will eine Pulswelle über die Änderung der Lichtabsorbtion 
detektieren.
Das ganze ist mit einem Reflexkoppler realisiert.
Die Intensität der Sende-LED kann über einen DAC gesteuert werden.
Als uC verwende ich einen ADuC7026.
Ich verwende +3,3V, Bezugsspanung für den Analogverstärker ist 1,65V.

Das Empfangssignal besteht aus der eigentlichen Pulswelle sowie einem
sehr großen Offset.

Mein erster Lösungsansatz sah so aus:
Offset mit einem Hochpass bei ca. 0,1Hz herausfiltern.
Verstärkung des Signal um 100 sowie Tiefpass bei 30Hz.
Das Ausgangssignal wird mit einem ADC gemessen.
Das ganze funktioniert halbwegs.

Leider benötige ich für den Hochpass verhältnismäßig große
Kondensatoren. Daher war meine Idee, den Offset mit dem uC zu filtern.
Dafür will ich das Signal mit einem weiteren ADC vor der Verstärkung
messen und je nach vorhandenem Offset die Intensität der Sende-LED
steuern. Ich muss das Signal nah an 1,65V halten, damit der 
nachgeschaltete
Verstärker mit V=100 nicht an Anschlag geht.

Hier ist der passende Code. Er wird über einen Timer jede ms Ausgeführt.
    // Regele Offset im Signal über SendeLeistung
    ADCCP = 0x02; //Verwende ADC2 zur Bezugspunktmessung
    ADCCON = 0x6A3; // Starte AD Wandlung
    while (!ADCSTA) {} // Warte bis AD Wandlung fertig ist.
    NullVolt = ADCDAT >> 16;

    const int PRegler=50;
    ADCCP = 0x01; //Verwende ADC1 zur Offsetmessung
    ADCCON = 0x6A3; // Starte AD Wandlung
    while (!ADCSTA) {} // Warte bis AD Wandlung fertig ist.
    int Offset = (ADCDAT >> 16) - NullVolt; // 0-Linie ca 1,65V ca. 2700
    if (Offset>PRegler || Offset<-PRegler) {
      LED += Offset;
    }
    else {
      if (Offset>15) LED++;
      else if (Offset<-15) { LED--;
      }
    }


Der Regler soll bei großen Abweichungen schnell und bei kleinen 
Abweichungen langsamer reagieren.
Bis "50" wird grob geregelt. Zwischen 15-50 ein wenig und unter 15 gar 
nicht.

Grob funktioniert das ganze Die Spannung liegt bei ca 1,65V wie gewollt.
Leider ist die Abweichung noch zu groß.
Meine Idee war, den Zielbereich zu verkleinern, also statt (Offset>15)
(Offset>7) oder noch weniger.
Spätestens dann wird mein Regler instabil und fängt an um 1,65V zu 
schwingen.

Daher wollte ich meinen Regler in einen PI-Regler umbauen.
[...]
OffsetIntegrated += Offset
[...]
LED += Offset + OffsetIntegrated/2;

Damit treffe ich die Spannung immer noch nicht richtig.

Hat jemand von euch eine Idee, wie es funktionieren könnte?

Vielen Dank, Tilo


Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.