Programmierung von Reglern



  • Hallo an Alle!

    Ich bin richtig Anfänger mit C/C++ doch ich muss ein PT2-Glied(aperiodisch) mit einer der Sprache programmieren. Ich weiss überhaupt nicht wie ich anfangen soll. Wenn da jemand ist, der mir helfen könnte das wäre echt nett.
    Ich danke euch im voraus



  • Wo genau hängts denn?



  • genau ist alles das Problem. Zumindest wenn einen weg wie damit anfangen soll, wäre schon von Vorteil. Es git zum PT2-Glied ein Algorithmus, dass man schreiben muss und dann programieren halt.- Weiss net ob ich einbisschen klarer bin. Danke



  • Nein, wurde eher unklarer. Gib doch mal ein paar Details über die Aufgabenstellung preis. Hast du den Algorithmus schon vorliegen oder musst du den erst entwerfen? In was für eine Umgebung soll das ganze eingebettet werden, was für Schnittstellen gibt es?



  • zeitdiskret? zeitkontinuierlich?



  • bin noch gerade beim Entwerfen des Algorithmus und komme net ganz zu recht. Die Parameter sind auf jeden Fall T1 und T2. Eigenschaften der Aufgabestellung:
    Das Prog. muss
    - integrierbar auf ein Mikroprozessor(keine Präzision gegeben) ohne Speicherverwaltung
    -unterbrechbar und widereintrittsfähig
    -merfach aufrufbar mit unterschiedlichen Daten sein.
    Das ist alles was der Professor angegen hat. Das Modul ist c oder c++
    Das ist ein diskretes PT2-Glied



  • hallo, googlen nach pt2 glied c++ hilft manchmal, schau mal da: http://webber.physik.uni-freiburg.de/~hon/vorlss02/Literatur/Ingenieurswiss/Regelungstechnik/ProgrammiereRegelung.pdf
    2. vom algorithmus zum programm
    (die Unis schreiben nun schon von den Fachhochschulen ab, peinlich, peinlich 😮 )



  • #include <iostream>
    
    namespace filter
    {
    	class pt1
    	{
    		public:
    	    	pt1(double, double, double);
    	    	double tick(double);
    
    		private:
    			// a0,a1,b1 sind die Koeffizienten des diskreten PT1-Filters
    			double a0, a1, b1;
    			// delay speichert den Zustand des Filters
    			double delay;
    	};
    
    	// K  -> Verstärkung des Filters
    	// Ti -> Zeitkonstante "  "
    	// Ts -> Samplezeit (1/Samplerate)
    	pt1::pt1(double K, double Ti, double Ts)
    	{
    		// Koeffizientengleichungen ermittelt via bilinearer Transformation (2/Ts * (z-1)/z+1))
    		// Koeffizienten einmalig im Konstruktor bestimmen
    		a0 = (K*Ts) / (Ts + 2*Ti);
    		a1 = a0;
    		b1 = (Ts - 2*Ti) / (Ts + 2*Ti);
    
    		// Zustand des Filters auf 0 setzen
    		delay = 0.0;
    	}
    
    	// Für jedes neue Sample tick() ausführen
    	// in  -> Eingangssample
    	// out -> Ausgangssample
    	double pt1::tick(double in)
    	{
    		double out;
    
    		// Berechnung des Filters als "Transposed direct form II"
    		out = delay + a0*in;
    		delay = a1*in - b1*out;
    
    		return out;
    	}
    }
    
    int main()
    {
    	double sampletime = 0.1;
    
    	filter::pt1 PT1( 1.0, 1.0, sampletime );
    
    	// Betrachten der Sprungantwort, sollte bei Ti (hier 1.0) den Wert ~0.63 haben
    	for(int i=0; i<50; ++i)
    	{
    		std::cout << i*sampletime << " - " << PT1.tick(1.0) << '\n';
    	}
    
    	return 0;
    }
    

    Ja, mir war grad langweilig...


Anmelden zum Antworten