Bonjour, cliquez-ici pour vous inscrire et participer au forum.
  • Login:



+ Répondre à la discussion
Page 1 sur 2 1 DernièreDernière
Affichage des résultats 1 à 15 sur 23

[Projet] Réparation alims à découpage: Mesurer la résistance équivalente série de condensateurs

  1. Yvan_Delaserge

    Date d'inscription
    mars 2013
    Localisation
    Aspretto
    Messages
    2 071

    [Projet] Réparation alims à découpage: Mesurer la résistance équivalente série de condensateurs

    Bonjour à tous,

    Au fil des années, j'ai quelques appareils équipés d'alimentations à découpage qui sont tombés en panne et que j'ai gardés, espérant pouvoir les réparer un jour. Ce jour est enfin arrivé. je viens de réparer coup sur coup quatre récepteurs satellite digitaux.
    La panne était toujours la même: le vieillissement des condensateurs électrochimiques. Appelez ça de l'obsolescence programmée si vous voulez. Dans le cas des récepteurs satellite digitaux, la platine signal se comporte comme un ordinateur et refuse de booter si l'alim ne fournit pas les tensions correctes, comportant moins qu'un certain niveau de bruit (mauvais filtrage). Il s'agit d'alimentations multi-tension: 3,3V, 5V, 12V, 24 V et 30 V. Les deux dernières probablement pour les Varicaps des tuners.

    Ce qui m'a permis de réparer ces alimentations, c'est un mesureur de résistance équivalente série que j'ai construit. Il permet de tester les condensateurs électrochimiques SANS les dessouder du circuit. C'est un gros avantage lorsque l'on sait que les alimentations à découpage de ces appareils sont câblées plutôt serré!
    SMPS.jpg

    -----

    Un civet, un plat de côtes et puis, glissez-moi une petite paupiette avec.( Lino Ventura)
     


    • Publicité



  2. Yvan_Delaserge

    Date d'inscription
    mars 2013
    Localisation
    Aspretto
    Messages
    2 071

    Re : [Projet] Réparation alims à découpage: Mesurer la résistance équivalente série

    Le principe est simple: Il s'agit d'appliquer une impulsion aux bornes du condensateur préalablement déchargé et de mesurer la tension aux bornes de celui-ci.

    Il existe un certain nombre de descriptions pour de tels appareils. Un mesureur de résistance équivalente série était disponible en kit au milieu des années 90, qui était proposé par une maison australienne, nommée Silicon Chip. Cet appareil n'est plus fabriqué actuellement. Le schéma se présentait ainsi:

    ESRMETER.jpg

    Le principe est le suivant: Les transistors Q3, Q4 ou Q5 envoient une impulsion au condensateur à tester, à travers une résistance de 100 Ohms, 1 K ou 10 K. Cette impulsion ne peut pas dépasser 0,7 V car elle est limitée par les diodes D3 et D4. C'est ce qui permet de tester les condensateurs sans les dessouder du circuit. On travaille toujours avec des tensions inférieures au seuil de conduction des semi-conducteurs.

    Pour ne pas détruire l'appareil de mesure, il faut toujours décharger le condensateur avant de le tester. En outre, le transistor Q6 se charge de le faire entre deux impulsions de mesure.

    Si la résistance équivalente série du condensateur à tester était nulle, l'impulsion qu'on lui envoie serait parfaitement court-circuitée par celui-ci et on mesurerait une tension nulle à ses bornes. En revanche, si la résistance équivalente série est non nulle, on mesurera une tension non nulle aux bornes du condensateur, ce qui permettra de quantifier la RES.
    Un civet, un plat de côtes et puis, glissez-moi une petite paupiette avec.( Lino Ventura)
     

  3. Yvan_Delaserge

    Date d'inscription
    mars 2013
    Localisation
    Aspretto
    Messages
    2 071

    Re : [Projet] Réparation alims à découpage: Mesurer la résistance équivalente série

    On voit que le montage est ancien. Le microcontrôleur est un Zilog. Il fallait ajouter une gestion de l'affichage externe et il n'y avait pas de convertisseur analogique-digital dans le microcontrôleur.

    A l'heure actuelle, il est possible de remettre ce montage au goût du jour avec un Arduino. Il est facile de gérer un afficheur LCD et on dispose d'un convertisseur analogique-digital pour mesurer la tension qui subsiste aux bornes du condensateur lorsqu'on lui applique une impulsion.

    Avec un Arduino, le prix de l'appareil de mesure devient dérisoire et le schéma devient beaucoup plus simple:

    SCHEMA2.jpg

    Il y a eu une discussion sur le forum Arduino il y a quelques années à ce propos et c'est là que j'ai trouvé ce schéma et que je l'ai modifié un peu.

    Le principe est le même que celui du premier schéma, sauf qu'il n'y a que deux types d'impulsions: à travers une résistance de 100 ohms, ou une de 1 K. Mais on pourrait rajouter un troisième transistor comme sur le premier schéma. Les diodes limitant l'amplitude de l'impulsion sont ici des Schottky.

    Mais de toutes manières, on va toujours s'arranger pour que la tension aux bornes du condensateur que l'on teste ne dépasse pas 200 mV, en sélectionnant automatiquement (par soft) d'envoyer une impulsion à travers 100 ohms ou 1 K.
    Un civet, un plat de côtes et puis, glissez-moi une petite paupiette avec.( Lino Ventura)
     

  4. Yvan_Delaserge

    Date d'inscription
    mars 2013
    Localisation
    Aspretto
    Messages
    2 071

    Re : [Projet] Réparation alims à découpage: Mesurer la résistance équivalente série

    Les fabricants de l'appareil Silicon chip mentionné ci-dessus fournissaient aussi une table montrant les RES maximales admissibles pour un condensateur donné. La RES dépend à la fois de la capacité et de la tension de service du condensateur.
    Heureusement, ces deux valeurs, ainsi que la polarité, figurent sur les boîtiers des condensateurs.

    NEW-2.jpg

    Tout cela date d'une vingtaine d'années. On peut espérer que les condensateurs que l'on trouve actuellement soient meilleurs...A moins qu'une nouvelle norme ROHS ne soit passée par là!

    Il est facile avec ce tableau de sélectionner une capacité sur l'axe vertical, une tension de service sur l'axe horizontal et de voir dans la case correspondante la résistance équivalente série maximale admissible pour ce type de condensateur.
    On voit qu'il ne va pas être possible d'utiliser cet appareil pour tester des condensateurs de moins de 1 uF. Il est facile de comprendre pourquoi: L'impulsion de mesure est très brève, mais elle charge quand même un peu le condensateur, ce qui s'oppose à l'établissement du courant et fausse la mesure de la RES vers une valeur trop élevée.
    On voit aussi qu'il n'est pas utile de mesurer une RES supérieure à une vingtaine d'Ohms. Par contre, il est nécessaire de pouvoir mesurer des RES de l'ordre de 30 mOhms! On va y revenir.

    Sur les condensateurs que j'ai dû changer dans les alims de mes récepteurs satellite, on peut mesurer une capacité diminuée ( 2 à 10 fois moins) et/ou une résistance équivalente série fortement augmentée (de l'ordre de 2 à 10 fois plus). Parfois une seule chose, parfois les deux.

    Dans les deux cas, que ce soit une baisse de la capacité seule ou une augmentation de la RES seule, le condensateur est à changer. Il ne peut pas fonctionner correctement, surtout dans une alim à découpage.

    A noter que l'aspect extérieur des dits condensateurs est absolument normal. Pas de gonflement, de traces de fuite d'électrolyte, etc.
    Donc pour moi dorénavant, chaque fois qu'il va s'agir de réparer un appareil, la première chose à vérifier, ce sera la RES des électrolytiques de l'alimentation à découpage. Et ce sera vite fait, puisqu'il n'y aura même pas besoin de les dessouder du montage!

    Un point intéressant: sur les platines "signal" des récepteurs satellite, on trouve aussi de très nombreux condensateurs électrolytiques. Mais ils sont toujours en bon état. La raison est facile à comprendre: Ils ne traitent qu'un courant presque continu, ou alors avec une très faible ondulation, puisque l'alim fournit à la platine signal, des tensions continues.
    Par contre, les condensateurs de filtrage des alims à découpage sont, eux soumis à un bombardement constant, 60 000 fois par seconde, ce qui explique leur vieillissement rapide.

    Lorsqu'un condensateur voit sa RES augmenter, il va s'échauffer, par effet Joule. Mais paradoxalement, l'échauffement tend à réduire la RES. On n'aura donc pas d'emballement avec explosion du condensateur. L'alim va démarrer un certain nombre de fois et le condensateur malade fonctionner tant bien que mal grâce à l'échauffement. Jusqu'au jour où la RES et/ou la capacité seront tombées à de telles valeurs à froid, qu'elles empêcheront l'alim de démarrer lorsque l'on tentera d'allumer l'appareil.
    Un civet, un plat de côtes et puis, glissez-moi une petite paupiette avec.( Lino Ventura)
     

  5. Yvan_Delaserge

    Date d'inscription
    mars 2013
    Localisation
    Aspretto
    Messages
    2 071

    Re : [Projet] Réparation alims à découpage: Mesurer la résistance équivalente série

    Abordons le software.

    Nous sommes en présence d'un diviseur de tension.

    DIVISEUR.jpg

    U1 représente la tension de l'impulsion de mesure. Elle vaut 5 volts, moins la tension de saturation du transistor qui commute l'impulsion.
    R1 représente la résistance en série avec le transistor de commutation. elle vaudra 100 Ohms ou 1 KOhm.
    C et R2 représentent le condensateur en cours d'examen, Respectivement sa capacité et sa résistance équivalente série.
    U2 représente la tension que l'on va lire avec le CAN de l'Arduino, avant de calculer la RES.

    La capacité peut être ignorée tant que l'on a affaire à un condensateur de plus de 1 uF. Elle ne va pas influencer la mesure de U2.

    La formule utilisée pour le calcul de R2 est la suivante:
    R2 = R1 * U2 / ( U1 - U2)

    Le soft est le suivant:

    Code:
    #include <LiquidCrystal.h>
    #include <avr/eeprom.h>
    
    //we have to change prescaler for the ADC to make the conversion happen faster this code section was sugested on the arduino forum
    //
    #define FASTADC 1    // defines for setting and clearing register bits
    #ifndef cbi
    #define cbi(sfr, bit) (_SFR_BYTE(sfr) &= ~_BV(bit))
    #endif
    #ifndef sbi
    #define sbi(sfr, bit) (_SFR_BYTE(sfr) |= _BV(bit))
    #endif
    
    //define the input and output pin we will use
    
    #define DISCHARGE_PIN 3
    #define PULSE_HighRange_PIN 5
    #define PULSE_LowRange_PIN 4
    #define ESR_PIN A0
    #define BUTTON_PIN 2
    
    //function prototype
    unsigned long measureESR(void);    //measuring function, increases ADC to 14-bit resolution by oversampling
    
    //global variables
    unsigned long esrSamples;
    double milliVolts;
    double esrCalib;
    double vRef = 1.1;                //voltage on the Vref pin (this sketch uses internal voltage reference 1.1V)
    double milliAmps = 1.4;         // (in mA) needed only for "Zeroing". Proper calibration can be done entering the right value for the milliAmps, (U=I*R).
    double Rs = 100.0;               //proper calibration can be done entering the right value for Rs. Enter the value also in the "IF" branch! This is only the initialization of the Upper Range!
    double Vin = 4900;
    double Rm;
    boolean esrRange = false;
    int stabilizer = 0;
    
    //idealy milliAmps is 50 mA, this condition is fufiled only if R10 is 100 Ohm, Vcc is exactly 5V and the transistor while fully saturated idealy is at 0 ohm.
    
    
    LiquidCrystal lcd(13,12,11,10,9,8);    //this is my display setup, I'm using standard 4-bit control.
    
    byte Omega[8] = {0b00000,0b01110,0b10001,0b10001,0b10001,0b01010,0b11011,0b00000};  //Omega special character
    byte micro[8] = {0b00000,0b00000,0b10010,0b10010,0b10010,0b11100,0b10000,0b00000};  //micro sign
    
    void setup(void)
    {
    
      if (FASTADC)
        {
              sbi(ADCSRA,ADPS2); //seting prescaller to 32 for faster adc (500khz)
              cbi(ADCSRA,ADPS1); //at 500khz  results are still looking good (same values as if 250khz ADC clock)
              sbi(ADCSRA,ADPS0); // the shorter the pulse on a small value capacitor it has no time to charge and denaturate de result
        }
    
      pinMode(ESR_PIN, INPUT);                      //reading miliVolts
      pinMode(PULSE_HighRange_PIN, OUTPUT);
      digitalWrite(PULSE_HighRange_PIN,HIGH);       //low enables T1
      pinMode(PULSE_LowRange_PIN, OUTPUT);
      digitalWrite(PULSE_LowRange_PIN,HIGH);        //low enables T1'
      pinMode(DISCHARGE_PIN, OUTPUT);
      digitalWrite(DISCHARGE_PIN,HIGH);             //low disables T2
      pinMode(BUTTON_PIN,INPUT);                    //setting up for a button (will use this for zeroing)
      digitalWrite(BUTTON_PIN,HIGH);                //enabling the pull up on the button, when button pressed to the ground zeroes out the cable
    
      analogReference(INTERNAL);                   //setting vRef to internal reference 1.1V
    
      lcd.createChar (0, Omega);
      lcd.createChar (1, micro);
      lcd.begin(16,2);
      lcd.setCursor(0,0);
      lcd.print("ESR meter");
      lcd.setCursor(5,1);
      lcd.print("version 1.0");
      delay(500);
    
      eeprom_read_block((void*)&esrCalib, (void*)0, sizeof(esrCalib));   //reading calibration value, it will be ok if already calibrated, else it might be bogus depends on the content of EEPROM but will be ok after first calibration  
      lcd.clear();
    }
    //**************************************************************************************************************************
    
    void loop(void)
    {
          esrSamples = measureESR(); 
          milliVolts = (esrSamples * vRef) / 16.384;    //Divide by 16.384 due to a 14-bit oversampling
          milliVolts = esrSamples * vRef;
    //        Rm = Rs / ((Vin / milliVolts) - 1);         //Voltage Divider (R2=R1(U2/(U1-U2)))
          Rm = milliVolts * Rs / (Vin - milliVolts);           
          
          Rm = Rm - esrCalib;                           //Compensate Cable Resistance
    //      if (Rm < 0) Rm = 0;                           //Do not show eventual negative values
        
          if (stabilizer == 3) {                        //Make three measurements before autoranging the ESR. This is hysteresis to avoid oscillation when autoranging.
                if (Rm < 5.5) {
                  Rs = 100.0;              //If needed, adjust this value for low range measurement (Below 6 Ohms)
                  esrRange = false;
                }
                else if (Rm > 5.8) {
                  Rs = 1050.0;                          //If needed, adjust this value for high range measurement (Above 6 Ohms and below 50 Ohms)
                  esrRange = true;
                }
                stabilizer = 0;
                }
          lcd.clear();    
          lcd.setCursor(0,0);
          lcd.print("Vout = ");
          lcd.print(milliVolts);
          lcd.print("mV");
          lcd.setCursor(1,1);
            
          if (Rm <= 50){                                //If measurement is less than 50 Ohms show the result, otherwise show <OL> (Overload) on the display
                lcd.print("ESR = ");
                lcd.print(Rm,2);
                lcd.write(byte(0));
              }
          else {
                lcd.print("ESR = <OL>     ");
          }
        
          //for zeroing the cables, this can be quite a big resistance compared to the values we intend to measure
          //so it is a good idea to try to reduce in any way posible this influence (short cables, soldering the cables, etc)
        
          if(!digitalRead(BUTTON_PIN)){
                lcd.clear();
                lcd.print("Zeroing...");
                esrCalib = milliVolts/milliAmps;
                lcd.print(" done!");
                lcd.setCursor(0,1);
                eeprom_write_block((const void*)&esrCalib, (void*)0, sizeof(esrCalib));
                lcd.print("saved to EEPROM");
                delay(1000);
          }
        
    }
    
    //**************************************************************************************************************************
    unsigned long measureESR()
    {
      unsigned long accumulator = 0;
      unsigned int sample = 0;
      int i = 0;
    // oversampling 256 times (for 14 bit is 4^(desiredResolution - ADCresolution) where is 4^(14-10) = 4^4 = 256)
      while ( i++ < 256 )
      {
                digitalWrite(DISCHARGE_PIN, HIGH);                 // discharge the capacitors
                delayMicroseconds(600);                            // discharge wait time
                digitalWrite(DISCHARGE_PIN, LOW);                  // disable discharging
                if (esrRange == false) {
                      digitalWrite(PULSE_LowRange_PIN,LOW);        // start milliAmps pulse
                      delayMicroseconds(5);                        // on the scope it appears that after enabling the pulse a small delay is needed for oscillations to fade away
                      sample = analogRead(ESR_PIN);                // read ADC value
                      digitalWrite(PULSE_LowRange_PIN, HIGH);      // stop milliAmps pulse
                    }
                if (esrRange == true)  {
                      digitalWrite(PULSE_HighRange_PIN,LOW);       // start milliAmps pulse
                      delayMicroseconds(5);                        // on the scope it appears that after enabling the pulse a small delay is needed for oscillations to fade away
                      sample = analogRead(ESR_PIN);                // read ADC value
                      digitalWrite(PULSE_HighRange_PIN, HIGH);     // stop milliAmps pulse
                }
                accumulator += sample;                             // accumulate sampling values
      }
      esrSamples = accumulator >> 4;                               // decimate the accumulated result
      stabilizer ++;
    
      return sample;
    }

    Quelques commentaires:

    Le soft vient directement du site Arduino. Il fonctionne bien.

    Le procédé est similaire à celui du montage du circuit de Silicon Chip.
    1) on applique 5 V en série avec la résistance Rs au condensateur à mesurer.
    2) on mesure la tension aux bornes du condensateur.
    3) On arrête d'appliquer 5 V (en série avec la résistance Rs).
    4) on active Q2 pour décharger le condensateur.
    Tout ceci se fait très rapidement, à 256 reprises, puis on fait une moyenne de la valeur trouvée pour la tension aux bornes du condensateur. Puis on calcule la RES et on l'affiche sur le LCD.

    J'ai modifié quelques détails, comme par exemple le numéro des pins, pour l'adapter au shield que j'ai réalisé.

    Il y avait aussi quelques questions que je me posais concernant la formule utilisée pour le calcul de R2.

    Rm = Rs / ((Vin / milliVolts) - 1); ça, c'est la formule utilisée par l'auteur du programme pour le calcul de la RES du condensateur que l'on examine.
    Rs est la résistance de 100 Ohms ou de 1 Kohm, précédemment nommée R1.
    Vin est le voltage de l'impulsion appliquée au condensateur ( env. 5 Volts)
    Mais le hic, c'est que dans son commentaire, il utilise une autre formule: //Voltage Divider (R2=R1(U2/(U1-U2)))
    Qui équivaut à celle que j'ai citée au début de ce post: Rm = milliVolts * Rs / (Vin - milliVolts);

    En fait, vérification faite, les deux formules sont équivalentes.

    Un autre point qui m'a demandé un peu de réflexion: On a vu plus haut que les impulsions appliquées au condensateur en cours de mesure ne peuvent jamais dépasser 0,4 V, parce qu'elles sont limitées par les deux diodes Schottky D2 et D3. Donc en toute logique, on serait tenté d'adopter 0,4 V pour Vin.
    Mais non! C'est bien 5 Volts qu'il faut utiliser. Cependant, comme on l'a vu, pour ne pas avoir des résultats faussés par les autres composants de l'alim, comme par exemple des redresseurs Schottky, U2 ne doit jamais dépasser 0,4 V, mais cette limitation doit être du seul fait du diviseur de tension formé par Rm et Rs. Il faut donc tenir compte de cela pour commuter Q1 ou Q1' de manière à sélectionner la bonne valeur de Rs (100 Ohms ou 1 K).

    Le programme fait ça de la manière suivante: On mesure d'abord avec la résistance Rs de 100 Ohms. Si on trouve un résultat pour Rm supérieur à 5 Ohms, cela signifie que milliVolts sera supérieur à 238 mV. Dans ce cas, on va plutôt utiliser la résistance Rs de 1000 Ohms.
    Et au cas où Rm est supérieur à 50 Ohms, on affiche " Overflow".

    De toutes façons, comme on l'a vu, il n'est pas utile de mesurer des résistances supérieures à 50 Ohms.

    Mais alors, dans ces conditions, peut-on renoncer purement et simplement aux deux diodes Schottky D2 et D3? Je préfère les laisser, pour éviter d'infliger un éventuel dégât à l'alim que j'essaie de réparer. Il sera toujours moins grave d'appliquer 0,4 V que 5 V, même à travers 100 Ohms.
    Un civet, un plat de côtes et puis, glissez-moi une petite paupiette avec.( Lino Ventura)
     


    • Publicité



  6. Yvan_Delaserge

    Date d'inscription
    mars 2013
    Localisation
    Aspretto
    Messages
    2 071

    Re : [Projet] Réparation alims à découpage: Mesurer la résistance équivalente série

    Pour améliorer la précision, on peut faire une mise à zéro. On met les deux pointes de touche en contact et on appuie sur le bouton-poussoir. L'Arduino calcule la valeur de résistance dans ces conditions, et il la stocke dans sa mémoire flash. La valeur reste ainsi disponible indéfiniment, sans qu'il y ait besoin de répéter la mise à zéro chaque fois que l'on branche l'appareil.
    Cette valeur de résistance à vide est déduite de la valeur trouvée lors de chaque mesure. En réalité, la valeur est très faible, donc ça ne fait pas une grande différence.


    Pour ceux qui ont comparé les deux schémas, celui de Silicon chip et celui avec l'Arduino, une différence fondamentale vous aura sauté aux yeux:
    La tension mesurée aux bornes du condensateur à tester est directement appliquée à la borne A0 de l'Arduino, alors que dans le schéma de Silicon chip, le signal est amplifié par Q7 et Q8 avant d'être envoyé au microcontrôleur pour conversion analogique-digitale. Ces deux transistors apportent un gain de 20 environ.

    Pour le groupe d'Arduinistes qui ont imaginé ce circuit, il était possible de faire l'économie de cette amplification avant la conversion A-D, en utilisant une technique appelée oversampling. Il s'agit de mesurer de nombreuses fois (ici 256 fois) puis de faire une moyenne. Pour ne pas être trop pénalisés en vitesse d'exécution du programme, ils ont aussi modifié les registres du microcontrôleur de manière à accélérer la conversion A-D. C'est l'objectif des lignes de code suivantes:
    Code:
    //we have to change prescaler for the ADC to make the conversion happen faster this code section was sugested on the arduino forum
    //
    #define FASTADC 1    // defines for setting and clearing register bits
    #ifndef cbi
    #define cbi(sfr, bit) (_SFR_BYTE(sfr) &= ~_BV(bit))
    #endif
    #ifndef sbi
    #define sbi(sfr, bit) (_SFR_BYTE(sfr) |= _BV(bit))
    #endif

    et de celles-ci:

    Code:
    if (FASTADC)
        {
              sbi(ADCSRA,ADPS2); //seting prescaller to 32 for faster adc (500khz)
              cbi(ADCSRA,ADPS1); //at 500khz  results are still looking good (same values as if 250khz ADC clock)
              sbi(ADCSRA,ADPS0); // the shorter the pulse on a small value capacitor it has no time to charge and denaturate de result
        }
    Personnellement, je ne trouve pas que ça fasse une grande différence.

    En fait, après avoir fait quelques essais, je trouve que le gros problème avec ce montage, c'est qu'on arrive péniblement à mesurer des valeurs de 0,1 Ohm et moins. Or, c'est indispensable de pouvoir le faire pour pouvoir contrôler les condensateurs de plus de quelques centaines de uF ( voir table ci-dessus): C'est là qu'est la limitation, plutôt que de mesurer les condensateurs de faible capacité, comme ce qui est dit dans les commentaires du soft.

    Et la cause de cette limitation est facile à comprendre. En utilisant la résistance Rs de 100 Ohms pour mesurer un électrochimique présentant une RES de 0,1 Ohms, le convertisseur analogique-digital ne " voit" que 5 mV. C'est peu. Conclusion: Il faut obligatoirement amplifier le signal avant de l'envoyer au convertisseur analogique-numérique.

    C'est ce que je suis en train de faire en ce moment. Je vous tiendrai au courant des résultats.
    Un civet, un plat de côtes et puis, glissez-moi une petite paupiette avec.( Lino Ventura)
     

  7. Yvan_Delaserge

    Date d'inscription
    mars 2013
    Localisation
    Aspretto
    Messages
    2 071

    Re : [Projet] Réparation alims à découpage: Mesurer la résistance équivalente série

    L'amplificateur qui va attaquer le CAN doit être rapide. L'arduino par l'intermédiaire des transistors Q1 et Q1' va envoyer au condensateur en cours de test, des impulsions d'environ 0,05 msec toutes les 0,6 msec. Un ampli op bon marché ne va pas être assez rapide. J'ai donc repris le schéma du message #2. Le signal de sortie présente un offset et la partie horizontale des créneaux ne l'est pas tout-à-fait. Mais comme la mesure par le CAN de l'Arduino va se faire toujours au même endroit des créneaux de sortie, ce n'est pas un problème.
    Le gain en voltage du circuit est de 35. L'offset est de 23 mV.

    La référence du CAN de l'Arduino est laissée à la valeur par défaut: 5 V. Le CAN peut numériser cette tension en 1024 pas de 4,88 mV.

    En pratique, compte tenu de l'amplification et de l'offset, on va pouvoir appliquer au condensateur en cours de test une tension maximale de 116 mV (4060 mV x 35). Pourquoi 4060 mV et pas 5000? Parce qu'il y a la tension de déchet du transistor Q1, respectivement Q1'.
    Et la plage de tensions comprise entre 0 et 23 mV ne sera jamais utilisable par le CAN, car la tension de sortie de l'ampli ne sera jamais inférieure à cette valeur.
    Mais en contrepartie, on pourra mesurer des résistances inférieures à 0,1 Ohm sur la gamme basse.
    La commutation entre les deux gammes de mesure se fait aux alentours de 2 Ohms. La gamme haute mesure jusqu'à 25 Ohms. On arrive donc bien à ce qui était désiré.

    SHIELD.jpg
    Un civet, un plat de côtes et puis, glissez-moi une petite paupiette avec.( Lino Ventura)
     

  8. Yvan_Delaserge

    Date d'inscription
    mars 2013
    Localisation
    Aspretto
    Messages
    2 071

    Re : [Projet] Réparation alims à découpage: Mesurer la résistance équivalente série

    Voici le soft modifié de la manière appropriée, avec les commentaires qui vont bien.

    Code:
    #include <LiquidCrystal.h>
    #include <avr/eeprom.h>
    
    //we have to change prescaler for the ADC to make the conversion happen faster this code section was sugested on the arduino forum
    //
    #define FASTADC 1    // defines for setting and clearing register bits
    #ifndef cbi
    #define cbi(sfr, bit) (_SFR_BYTE(sfr) &= ~_BV(bit))
    #endif
    #ifndef sbi
    #define sbi(sfr, bit) (_SFR_BYTE(sfr) |= _BV(bit))
    #endif
    
    //define the input and output pin we will use
    
    #define DISCHARGE_PIN 3
    #define PULSE_HighRange_PIN 5
    #define PULSE_LowRange_PIN 4
    #define ESR_PIN A0
    #define BUTTON_PIN 2
    
    //function prototype
    unsigned long measureESR(void);    //measuring function, increases ADC to 14-bit resolution by oversampling
    
    //global variables
    unsigned long esrSamples;
    double gainAmpli=35;              // c'est le gain de l'ampli qui précède le CAN
    double offsetAmpli=23.1;          // c'est l'offset en millivolts de l'ampli qui précède le CAN. C'est la valeur de Vout lorsque les probes de l'appareil sont connectées directement l'une à l'autre
    double milliVolts;
    double esrCalib;
    //double vRef = 1.1;                //voltage on the Vref pin (this sketch uses internal voltage reference 1.1V)
    double vRef = 5;                //the default analog reference of 5 volts (on 5V Arduino boards)
    double milliAmps = 49;         // (in mA) needed only for "Zeroing". Proper calibration can be done entering the right value for the milliAmps, (U=I*R).
    double Rs = 100.0;               //proper calibration can be done entering the right value for Rs. Enter the value also in the "IF" branch! This is only the initialization of the Upper Range!
    double Vin = 4900;
    double Rm;
    boolean esrRange = false;
    int stabilizer = 0;
    
    //idealy milliAmps is 50 mA, this condition is fufiled only if R10 is 100 Ohm, Vcc is exactly 5V and the transistor while fully saturated idealy is at 0 ohm.
    
    
    LiquidCrystal lcd(13,12,11,10,9,8);    //this is my display setup, I'm using standard 4-bit control.
    
    byte Omega[8] = {0b00000,0b01110,0b10001,0b10001,0b10001,0b01010,0b11011,0b00000};  //Omega special character
    byte micro[8] = {0b00000,0b00000,0b10010,0b10010,0b10010,0b11100,0b10000,0b00000};  //micro sign
    
    void setup(void)
    {
    
      if (FASTADC)
        {
              sbi(ADCSRA,ADPS2); //seting prescaller to 32 for faster adc (500khz)
              cbi(ADCSRA,ADPS1); //at 500khz  results are still looking good (same values as if 250khz ADC clock)
              sbi(ADCSRA,ADPS0); // the shorter the pulse on a small value capacitor it has no time to charge and denaturate de result
        }
    
      pinMode(ESR_PIN, INPUT);                      //reading miliVolts
      pinMode(PULSE_HighRange_PIN, OUTPUT);
      digitalWrite(PULSE_HighRange_PIN,HIGH);       //low enables T1
      pinMode(PULSE_LowRange_PIN, OUTPUT);
      digitalWrite(PULSE_LowRange_PIN,HIGH);        //low enables T1'
      pinMode(DISCHARGE_PIN, OUTPUT);
      digitalWrite(DISCHARGE_PIN,HIGH);             //low disables T2
      pinMode(BUTTON_PIN,INPUT);                    //setting up for a button (will use this for zeroing)
      digitalWrite(BUTTON_PIN,HIGH);                //enabling the pull up on the button, when button pressed to the ground zeroes out the cable
    
    //  analogReference(INTERNAL);                   //setting vRef to internal reference 1.1V
      analogReference(DEFAULT);
      
      lcd.createChar (0, Omega);
      lcd.createChar (1, micro);
      lcd.begin(16,2);
      lcd.setCursor(0,0);
      lcd.print("ESR meter");
      lcd.setCursor(5,1);
      lcd.print("version 1.0");
      delay(500);
    
      eeprom_read_block((void*)&esrCalib, (void*)0, sizeof(esrCalib));   //reading calibration value, it will be ok if already calibrated, else it might be bogus depends on the content of EEPROM but will be ok after first calibration  
      lcd.clear();
    }
    //**************************************************************************************************************************
    
    void loop(void)
    {
          esrSamples = measureESR();
         //la valeur de esrSamples va de 160 lorsque les probes sont directement connectées
         //à 978, lorsqu'elles sont déconnectées et en l'air 
          milliVolts = (esrSamples * vRef/gainAmpli) - offsetAmpli; 
          //on compense pour le gain de l'ampli qui précède le CAN et pour l'offset de l'ampli
          
    
          Rm = milliVolts * Rs / (Vin - milliVolts);           
          
          Rm = Rm - esrCalib;                           //Compensate Cable Resistance
          if (Rm < 0) Rm = 0;                           //Do not show eventual negative values
        
          if (stabilizer == 3) {                        //Make three measurements before autoranging the ESR. This is hysteresis to avoid oscillation when autoranging.
                if (Rm < 1.8) {
                  Rs = 100.0;              //If needed, adjust this value for low range measurement (Below 6 Ohms)
                  esrRange = false;
                }
                else if (Rm > 2.1) {
                  Rs = 1250.0;                          //If needed, adjust this value for high range measurement (Above 6 Ohms and below 50 Ohms)
                  esrRange = true;
                }
                stabilizer = 0;
                }
          lcd.clear();    
          lcd.setCursor(0,0);
          lcd.print("Vout = "); 
          lcd.print(milliVolts);
          lcd.print("mV");
          lcd.setCursor(1,1);
            
          if (Rm <= 25){                                //If measurement is less than 50 Ohms show the result, otherwise show <OL> (Overload) on the display
                lcd.print("ESR = ");
                lcd.print(Rm,2);
                lcd.write(byte(0));
              }
          else {
                lcd.print("ESR = <OL>     ");
          }
        
          //for zeroing the cables, this can be quite a big resistance compared to the values we intend to measure
          //so it is a good idea to try to reduce in any way posible this influence (short cables, soldering the cables, etc)
        
          if(!digitalRead(BUTTON_PIN)){
                lcd.clear();
                lcd.print("Zeroing...");
                esrCalib = milliVolts/milliAmps;
                lcd.print(" done!");
                lcd.setCursor(0,1);
                eeprom_write_block((const void*)&esrCalib, (void*)0, sizeof(esrCalib));
                lcd.print("saved to EEPROM");
                delay(1000);
          }
        
    }
    
    //**************************************************************************************************************************
    unsigned long measureESR()
    {
      unsigned long accumulator = 0;
      unsigned int sample = 0;
      int i = 0;
    // oversampling 256 times (for 14 bit is 4^(desiredResolution - ADCresolution) where is 4^(14-10) = 4^4 = 256)
      while ( i++ < 256 )
      {
                digitalWrite(DISCHARGE_PIN, HIGH);                 // discharge the capacitors
                delayMicroseconds(600);                            // discharge wait time
                digitalWrite(DISCHARGE_PIN, LOW);                  // disable discharging
                if (esrRange == false) {
                      digitalWrite(PULSE_LowRange_PIN,LOW);        // start milliAmps pulse
                      delayMicroseconds(5);                        // on the scope it appears that after enabling the pulse a small delay is needed for oscillations to fade away
                      sample = analogRead(ESR_PIN);                // read ADC value
                      digitalWrite(PULSE_LowRange_PIN, HIGH);      // stop milliAmps pulse
                    }
                if (esrRange == true)  {
                      digitalWrite(PULSE_HighRange_PIN,LOW);       // start milliAmps pulse
                      delayMicroseconds(5);                        // on the scope it appears that after enabling the pulse a small delay is needed for oscillations to fade away
                      sample = analogRead(ESR_PIN);                // read ADC value
                      digitalWrite(PULSE_HighRange_PIN, HIGH);     // stop milliAmps pulse
                }
                accumulator += sample;                             // accumulate sampling values
      }
      esrSamples = accumulator >> 4;                               // decimate the accumulated result
      stabilizer ++;
    
      return sample;
    }
    Un civet, un plat de côtes et puis, glissez-moi une petite paupiette avec.( Lino Ventura)
     

  9. Yvan_Delaserge

    Date d'inscription
    mars 2013
    Localisation
    Aspretto
    Messages
    2 071

    Re : [Projet] Réparation alims à découpage: Mesurer la résistance équivalente série

    quelques photos de la réalisation pratique:

    L'ampli a été fait dans un deuxième temps. Je l'ai monté sur la platine initiale comme ceci:
    SHIELD2.jpg
    Un civet, un plat de côtes et puis, glissez-moi une petite paupiette avec.( Lino Ventura)
     

  10. Yvan_Delaserge

    Date d'inscription
    mars 2013
    Localisation
    Aspretto
    Messages
    2 071

    Re : [Projet] Réparation alims à découpage: Mesurer la résistance équivalente série

    Et pour faire le "shield", j'ai utilisé une platine d'expérimentation de type courant.
    Le seul problème est que les connecteurs de l'Arduino sont espacés normalement, de 2,54 mm d'un côté de la platine, mais pas de l'autre côté! Sans doute pour éviter qu'un shield ne puisse être connecté à l'envers. Un des espaces de cette rangée, mesure une fois et demie 2,54 mm. Voir photo.
    J'ai contourné le problème en découpant une partie de la plaque d'expérimentation, qui ensuite a été consacrée uniquement à l'affichage et n'a besoin que d'un fil d'alim 5 V.

    Pour pouvoir souder les picots à la plaque d'expérimentation simple face, j'ai utilisé le système que vous pouvez voir sur la photo.

    SHIELD3.jpg

    Donc en conclusion, voilà un appareil qui vous permettra de gagner beaucoup de temps lors de la réparation de tout circuit comportant des électrolytiques, particulièrement les alimentations à découpage, et ce, pour moins de 10 Euros.
    Un civet, un plat de côtes et puis, glissez-moi une petite paupiette avec.( Lino Ventura)
     

  11. Yvan_Delaserge

    Date d'inscription
    mars 2013
    Localisation
    Aspretto
    Messages
    2 071

    Re : [Projet] Réparation alims à découpage: Mesurer la résistance équivalente série

    Montage superposé des 3 platines: affichage, shield et Arduino
    SAM_5029.JPG
    Un civet, un plat de côtes et puis, glissez-moi une petite paupiette avec.( Lino Ventura)
     

  12. Yvan_Delaserge

    Date d'inscription
    mars 2013
    Localisation
    Aspretto
    Messages
    2 071

    Re : [Projet] Réparation alims à découpage: Mesurer la résistance équivalente série

    et l'appareil terminé dans son boîtier

    SAM_5032.JPG
    Un civet, un plat de côtes et puis, glissez-moi une petite paupiette avec.( Lino Ventura)
     

  13. Yvan_Delaserge

    Date d'inscription
    mars 2013
    Localisation
    Aspretto
    Messages
    2 071

    Re : [Projet] Réparation alims à découpage: Mesurer la résistance équivalente série

    J'ai trouvé sur le Web une autre description de mesureur de Résistance équivalente série de conception nettement moins sophistiquée. C'est ici:

    Le schéma du circuit est le suivant:

    MORNHIN1.jpg

    U1A est un oscillateur à environ 60 KHz, qui envoie un signal faible impédance d'environ 0,5 V d'amplitude au condensateur à tester.
    Le principe est l'inverse de celui du schéma à Arduino: Un bon condensateur, avec faible ESR, laissera passer un maximum de signal vers l'ampli U1B. L'affichage se fait sur un vu-mètre.
    Un civet, un plat de côtes et puis, glissez-moi une petite paupiette avec.( Lino Ventura)
     

  14. Yvan_Delaserge

    Date d'inscription
    mars 2013
    Localisation
    Aspretto
    Messages
    2 071

    Re : [Projet] Réparation alims à découpage: Mesurer la résistance équivalente série

    J'ai modifié un peu le schéma:

    MORNHIN2.gif

    L'alimentation se fait non pas par une pile de 9V, mais par un petit adaptateur 220V-14V comme ceux que l'on trouve sur le Web pour un prix inférieur à celui d'une pile 9V.
    Comme l'adaptateur fournit une tension déjà stabilisée, on peut travailler directement à 14V. Et surtout, le jour où a besoin de l'appareil, on est sûr que la pile ne sera pas à plat!

    J'ai utilisé ce circuit pour avoir une échelle telle qu'elle permette de voir en détail ce qui se passe en-dessous de 1 ohm. Il s'agit de régler R8, qui est un modèle 10 tours, pour avoir une déviation du vu-mètre exactement à pleine échelle lorsque les bornes "test leads" sont reliées directement l'une à l'autre, ce qui correspond donc à 0 ohms.
    Un civet, un plat de côtes et puis, glissez-moi une petite paupiette avec.( Lino Ventura)
     

  15. Yvan_Delaserge

    Date d'inscription
    mars 2013
    Localisation
    Aspretto
    Messages
    2 071

    Re : [Projet] Réparation alims à découpage: Mesurer la résistance équivalente série

    Le circuit et l'alim dans la boîte.

    SAM_5036.JPG

    On distingue à gauche le petit adaptateur 220-14 V.
    Images attachées
    Un civet, un plat de côtes et puis, glissez-moi une petite paupiette avec.( Lino Ventura)
     


    • Publicité







Sur le même thème :





 

Discussions similaires

  1. comment mesurer la puissance isotrope rayonnée équivalente
    Par benoit33 dans le forum Électronique
    Réponses: 11
    Dernier message: 16/04/2009, 15h53
  2. Réparation magnétoscope et condensateurs.
    Par le chamois dans le forum Électronique
    Réponses: 4
    Dernier message: 24/03/2009, 11h41
  3. Réponses: 2
    Dernier message: 01/05/2008, 18h06
  4. Réponses: 0
    Dernier message: 19/10/2007, 10h04
  5. 2 alims en série
    Par poleug dans le forum Électronique
    Réponses: 1
    Dernier message: 18/01/2006, 11h07