www.mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik Regelproblem


Autor: Tilo L. (katagia)
Datum:

Bewertung
0 lesenswert
nicht 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


Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.