Transistor Kennlinien Kurve in C++ Builder - pow, polybezier oder pixels?



  • Ja das Tut war schonmal hilfreich DANKE!!!

    Hab da auch noch ein Dos-geproggtes Prog, das die Werte für elliptische polynome Kurvenverläufe berechnet, nur schlau werd ich daraus nicht.
    Funktioniert zwar so weit, nur auf meine Aufgabe kann ichs wahr. nicht anwenden.
    heir mal die source:

    --------------------------------------------------------------------------------

    #include <iostream.h>
    #include <math.h>

    const int max = 100;

    // Basisklasse
    class Kurve
    {
    double xTab[max], yTab[max]; // Tabellen fuer x- und y-Werte
    public:
    int n; // Anzahl der Punkte
    Kurve () {} // Standard-Konstruktor
    virtual double x(double) =0; // Dummy-Funktion fuer x-Koordinate
    virtual double y(double) =0; // Dummy-Funktion fuer y-Koordinate
    void Berechnen (int,double,double); // Deklarationen fuer die
    void Ausdrucken (); // Berechnung und Ausgabe einer Wertetabelle
    };

    void Kurve::Berechnen (int Punkte, double von, double bis)
    {
    double dt,t; // Schrittweite und Parameter (von..bis)
    if (Punkte > max)
    {
    Punkte = max;
    cout << "Warnung, Punkteanzahl auf " << max << " reduziert!" << endl;
    }
    n = Punkte; // Klassenkomponente definieren
    t = von; // Parameter
    dt = (bis-von)/(n-1); // Schrittweite berechnen
    for (int i=0; i<n; i++, t+=dt) // Wertetabelle berechnen
    xTab[i] = x(t), yTab[i] = y(t);
    }

    void Kurve::Ausdrucken ()
    {
    // Voreinstellungen fuer die Zahlausgabe, damit die Tabellen schoener aussehen;
    // zusaetzlich muss bei jeder Ausgabe cout.width(n) aufgerufen werden,
    // damit positives Vorzeichen als Leerzeichen erscheint (andernfalls wird es weggelassen)
    cout.setf(ios::showpoint | ios::scientific); // Gleitpunktformat
    cout.precision(8); // mit 8 Stellen nach Punkt
    for (int i=0; i<n; i++)
    {
    cout.width(15);
    cout << xTab[i] << " ";
    cout.width(15);
    cout << yTab[i] << endl;
    }
    }

    // =================================================================
    // abgeleitete Klasse Ellipse
    class Ellipse: public Kurve
    {
    double a,b; // Halbachsen
    public:
    Ellipse (double a0, double b0) { a=a0; b=b0; } // Konstruktor
    virtual double x(double t) { return a * cos(t); }
    virtual double y(double t) { return b * sin(t); }
    };

    // =================================================================
    // abgeleitete Klasse Polynom
    class Polynom: public Kurve
    {
    double a0,a1,a2,a3; // Koeffizienten, max. 3-ter Grad
    public:
    Polynom (double b0=0,double b1=0,double b2=0,double b3=0)
    { a0=b0; a1=b1; a2=b2; a3=b3; } // Konstruktor
    virtual double x(double t) { return t; }
    virtual double y(double t)
    { return ((a3*t+a2)*t+a1)*t+a0; }
    };

    // =================================================================
    // Hauptprogramm
    int main ()
    {
    cout << "Ellipse:" << endl;
    Ellipse ell(5,2);
    ell.Berechnen(10,0,6.2832); // 10 Punkte, 0 bis 2 pi
    ell.Ausdrucken();

    cout << endl << "Polynom: " << endl;
    Polynom pol(-5,1,1); // x*x + x -5
    pol.Berechnen(11,-5,5); // 11 Punkte, -5 bis 5
    pol.Ausdrucken();

    return 0;
    }

    --------------------------------------------------------------------------------
    Die Formel zur Berechnung ist für IC (ids)

    idsw = b*((ugsw-uthw)*udsw-((udsw*udsw)/2));

    wobei ugsw = UGS (ube)
    und udsw = UDS (uce)
    und uthw = UTH (schwellwertspannung)
    b = verstärkungsfaktor
    idsw = IC (kennlinie der stromwerte - diese Kurve soll gezeichnet werden)



  • Hallo

    irgendwie verstehe ich dein Problem nicht. Du hast deine Formeln, du hast die Darstellungsmöglichkeiten von Canvas. Warum setzt du das denn nicht so um?

    bis bald
    akari



  • hallo

    ja hmm, ich weiß nicht wie ich das den canvas methoden umsetzen kann.

    ich möchte eine wertetabelle machen, die für jeden punkt (der ja immer unterschiedlich ist) werte für x (= uce) und y (= ic) ausrechnen lassen.

    Diese Punkte sollen dann aneinander gereit gezeichnet werden (also logischerweise mit der methode "pixels" von canvas), das ergibt ja dann automatisch die kennlinie.

    ich weiß nun nicht wie ich das anstellen soll?
    das proggen der wertetabelle ist mir ehrlich gesagt ein rätsel, sowie die übergabe der einzelnen werte an "Canvas pixels".

    ne gerade zeichne ich ja so:

    for (int i = 10; i <= 200; i++)
    PaintBox1->Canvas->Pixels[i][10] = clRed;

    nun müsste ich ja [i] jedesmal den neu errechneten wert von x (= uce) zuweisen, damit da dann der punkt an einer andren stelle gezeichnet wird. nur wie?

    danke 🙂



  • Hallo

    nun müsste ich ja [i] jedesmal den neu errechneten wert

    nein, das i bleibt genau so wie du es hast, du mußt den y-Wert (bei dir 10) immer neu berechnen.

    Jetzt brauchst du einen Maßstab Pixel/Meßwert. Zum Beispiel 1 Pixel entsprechen 5 V (wenn da irgendwo Volt ist). Dann kannst du vom linken Pixel anfangen, indem du den niedrigsten möglichen Ausgangswert in deine Formel einsetzt, also

    x = uce(0 * 5); // Pixel mal Maßstab
    

    dann kommt der nächste Pixel

    x = uce(1 * 5); // Pixel mal Maßstab
    

    das ganze natürlich in einer Schleife bis zum letzten möglichen Pixel.

    Das Ergebnis deiner Rechnung mußt du gegebenfalls wieder mit einem passenden Maßstab verrechnen, um ihn dann anzeigen zu können.

    bis bald
    akari



  • Hi, habe hier mal eine Methode mit einem TChart:

    float UTH = 1;         //Pinch-Off-Spannung
       float beta = 1;        //Transistor-Verstärkung
       float Step = 0.01;     //Berechnungsschritte 
       float ID;
       float UGS = 3;
       Chart->BottomAxis->Automatic = false;
       Chart->BottomAxis->Minimum = 0;
       Chart->BottomAxis->Maximum = 10;
       Chart->LeftAxis->Automatic = false;
       Chart->LeftAxis->Minimum = 0;
       Chart->LeftAxis->Maximum = 4;
       for(float UDS = 0; UDS<=Chart->BottomAxis->Maximum; UDS+=Step)
       {
          if(UDS < UGS-UTH)                              //Triodenbereich
          {
             ID = beta*((UGS-UTH)*UDS-(pow(UDS,2)/2));
          }
          else                                           //Sättigungsbereich
          {
             ID = (beta/2)*pow(UGS-UTH,2);
          }
          Series1->AddXY(UDS,ID);
       }
    


  • ui, das schaut aber kompliziert aus! hab mal activex charts eingefügt und ne menge einstellungen entdeckt.
    ich glaub, dass wäre zu kompli.
    aber danke 🙂

    mit tchart kenn ich mich gar nicht aus



  • Du brauchst blos ein TChart auf die Form zu packen, dann einen neue Serie hinzufüngen und das wars dann auch schon.



  • JUHUHUU es klappt. ich denke jetzt weiß ich den rest auch weiter!
    Vielen Dank an euch beide!!!!
    Habt mir echt geholfen!

    Viele Grüße



  • Eigentlich trau ich mich gar nicht nochmal zu fragen, nur ich verzweifel langsam. Die Formeln zur Berechnung im vorherigen Teil dieses Beitrags sind nur für FET`s also MOS Feldeffekt Transistoren. Genau das bemerkte ich erst als ich fast alles fertig hatte *rotwerd*

    Kann mir jemand sagen welche Formeln ich für einen ganz normalen bipolaren Transistor nehmen soll und wie ich das in meine Schleife einbaue:

    die sieht ja so aus mit TChart:

    float UTH = 1;         //Pinch-Off-Spannung
       float beta = 1;        //Transistor-Verstärkung
       float Step = 0.01;     //Berechnungsschritte
       float ID;
       float UGS = 3;
       Chart->BottomAxis->Automatic = false;
       Chart->BottomAxis->Minimum = 0;
       Chart->BottomAxis->Maximum = 10;
       Chart->LeftAxis->Automatic = false;
       Chart->LeftAxis->Minimum = 0;
       Chart->LeftAxis->Maximum = 4;
       for(float UDS = 0; UDS<=Chart->BottomAxis->Maximum; UDS+=Step)
       {
          if(UDS < UGS-UTH)                              //Triodenbereich
          {
           //-> FET Formel, die ist ja falsch ID = beta*((UGS-UTH)*UDS-(pow(UDS,2)/2));
          }
          else                                           //Sättigungsbereich
          {
            //-> ID = (beta/2)*pow(UGS-UTH,2);
          }
          Series1->AddXY(UDS,ID);
       }
    


  • Für den Sättigungsbereich gilt:

    Ic = Is*exp(UBE/UT)*(1+UCE/UA)

    wobei Is: Sperrsättigungsstrom
    UA: Early-Spannung
    UT: Temperaturspannung (vgl. Diode) bei 20°C 26mV

    falls du lieber Ib anstelle von UBE haben möchtest: Ib = Is/B0*exp(UBE/UT)
    B0: extraploierte Stromverstärkung für UCE = 0V

    Die Formel für den Übergangsbereich weiss ich leider auch nicht, die müsste ähnlich wie jene der Diode sein.
    Wenn du dein Projekt für einen Bipolaren brauchst, wieso lieferst du dann ein Beispielbild eine n-Kanal MOS-FET?



  • calibo-nostra schrieb:

    Eigentlich trau ich mich gar nicht nochmal zu fragen, nur ich verzweifel langsam. Die Formeln zur Berechnung im vorherigen Teil dieses Beitrags sind nur für FET`s also MOS Feldeffekt Transistoren. Genau das bemerkte ich erst als ich fast alles fertig hatte *rotwerd*

    Kann mir jemand sagen welche Formeln ich für einen ganz normalen bipolaren Transistor nehmen soll und wie ich das in meine Schleife einbaue:

    das ist mal ein richtig tolles Beispiel wie eine Projektarbeit NICHT ablaufen sollte. Du schreibst eine Software und hast absolut kein Hintergrundwissen über das was Du da machst. Ich meine nicht das Programmieren, sondern die Elektronik. Vielleicht solltest Du Dich zuerst damit befassen, wenn Du das kapiert hast Dich erst dann ans Programmieren machen? Was bringen Dir die vorgekauten Lösungen hier wenn Du letztendlich nichts kapiert hast?
    Zur Erinnerung: eine Projektarbeit dient dazu, sich mit einem Problem zu befassen, Problemlösungen selbstständig(!) zu erarbeiten(!), kurz: etwas daraus zu lernen. Dieses Wissen das Du Dir dann daraus erwirbst wirst Du nicht so schnell vergessen....die vorgekauten Lösungen bringen Dir sogesehen gar nichts.



  • Das ich Hintergrundwissen haben muss ist mir klar, das habe ich auch, nur keines welches mein Problem lösen könnte, da die Elektrotechnik sich nicht mit dem Zeichnen von Kennlinien eines Transistors auseinandersetz. Ich kenne die Elektrotechnik für Transistoren nur, wie sie sich lediglich nur damit befasst, Arbeitspunkte zu bestimmen und widerstände, spannungen und ströme auszurechnen, nicht aber wie nun eine stromsteuerkennlinie gezeichnet wird, und wie das eine Funktion ebschreibt, da alles irgendwie mit allem zusammenhängt.

    Danke aber für diesen Kommentar, ich denke jetzt werde ich mich mit mehr Gewissen auf mein Projekt stürzen!

    Danke auch wedmer! -- Diese Mos-FET Formel habe ich aus einem Tutorial, aber ist eben genau das falsche gewesen, wollte ja bipolare Trans-Kenn-Linien zeichnen!

    Danke


Anmelden zum Antworten