Nouvelles:

Bienvenue au Forum de discussion Électro-Bidouilleur! Inscrivez-vous pour participer aux discussions!: 
https://forum.bidouilleur.ca/index.php?action=signup Les demandes d'inscription sont révisées quotidiennement.

Menu principal

Traceur de courbe de transistors du (tres) pauvre.

Démarré par bubblecat, Avril 09, 2016, 09:57:03 AM

« précédent - suivant »

eledtronik

hello

tien tien sympa ça sa m’intéresse pas mal, à  suivre donc je suivrais


Janpolanton

Bonjour,

Mes 1ers essais sur platine breadboard et envoi des 2 courbes  dent de scie (future tension Vce) et steps (futur Ib) sous libreoffice.
Mon AOP rail to rail étant un LM358 (pas mieux en réserve), le pwm est limité à  environ 770 /1023, soiit environ 3V7 au lieu de 5V.
Mais pour les essais, ce n'est pas bien gênant.
J'ai un fort taux d'ondulation sur les steps (mais ce sont des 10èmes de µA)  , il va falloir que je revoie ma cellule de filtrage ou que je lisse les valeurs lues en en faisant la moyenne par programmation.




Janpolanton

Bonjour à  tous,
J'ai un peu travaillé sur le code mais je ne suis pas expert en programmation, loin s'en faut  :-[

Voilà  où j'en suis rendu


const int nEchantillons = 126;//valeur de comptage max
int echantillon[nEchantillons];    // un tableau pour stocker les échantillons lus
int indice = 0;                    // indice de l'échantillon courant
float total = 0;                   // somme des échantillons mémorisés
float moyenne = 0;                 
float intensite = 0;
int tri =   5;   // Triangle   sur D5
   int vg = 3;   // Voltage step sur D3

   int j   = 0; //pente Vce

   int k = 0;   // steps Ib

   int slope = 4;//pente du triangle

int incomingByte; // variable de stockage des données entrantes
int comptage=0;// comptage du nombre d'échatillons
int bouclecomptage=0;// nombre de comptages
//int row = 0;// pour renvoi de colonnes à  LibreOffice
float tensionVce;
float tensionVb;
float intensiteIb;
   void setup()

{ Serial.begin(   9600);   
Serial.println("CLEARDATA");// Directives pour LibreOffice
Serial.println("LABEL,Time,Vce,Ib");// Directives pour LibreOffice
   pinMode( tri, OUTPUT);

   pinMode( vg,   OUTPUT);
for (int i = 0; i < nEchantillons; i++) {
    echantillon[i] = 0;
  }
} // setup

   void loop()
{
Serial.print("DATA,TIME,"); // Directives pour LibreOffice
   total = total - echantillon[indice];
{ if   (Serial.available() > 0);   

{ incomingByte = Serial.read();   

  int valeur0 = analogRead(A0);//Nbr de pas PWM Vce

// valeur en volts
  int valeur1 = analogRead(A1);//Nbr de pas PWM Vb
tensionVce  = map(valeur1, 0, 1023, 0, 5000);//en millivolts
//intensite=tensionVce/200000.0000;//calcul Ib avec Rb=200K

     

echantillon[indice]=(valeur0);
total = total + echantillon[indice];
indice++;

comptage++;

// si on est à  la fin du tableau ...
  if (indice >= nEchantillons) {
    // ...retour au début
    indice = 0;
  }

  // calcul de la moyenne
  moyenne = total / indice;
tensionVb = map(moyenne, 0, 1023, 0, 5000);//en millivolts
//tensionVb/1000 pour valeurs en volt
  Serial.print(tensionVb/1000);
    Serial.print(",");
      Serial.println(tensionVce/1000);

   delay(   10);
}

   j = j+slope;

   analogWrite( tri, j);

   analogWrite(vg, k);


   delay(   10);

   if   (j > 250) slope = -4 ;

   if   (j < 1)

{ slope = 4 ;
bouclecomptage++;
comptage=0;
indice = 0;             
total = 0;           
moyenne = 0;         
for (int i = 0; i < nEchantillons; i++) {
    echantillon[i] = 0;
      }
   k = k + int(255/5);
//row=row+1;

}

   if   (k > 255 ) k = 0 ;

}

} //   loop()



Pour la partie hardware, voyez le schéma ci-dessous (c'est celui du site "Instructables" que j'ai cité + haut, ainsi qu'une partie de code)

Je suis preneur de vos remarques et suggestions / améliorations...

A vous lire.

Électro-Bidouilleur

Petite remarque sur le contenant. Ton code C est très difficile à  suivre, car le positionnement des accolades { et } n'est pas consistent et mal aligné à  travers le code. Même chose pour les indentations (les tabulations). Ça rend ton code difficile à  comprendre et peu invitant aux autres. Je te conseille fortement d'implémenter une belle hiérarchie des formats, sinon tu vas avoir énormément de difficulté à  déverminer. Juste un petit exemple:

   
void loop()
{
Serial.print("DATA,TIME,"); // Directives pour LibreOffice
total = total - echantillon[indice];
if (Serial.available() > 0)   
{
incomingByte = Serial.read();   
int valeur0 = analogRead(A0);//Nbr de pas PWM Vce
// valeur en volts
int valeur1 = analogRead(A1);//Nbr de pas PWM Vb
tensionVce  = map(valeur1, 0, 1023, 0, 5000);//en millivolts
...
}
...
}


Vois cela comme un commentaire constructif!  ;)

Janpolanton

#19
Bonjour,

Je sais tout ce que tu viens de dire mais j'ai fait ça à  l'arrache et moi même je ne m'y retrouve pas.. :-\

Je vais tout bien ordonner promis

Voilà , c'est fait :

const int nEchantillons = 126;       //valeur de comptage max
        int echantillon[nEchantillons];      // un tableau pour stocker les échantillons lus
        int indice = 0;                      // indice de l'échantillon courant
        float total = 0;                     // somme des échantillons mémorisés
        float moyenne = 0;                 
        float intensite = 0;
        int tri =   5;                       // Triangle   sur D5
        int vg = 3;                          // Voltage step sur D3
        int j   = 0;                         // pente Vce
        int k = 0;                           // steps Ib
        int slope = 4;                       // pente du triangle
        int incomingByte;                    // variable de stockage des données entrantes
        int comptage=0;                      // comptage du nombre d'échatillons
        int bouclecomptage=0;                // nombre de comptages
                                             //int row = 0;// pour renvoi de colonnes à  LibreOffice
        float tensionVce;
        float tensionVb;
        float intensiteIb;

   void setup()

{     Serial.begin(   9600);   

           Serial.println("CLEARDATA");         // Directives pour LibreOffice
           Serial.println("LABEL,Time,Vce,Ib"); // Directives pour LibreOffice
           pinMode( tri, OUTPUT);
           pinMode( vg,   OUTPUT);
   
             for (int i = 0; i < nEchantillons; i++)     {
             echantillon[i] = 0;
             }
}   // setup

   void loop()
{
          Serial.print("DATA,TIME,");           // Directives pour LibreOffice 
                 
            total = total - echantillon[indice];   
           
                {   if   (Serial.available() > 0);   

         {  incomingByte = Serial.read();   

    int valeur0 = analogRead(A0);//Nbr de pas PWM Vce
    int valeur1 = analogRead(A1);//Nbr de pas PWM Vb
    tensionVce  = map(valeur1, 0, 1023, 0, 5000);//en millivolts
   
//intensite=tensionVce/200000.0000;//calcul Ib avec Rb=200K

       echantillon[indice]=(valeur0);
       total = total + echantillon[indice];
       indice++;
       comptage++;

                // si on est à  la fin du tableau ...
                if (indice >= nEchantillons) {
               // ...retour au début
               indice = 0;
               }
           
       moyenne = total / indice;                      // calcul de la moyenne
       tensionVb = map(moyenne, 0, 1023, 0, 5000);    //en millivolts
             
          Serial.print(tensionVb/1000);               //tensionVb/1000 pour valeurs en volt
          Serial.print(",");
          Serial.println(tensionVce/1000);

   delay(   10);
   
      }   // incomingByte = Serial.read();   
             j = j+slope;
             analogWrite( tri, j);
             analogWrite(vg, k); 
   delay(   10);
                 if   (j > 250) slope = -4 ;
                 if   (j < 1)
                 {  slope = 4 ;
                      bouclecomptage++;
                      comptage=0;
                      indice = 0;             
                      total = 0;           
                      moyenne = 0;         
                          for (int i = 0; i < nEchantillons; i++) {
                          echantillon[i] = 0;
                          }                   
                      k = k + int(255/5);
                      //row=row+1;
                } // slope = 4 ;
           if (k > 255 ) k = 0 ;
              } // if   (Serial.available() > 0);
} //   loop()


Janpolanton

Bonjour à  tous,
Ça faisait un petit moment que je n'étais pas intervenu sur le forum et j'en profite pour relancer cette discussion.

J'ai abandonné le projet basé sur le couple Arduino / Openoffice.

Je suis en cours d'étude d'un autre projet basé sur un réseau R2R associé à  de la logique CMOS (j'ai une boite pleine de circuits logiques de toute sorte récupérés depuis des décennies  ;D ).

Mon cahier des charges :
Automatisme complet pour la génération des rampes VCE et des courants de base.
Tension VCE possible jusqu'à  15V
8 valeurs de courant de base
Échantillonnage de la tension VCE sur 8 bits
Pas de composants exotiques
Sortie de visualisation sur un oscilloscope en XY ou avec un microcontrôleur pour ma part ce sera un Arduino nano avec visu des courbes par un programme en Python.

Explication du fonctionnement :
Le DAC des rampes est basé sur un réseau R2R de 8 bits (255 valeurs).
Le balayage est fait par 2 compteurs binaires 4 bits 74HCT393 en cascade et cadencés par un astable basé sur un 555.
Les valeurs des composants R et C donnent une fréquence de 66kHz avec un rapport cyclique de quasi 50%.
Les compteurs bouclent jusqu'à  l'obtention des 7 valeurs de courant de base.

Le DAC des courants de base est réalisé par un réseau R2R 3 bits (7 valeurs).

Le balayage est fait par 3 bascules JK CD4027 en cascade

La fin du comptage de pas et l'arrêt des rampe est fait par portes logiques AND à  3 et 4 entrées (CD4073 & 74HCT21).

Le signal RST de commande du 555 est géré par une bascule D CD4013 (en fait je ne pense pas que ce soit nécessaire).

Voilà  en gros le principe de fonctionnement.

Il me reste encore beaucoup de choses à  améliorer et notamment l'inversion des rampes qui vont de 0 à  -12V (si quelqu'un a un idée pour les faire varier de 0 à  +12V car je sèche, allez savoir pourquoi  ;) )

l faudra aussi prévoir le fonctionnement PNP / NPN et l'interfaçage avec un microcontrôleur pour visu des courbes.



Ci-dessous, quelques courbes ainsi que le schéma.
Le fichier .asc est à  disposition pour les gens intéressés à  modifier et améliorer ce montage.







Électro-Bidouilleur

Beau projet, de retour à  la base! On comprends que vous ne voulez pas vous servir d'un vrai DAC..ou d'un simple microcontrôleur.  Correct. Ça grossit donc le projet.

Vous devriez être capable de remplacer U2 par une configuration inverseuse et un décalage, pour ramener le tout du côté positif.

Bon travail!  :)

Janpolanton

Bonjour,

Effectivement, un DAC + microcontrôleur m'auraient simplifié le projet mais je voulais me prouver qu'on pouvait faire avec des composants de base.
De plus, pour cette utilisation, on a pas besoin de la  précision d'un DAC 14 bits... :)

Je n'ai rien trouvé d'approchant sur internet mais néanmoins je trouve que mon approche peut présenter un certain intérêt pédagogique.

Cette ébauche pourrait servir de base pour un projet commun avec les participant du forum.

Pour votre remarque, effectivement, je vais voir côté U2 pour régler ce problème de tension.

J'ai modifié le schéma en mettant des compteurs / décompteurs CD4516 et en modifiant au passage quelque peu la logique connexe.
Je trouve que le fonctionnement est mieux (voir image détail rampe comparaison).



Électro-Bidouilleur

C'est définitivement pédagogique, pas de doute là -dessus! C'est beaucoup d'apprentissage en un seul projet.

Janpolanton

Oui, ça touche quelques domaines et c'est peut-être un peu "hard" pou certains bidouilleurs débutants :-[

J'ai résolu le problème de tension en sortie grâce à  l'utilisation de l'ampli opérationnel en montage non inverseur  ;)

Électro-Bidouilleur

Ah bon, excellent. J'avais même pas noté que U2 était déjà  un inverseur  :-[

Janpolanton

Et voici la dernière mouture du schéma avec tensions positives et une belle courbe Ic f(Vce) pour un NPN 2222.

Étape suivante, mise au propre du schéma et câblage sur breadboard.


Janpolanton

#27
Testeur partie NPN quasi terminé.
Ajout d'une source de courant pour tester les transistors de puissance et pour limiter le courant débité par l'AOP à  quelques mA, mais la solution que j'ai adoptée n'est pas très optimisée car la résistance de charge doit dissiper une grande puissance. Je vais voir pour une source de courant à  LM317 par exemple.

Une petite image pour finir. ( son nom est erroné, c'est bien la version NPN)  :)

Bonne nuit à  vous, car il est minuit en France

Ci-joint fichier LTspice (enlever le .txt pour l'ouvrir)

Janpolanton

En parallèle, je développe une appli sous python pour visualiser les courbes. C'est une première ébauche à  mon avis très prometteuse.
Le montage sur la carte arduino comporte 2 AOP, une poignée de résistances. Le transistor en test est un 2N2222.
L'arduino fabrique la rampe et le signal en marches d'escalier pour polariser le transistor.
2 ports analogiques servent à  mesurer les signaux IC et VCE envoyés sur le port série et récupérés par python pour analyse et mise en forme.
Les courbes de caractéristiques sont un peu crades car aucune valeur n'est lissée.


Électro-Bidouilleur

Un plaisir de programmer en Python. Quelle flexibilité, et quelle simplicité! Tout est assez bien documenté sur la toile.

Pour les courbes, j'utilise PyChart.