Folosește Arduino pentru a măsura constanta de timp a unui circuit serie R-C. Poți calcula valoarea condensatorului, folosind un rezistor de mărime cunoscută.
Un capacimetru este un dispozitiv util oricărui electronist. Mai ales că funcția de măsurare a capacității pe care o posedă unele multimetre ieftine lasă de dorit. Folosind o placă de dezvoltare compatibilă cu Arduino, am decis să-mi construiesc propriul capacimetru, în special pentru condensatori de valoare mare. Programul ce rulează pe microcontroller va încărca și descărca condensatorul și va măsura constanta de timp pentru a determina capacitatea. Sunt două metode prin care poate fi apreciată valoarea capacității unui condensator: prin includere într-un oscilator L-C cu inductor de mărime cunoscută și măsurarea frecvenței acestui oscilator sau prin includerea într-un circuit R-C serie cu rezistor de mărime cunoscută și măsurarea constantei de timp. Prima metodă este utilă pentru măsurarea capacităților mici, dar este mai greu de implementat, deoarece necesită mai multe componente și un software mai complex.
Proiectul din acest articol folosește metoda cu circuit RC. Când o tensiune este aplicată unui circuit serie rezistor - condensator, tensiunea la bornele condensatorului tinde să ajungă la nivelul tensiunii de alimentare în timp (condensatorul se încarcă). Modificarea tensiunii la bornele condensatorului se face prin consum de curent. Circuitul prezentat realizează atât încărcarea, cât și descărcarea condensatorului. Măsurarea constantei de timp se face doar în timpul încărcării. Funcția de descărcare permite efectuarea de măsurări repetate, și precise, fără a scoate condensatorul din circuitul RC.
Capacimetrul construit pe o placă de test
Chiar dacă Arduino încarcă și descarcă condensatorul, nu introduce în circuit condensatori încărcați. Pot distruge microcontroller-ul dacă tensiunea prezentă la bornele lor depășește 5 V sau dacă este de polaritate opusă. Descarcă condensatorii înainte de a-i măsura. Schema electrică a capacimetrului este următoarea.
Schema capacimetrului cu Arduino
Cu excepția rezistorului de 10 k, care trebuie să fie conectat la un pin analogic, toate celelalte conexiuni pentru rezistoare și LCD pot fi realizate pe orice pini digitali.
Rezistorul de 220 ohmi are rolul de a descărca condensatorul. Cu cât rezistența este mai mică, cu atât mai rapidă este descărcarea. Dar și curentul crește proporțional. Deci, la tensiunea de 5 V, cu rezistorul de 220 ohmi, curentul maxim de descărcare este de 22 mA și se află în limitele suportate de microcontroller. Nu folosi un rezistor mai mic! Rezistorul de 1 k încarcă condensatori mari (de ordinul microfarazilor). Dacă această încărcare are loc în mai puțin de 1 ms, condensatorul este descărcat prin rezistorul de 220 ohmi. Se încearcă din nou încărcarea condensatorului, de această dată prin rezistorul de 1 M. Dacă și această încărcare se produce în mai puțin de 0,5 ms, microcontroller-ul consideră că nu este conectat niciun condensator la circuit (sau are sub 500 pF). Numai secvența de citire a tensiunii la pinul analogic durează aproximativ 116...128 microsecunde pe ATmega328. Această întârziere este măsurată la fiecare măsurare în gol și utilizată ca factor de corecție când un condensator este conectat la circuit.
Schița include o funcție care încarcă condensatorul. Setează pinul cu rezistorul corespunzător ca ieșire, nivel logic 1. Apoi memorează timpul actual raportat de funcția micros()
. Verifică repetitiv dacă tensiunea la pinul analogic a ajuns la 63,14 la sută din tensiunea de alimentare (echivalentul a 5 V la intrarea convertorului ADC este 1023
, deci 63,14% din maximum este 646
). Când se atinge acest prag, timpul actual este memorat în altă variabilă. Funcția calculează diferența dintre timpii de terminare a încărcării și de începere a încărcării. După anularea rezistorului de încărcare, returnează timpul, ajustat cu un factor de corecție.
long chargeCapacitor(byte resistorPin) { unsigned long startTime = 0; unsigned long stopTime = 0; // afisare simbol incarcare lcd.setCursor(15, 0); lcd.write(byte(1)); // activare rezistor pinMode(resistorPin, OUTPUT); digitalWrite(resistorPin, HIGH); // start masurare startTime = micros(); while (analogRead(A0) < 646) ; stopTime = micros(); long chargingTime = stopTime - startTime; // deconectare rezistor pinMode(resistorPin, INPUT); // setare factor corectie if (chargingTime < 500) adjustment = 0 - chargingTime; // stergere simbol incarcare lcd.setCursor(15, 0); lcd.write(' '); return (chargingTime + adjustment); }
Factorul de ajustare a timpului este recalculat după fiecare tentativă de încărcare mai scurtă de 0,5 ms, considerată fără condensator. Doar citirea pinului analogic durează puțin peste 0,1 ms. Determinarea capacității și autoscalarea sunt realizate în altă funcție.
void performMeasurement(float &capacity, char &unit) { long chTime = 0; capacity = 0; unit = 'u'; // se incearca incarcarea cu rezistorul mic chTime = chargeCapacitor(PIN_UF); // daca s-a incarcat prea repede if (chTime < 1000) { // se descarca pinMode(PIN_DIS, OUTPUT); digitalWrite(PIN_DIS, LOW); // daca s-a ajuns aici, condensatorul sigur este sub 1uF // C < 1 uF, R = 330 => Tdes < 5 * 330 * 0.000001 = 1.65 ms // descarcarea completa se face in mai putin de 2 ms; se asteapta totusi 10 ms delay(10); pinMode(PIN_DIS, INPUT); // se incearca cu rezistorul mare chTime = chargeCapacitor(PIN_NF); unit = 'n'; // switch to nanofarads if (chTime < 500) { // nu se pot face masurari corecte sub 500 pF return; } } if (unit == 'u') capacity = chTime / K_RESISTOR; else capacity = chTime / M_RESISTOR; }
Presupunând că există un condensator în circuit, se încearcă încărcarea acestuia cu rezistorul de 1 k. Dacă se încarcă în mai puțin de 1 ms, se presupune că poate fi un condensator cu mărimea de ordinea nanofarazilor. Așa că, este descărcat prin activarea rezistorului de 220 ohmi. Știind că nu putem avea un condensator mai mare de 1 uF în circuit, dacă a fost îndeplinită condiția chTime < 1000
, descărcarea completă prin 220 ohmi, după 5 constante de timp, are loc în mai puțin de 2 ms. Funcția așteaptă totuși 10 ms înainte de a trece mai departe. Se dezactivează rezistorul de descărcare și se face o nouă tentativă de măsurare, de această dată, activând rezistorul mare (de 1M). Dacă și acum, „încărcarea” se face în mai puțin de 0,5 ms, programul consideră că nu există condensator în circuit.
Schița include și funcții de descărcare a condensatorului și calculare a mediei. Ultimele 10 măsurători sunt stocate într-un vector și media lor este afișată pe rândul al doilea al LCD-ului.
Capacitatea minimă care poate fi măsurată este limitată la 0,5 nF. Dar care este cea maximă? Timpul de măsurare este aflat din funcția micros()
. Valoarea returnată de această funcție se resetează la fiecare 70 de minute de funcționare continuă. Deci, se pot măsura chiar și condensatori a căror încărcare durează până la câteva minute. Dacă vei testa condensatori de mărimi variate, vei observa că timpul de măsurare este proporțional cu capacitatea. De exemplu, un condensator de 4700 uF se încarcă până la 63 la sută în 4,7 secunde, prin rezistorul de 1 k. La fel, descărcarea (completă) durează câteva secunde.
Pe afișajul LCD poți vedea ce se întâmplă cu condensatorul. Când se încarcă, în partea din dreapta vei vedea un triunghi cu vârful în sus. După încărcare, capacitatea afișată este actualizată. Începe descărcarea și un triunghi cu vârful în jos este acum afișat. Apoi ciclul se reia. Dacă măsori condensatori cu mărimi de ordinul nanofarazilor, afișarea simbolurilor de încărcare/descărcare poate fi mai rapidă decât rata de reîmprospătare a afișajului, și nu le vei vedea.
Chiar dacă folosești rezistoare de 1 K și 1 M, acestea nu vor avea exact mărimile respective. De aceea, poți ajusta măsurătorile cu un factor de corecție. Definițiile M_RESISTOR
și K_RESISTOR
reprezintă valoarea reală a rezistoarelor, exprimată în megaohmi, respectiv kiloohmi și înmulțită cu 1000
. Definește aceste numere cu tipul float
, adăugând punctul zecimal și prima cifră aflată după el.
// factori corectie rezistoare (marime rezistoare in M, respectiv k * 1000.0) #define M_RESISTOR 1055.0 // valoare rezistor 1M #define K_RESISTOR 1042.5 // valoare rezistor 1k
Proiect inspirat din acest tutorial Arduino. De asemenea, Nick Gammon testează diverse metode de măsurarea a constantei de timp într-un circuit asemănător. Schița completă pentru acest proiect este pe GitHub.
Niciun comentariu :
Trimiteți un comentariu
Vă recomandăm să citiți regulamentul comentariilor înainte de a scrie un comentariu.