Măsurarea curentului cu microcontroler avr. Cum se măsoară tensiunea negativă folosind un ADC

Ibrahim Kamal (IKALOGIC)

Notă. Nu este recomandat să utilizați exemple de cod sursă aflate în textul de descriere în proiectele dvs. La sfârșitul descrierii există un link către o arhivă cu codul sursă complet al proiectului.

Acest articol este în scop educațional. Vom lua în considerare o soluție hardware și o implementare software în sarcina de a măsura nivelul de tensiune al unei baterii (baterie) folosind un microcontroler care este alimentat de la aceeași sursă. Se presupune că utilizatorii sunt familiarizați cu programarea microcontrolerelor AVR și au cunoștințe de bază despre limbajul C. Compilatorul folosit este WinAVR.

Evident, deși este foarte simplă, sarcina de a măsura tensiunea de alimentare a unui microcontroler poate fi foarte importantă și serioasă, mai ales în dispozitivele și aplicațiile alimentate cu baterie.

Există multe metode și soluții pentru monitorizarea nivelurilor de tensiune a bateriei, dintre care multe necesită utilizarea unor componente și ansambluri externe. Soluția pe care o luăm în considerare nu necesită componente externe, vom folosi doar resursele și perifericele microcontrolerului - ADC-ul încorporat.

Vom folosi microcontrolerul ATMEGA48, dar codul programului este pe deplin compatibil cu microcontrolerele ATMEGA88, ATMEGA168, ATMEGA328. În plus, corectând ușor codul sursă, puteți aplica această soluție microcontrolerelor AVR cu ADC încorporat.

Utilizatorii probabil se întreabă: „Este chiar atât de complicat procesul de măsurare a tensiunii de alimentare a unui microcontroler?” Pentru a rezolva această problemă avem un microcontroler și trebuie să convertim valoarea tensiunii analogice într-o valoare digitală care poate fi folosită de microcontroler pentru calcule și acțiuni ulterioare.

Probabil vei spune: „Deci care e treaba. Vom conecta borna pozitivă a bateriei de la care este alimentat microcontrolerul la intrarea ADC și vom converti valoarea tensiunii într-o valoare digitală!”

Totuși, în acest caz vei greși, nu este atât de simplu. Problema este că sursa de tensiune este folosită pentru a alimenta microcontrolerul în sine (Vcc) și, de asemenea, ca referință de tensiune pentru ADC.

Dacă priviți această problemă din punct de vedere matematic, dacă înțelegeți problema. În general, relația dintre tensiunea măsurată și valoarea digitală convertită de ADC pe 8 biți este următoarea:

,

Unde ADC_VALUE- valoarea obținută în timpul conversiei analog-digital,
V_măsură- valoarea tensiunii măsurată, V_REF- tensiune de referință pentru ADC.

Acum, în funcție de condițiile problemei noastre, știm asta V_măsură = V_REF = Vccși, ca urmare, rezultatul ecuației va fi întotdeauna o valoare egală cu 255 și nu se va schimba atunci când se schimbă tensiunea bateriei. Această situație va apărea întotdeauna la măsurarea tensiunii bateriei, care este, de asemenea, folosită ca referință de tensiune.

Pentru a rezolva problema fără a utiliza componente externe, microcontrolerul AVR are o componentă încorporată foarte utilă numită tensiune de referință internă band Gap. Tensiunea de ieșire a acestei surse este de aproximativ 1,1 V și rămâne neschimbată atunci când temperatura și tensiunea de alimentare a microcontrolerului se modifică. Această tensiune poate fi aplicată la intrarea ADC, ca orice tensiune externă, cu singura excepție că aceasta se face în software, fără a include componente externe suplimentare.

Deși acest nod nu a fost proiectat pentru scopul nostru specific, îl vom folosi în sarcina noastră de a măsura tensiunea de alimentare a unui microcontroler.

Luați în considerare ecuația noastră

ADC_VALUE = V_măsură * 255/V_REF ,

Dar, hotărând să măsoare tensiunea de referință V_BG, obținem următoarea expresie

ADC_VALUE = V_BG * 255/V_REF

Și deoarece în cazul nostru tensiunea de referință ADC este egală cu Vcc(punctul principal al problemei noastre), atunci ecuația va lua forma

ADC_VALUE = V_BG * 255/Vcc

Știind că V_BG=1,1 V, din ecuație putem calcula tensiunea de alimentare a microcontrolerului

Vcc = 1,1 * 255/ADC_VALUE

Datorită ultimei expresii, veți putea calcula valoarea reală a tensiunii de alimentare a dispozitivului dumneavoastră cu microcontroler fără a utiliza componente externe.

Să ne uităm la un exemplu de implementare.

Diagramă schematică

Folosim trei baterii NiCad pentru a alimenta microcontrolerul. Tensiunea de alimentare, cu bateriile încărcate complet, va fi de 4,2 V. Trebuie să pornim LED-ul conectat la portul PB0 dacă tensiunea este sub 3,2 V.

Listare

#include avrio.h #include avrinterrupt.h
// Variabile globale
float vcc;//variabilă pentru a păstra valoarea lui Vcc
void setup_adc(void)
{
ADMUX = 0xE; //Setați tensiunea Band Gap ca intrare ADC
ADCSRA = (1ADEN)|(1ADATE)|(1ADIE)|(1ADSC)|5;
}
ISR(ADC_vect) //Sfârșitul conversiei ADC întrerupere
{
caracter nesemnat adc_data;
adc_data = ADC>>2; //citește valoarea de 8 biți
vcc = 1,1 * 255 / adc_data;
}
// Programul principal
// ***********************************************************
int main(void)
{
DDRB = DDRB | (1PB0); //setează PB0 ca ieșire (pentru LED).
sei(); //Activează întreruperi setup_adc();
//configurați ADC-ul

în timp ce (1)
{
// Buclă infinită
dacă(vcc< 3.2)
{
PORTB |= (1PB0);
}
altfel
{
PORTB &= ~(1PB0);
}
}
}

Vă rugăm să rețineți că tensiunea V_BG va fi diferită pentru diferite microcontrolere, în special din loturi diferite și poate fi în intervalul 1,01 V - 1,2 V, prin urmare va fi necesară calibrarea. Astfel, dacă valoarea calculată a lui Vcc folosind acest cod este incorectă, trebuie să faceți următoarele: măsurați tensiunea de alimentare Vcc cu un voltmetru și, folosind ecuația de mai jos și cunoscând valoarea ADC_VALUE, calculează valoarea V_BG

Voltmetru AC

N. OSTROUKHOV, Surgut

Articolul descrie un voltmetru cu tensiune alternativă. Este asamblat pe
microcontroler și poate fi folosit ca dispozitiv de măsurare autonom
sau ca voltmetru încorporat într-un generator de joasă frecvență.

Voltmetrul propus este proiectat
pentru măsurarea tensiunii alternative sinusoidale cu o frecvență de la 1 Hz la
800 kHz. Intervalul de tensiune măsurat - 0…3 V (sau 0…30 V cu extern
divizor de tensiune 1:10). Rezultatul măsurării este afișat pe
indicator LED din patru cifre. Se determină precizia măsurării
parametrii ADC încorporați în microcontroler și sursa de referință
tensiune şi este egală cu 2 mV (pentru intervalul 0...3 V). Voltmetrul este alimentat de
sursa de tensiune stabilizata 5 V si consuma curent 40...65 mA V
în funcție de indicatorul utilizat și de luminozitatea strălucirii acestuia. Consum curent
de la convertorul de polaritate încorporat, nu depășește 5 mA.

Dispozitivul include (vezi diagrama de pe
orez. 1) include un convertor de tensiune AC-DC, un tampon
Amplificator de tensiune DC, voltmetru digital și convertor
polaritatea tensiunii de alimentare. Convertor de tensiune AC la AC
constantă colectată pe comparatorul DA1, generator de impulsuri pe elemente
DD1.1-DD1.4 și tranzistorul de comutare VT1. Să ne uităm la munca lui
mai multe detalii. Să presupunem că nu există semnal la intrarea dispozitivului. Apoi tensiunea
la intrarea inversoare a comparatorului DA1 este egal cu zero, iar la intrarea neinversoare se determină
divizor de tensiune R19R22 și cu valorile indicate pe diagramă este de aproximativ -80
mV. În acest caz, există un nivel scăzut la ieșirea comparatorului, care
permite generatorului de impulsuri să funcționeze. Particularitatea generatorului este că atunci când
fiecare cădere de tensiune la ieșirea comparatorului DA1 la ieșirea generatorului (pin 8
elementul DD1.2) este generat un impuls. Dacă până la scădere este o zi liberă
starea comparatorului nu se va schimba, va fi generat următorul impuls etc.

Durata impulsurilor depinde de
valorile elementelor R16, C5 și este de aproximativ 0,5 μs. La nivel scăzut
tensiune la ieșirea elementului DD1.2, tranzistorul VT1 se deschide. Denominații
rezistențele R17, R18 și R20 sunt selectate astfel încât printr-un tranzistor deschis
curgea un curent de 10 mA, care încarcă condensatoarele C8 și C11. În perioada de valabilitate
Fiecare impuls încarcă acești condensatori cu fracțiuni de milivolt. În stare de echilibru
modul, tensiunea pe ele va crește de la -80 mV la zero, rata de repetiție
impulsurile generatorului vor scădea și impulsurile curentului colector ale tranzistorului VT1
va compensa doar descărcarea lentă a condensatorului C11 printr-un rezistor
R22. Astfel, din cauza offsetului negativ inițial mic,
chiar și în absența unui semnal de intrare, invertorul funcționează normal
modul. Când se aplică o tensiune de intrare AC din cauza unei modificări a ratei de repetiție
impulsurile generatorului, tensiunea la condensatorul C11 se modifică în conformitate cu
amplitudinea semnalului de intrare. Filtrul trece jos R21C12 netezește tensiunea de ieșire
convertor Trebuie remarcat doar că
semiundă pozitivă a tensiunii de intrare, deci dacă este asimetrică
relativ la zero, va apărea o eroare suplimentară.

Amplificator tampon cu câștig
angrenajele 1.2 sunt asamblate pe amplificatorul operațional DA3. Dioda VD1 conectată la ieșirea sa protejează
intrări ale microcontrolerului de la tensiunea de polaritate negativă. De la ieșirea amplificatorului operațional DA3
prin divizoarele rezistive de tensiune R1R2R3 si R4R5 tensiune constanta
ajunge pe liniile PC0 și PC1 ale microcontrolerului DD2, care sunt configurate ca
Intrări ADC. Condensatorii C1 și C2 suprimă în plus interferența și interferențele. De fapt
voltmetrul digital este asamblat pe un microcontroler DD2, care utilizează
ADC de 10 biți încorporat și sursă internă de tensiune de referință de 1,1 V.

Program pentru microcontroler
scris folosind mediul BASCOM-AVR și permite utilizarea trei-sau
indicatoare LED digitale din patru cifre cu un anod comun sau comun
catod și vă permite să afișați curentul (pentru un semnal sinusoidal) sau
valoarea amplitudinii tensiunii semnalului de intrare, precum și modificarea luminozității
indicator luminos Nivelul logic al semnalului pe linia PC3 specifică tipul aplicat
indicator - cu un anod comun (scăzut) sau cu un catod comun (înalt), și pe linie
PC4 este numărul cifrelor sale, patru pentru mic și trei pentru mare. Program
la începutul lucrului, citește o dată nivelurile de semnal de pe aceste linii și se ajustează
microcontrolerul să funcționeze cu indicatorul corespunzător. Pentru patru biți
indicator, rezultatul măsurării este afișat sub forma X.ХХХ (B), pentru un format de trei cifre
- XXX (mV) până la 1 V și Х.ХХ (V), dacă tensiunea este mai mare de 1 V. Când este utilizat
a unui indicator cu trei cifre, bornele cifrelor sale sunt conectate ca bornele a trei
cei mai semnificativi biți ai celor patru biți din Fig. 1.

Nivelul semnalului de pe linia PC2 controlează
înmulțind rezultatul măsurării cu 10, ceea ce este necesar atunci când se utilizează extern
divizor de tensiune 1:10. Când nivelul este scăzut, rezultatul nu este înmulțit Semnal cu
linia РВ6 controlează luminozitatea indicatorului, când nivel inalt ea
scade. Modificarea luminozității are loc ca urmare a unei modificări a raportului dintre
timpul de iluminare și timpul de stingere a indicatorului în cadrul fiecărui ciclu de măsurare.
Cu constantele specificate în program, luminozitatea se schimbă de aproximativ două ori.
Valoarea efectivă a tensiunii de intrare este afișată atunci când este aplicată liniei PB7
nivel ridicat și amplitudine - scăzută. Niveluri de semnal pe liniile RS2, PB6 și
Programul PB7 analizează măsurătorile din fiecare ciclu și, prin urmare, pot fi
schimbat în orice moment, pentru care este convenabil să folosiți comutatoare. Durată
un ciclu de măsurare este egal cu 1,1 s. În acest timp, ADC efectuează aproximativ 1100
probe, cel maxim este selectat și înmulțit, dacă este necesar, cu
coeficientul necesar.

Pentru constantă măsurată
tensiunea ar fi suficientă pentru o măsurătoare pentru întregul ciclu și pentru alternare
cu o frecvență mai mică de 500 Hz, tensiunea pe condensatoarele C8. C11 se schimbă vizibil
în timpul ciclului. Prin urmare, 1100 de măsurători la intervale de 1 ms permit
înregistrați valoarea maximă a perioadei. Convertor de polaritate
tensiunea de alimentare este asamblată pe cipul DA2 conform circuitului standard. E ziua lui liberă
tensiunea -5 V alimentează comparatorul DA1 și op-amp DA3. Conectorul XP2 este destinat
programarea în hardware a microcontrolerului.

Voltmetrul folosește constantă
rezistențe C2-23, MLT, tuning - seria Bourns 3296, oxid
condensatorii sunt importați, restul sunt K10-17. Microcircuitul 74AC00 poate fi
înlocuiți cu KR555LAZ, tranzistorul KT361G - cu oricare din seria KT3107. Dioda 1N5818
înlocuiți cu orice germaniu sau diodă Schottky cu un curent continuu admis de cel puțin
50 mA. Înlocuirea chipului ICL7660 este necunoscut autorului, dar convertorul
polaritatea de tensiune +5/-5 V poate fi colectată conform unuia dintre cele publicate în
schemele revistei „Radio”. În plus, convertorul poate fi eliminat
complet, folosind o sursă de alimentare stabilizată bipolară. In mod deosebit
ar trebui să vă concentrați pe alegerea unui comparator, deoarece intervalul depinde de acesta
frecvente de operare. Alegerea comparatorului LM319 (analogii KA319, LT319) se datorează a două motive:
criterii - viteza și disponibilitatea necesare. Comparatoare LM306,
LM361, LM710 sunt mai rapide, dar s-a dovedit a fi mai dificil să le achiziționați, deoarece
in plus, sunt mai scumpe. Mai accesibile sunt LM311 (analogul domestic al KR554SAZ) și
LM393. Când instalați comparatorul LM311 în dispozitiv, așa cum ar fi de așteptat,
intervalul de frecvență s-a restrâns la 250 kHz. Rezistorul R6 are un relativ
rezistență ușoară deoarece dispozitivul a fost folosit ca încorporat
voltmetru în generatorul de woofer. Când utilizați dispozitivul într-un contor autonom, acesta
rezistența poate fi crescută, dar eroarea de măsurare va crește din cauza relativ
curent de intrare mare al comparatorului DA1.

Circuit divizor de tensiune 1:10
prezentat în Fig. 2. Aici funcțiile rezistenței R2 din divizor sunt îndeplinite de rezistență
R6 (vezi Fig. 1). Divizorul de tensiune este configurat într-o anumită secvență.
La intrarea sa sunt furnizate impulsuri dreptunghiulare cu o frecvență de câțiva kiloherți,
amplitudine 2...3 V (un astfel de semnal de calibrare este disponibil în multe
osciloscoape), iar intrarea osciloscopului este conectată la ieșire (la pinul 5 al DA1). Ajustare
condensatorul C1 realizează o formă de impuls dreptunghiulară. Urmează osciloscopul
utilizați cu un divizor de tensiune de intrare de 1:10. Toate piesele, cu excepția indicatorului, sunt montate
pe o placă de circuit prototip care măsoară 100×70 mm folosind cablu
instalare Aspect Una dintre opțiunile dispozitivului este prezentată în Fig. 3. Pentru
pentru ușurința de conectare a indicatorului digital, se folosește un conector (nu este prezentat în diagramă
afișate). În timpul instalării, firul comun al mufei de intrare XP1 și bornele condensatorului corespunzătoare
C8, C10, C11 și C13 ar trebui să fie conectate la firul comun într-un singur loc cu fire
lungime minima. Elementele VT1, R20, C8, C10, C11 și C13 și comparatorul DA1
ar trebui să fie plasate cât mai compact posibil, condensatoarele C3, C6 - cât mai mult posibil
mai aproape de bornele comparatorului DA1 și C4, C14, C15 - de bornele microcontrolerului
DD2. Pentru configurare, intrarea dispozitivului este închisă, concluzie generală sonda osciloscopului
conectat la borna pozitivă a condensatorului C13, iar borna de semnal la emițător
tranzistorul VT1. Pe ecran ar trebui să apară un impuls de polaritate negativă
cu o amplitudine de aproximativ 0,6 V și o durată de 0,5 μs. Dacă din cauza frecvenței scăzute
succesiunea impulsurilor va fi greu de observat, apoi temporar paralelă
La condensatorul C11 este conectat un rezistor cu o rezistență de 0,1... 1 kOhm. Voltaj
pe condensatorul C12 este controlat cu un voltmetru de înaltă impedanță, ar trebui să fie
aproape de zero (plus sau minus câțiva milivolți).

Tensiunea de ieșire a amplificatorului operațional DA3
(care nu trebuie să depășească câțiva milivolți) cu rezistența R27
set egal cu zero. Modul de operare necesar al microcontrolerului
stabilite prin furnizarea nivelurilor necesare la liniile PB6, PB7, RS2-RS4, pentru care acestea
conectat la un fir comun sau la o linie de alimentare de +5 V prin rezistențe
rezistență 20...30 kOhm. Un exemplu este conectat la intrarea dispozitivului
voltmetru și serviți presiune constantă 0,95… 1 V. Rezistor subșir
R4 egalizează citirile ambelor voltmetre. Apoi tensiunea este crescută la
2,95...3 V și rezistența R1 egalizează din nou citirile. O selecție de rezistențe
R8-R15 puteți seta luminozitatea dorită a indicatorului. Mai întâi ei selectează
denumirea necesară doar a unuia dintre ele și apoi setați restul. La
de selecție, trebuie amintit că curentul maxim de ieșire al portului aplicat
microcontrolerul nu trebuie să depășească 40 mA, iar consumul total de curent - 200
mA.

De la redactor. Programul pentru microcontroler este pe nostru
FTP-cep-vere la ftp://ftp.radio.ru/pub/ 2011/02/Vmetr.zip

Microcontrolerele ATmega (precum și unele modele din familia ATtiny) au module ADC de 10 biți care pot fi folosite pentru a măsura tensiunea analogică. Aceste ADC-uri sunt ratiometric, adică măsoară relativ la un anumit nivel de referință (de obicei Vcc).
În cazul plăcilor compatibile cu Arduino, care sunt alimentate cu o tensiune reglată de 5 V, aceasta înseamnă că puteți măsura în intervalul 0..5 V, distingând niveluri de 0..1023, obținând în același timp o rezoluție de cca. 5 mV pe pas.
Dacă aveți un „voltmetru”, mai devreme sau mai târziu veți dori să îl utilizați pentru a controla tensiunea furnizată pinii de alimentare a microcontrolerului.
Prima soluție care îmi vine în minte este să conectați piciorul Vcc la una dintre intrările analogice și să apelați funcția analogRead(). Nu a fost cazul - indiferent de tensiunea furnizată ca putere microcontrolerului, ADC-ul va returna aceeași valoare - 1023.
Deci, cum putem determina ce tensiune alimentează microcontrolerul nostru? La urma urmei, acest lucru este de o importanță vitală pentru alimentarea autonomă, deoarece poate detecta rapid când încărcarea bateriei este epuizată.
Sursa de tensiune de referință disponibilă în fiecare (bine, bine, aproape fiecare) model ATmega/ATtiny poate veni în ajutor, producând exact (bine, bine, aproximativ) 1,1 V. Dacă citim această tensiune folosind ca referință tensiunea de alimentare ( Vcc), apoi, după efectuarea mai multor operații aritmetice, putem obține valoarea dorită. Asa de:

  • Să presupunem că ADC-ul nostru a returnat valoarea „x”, care corespunde unei tensiuni de 1,1 V.
  • având 5V ca Vcc ar trebui să obținem o valoare aproximativ egală cu 1100 / 5000 * 1023 = 225
  • Ei bine, dacă am fi făcut același lucru cu Vcc = 3,3 V, ar fi trebuit să obținem valoarea 1100 / 3300 * 1023 = 341
  • sau în general: 1100 / Vcc * 1023 = x
  • După ce am efectuat transformări simple, constatăm că Vcc = 1100 / x * 1023

Adică, trebuie să măsurăm tensiunea de referință internă de 1,1 V și apoi putem spune ce fel de tensiune Vcc alimentează microcontrolerul nostru!
„Este normal, Grigory? Grozav, Constantin!”
Dar așteptați să vă frecați cu bucurie mâinile: din păcate, o funcție folosită pe scară largă în cercurile Arduino analogRead() Nu va fi posibil să forțați măsurarea tensiunii de referință internă. Va trebui să facem un ocol...

Sau, mai degrabă, uitați-vă la fișa de date și, după ce ați adunat câteva informații acolo, faceți manual conversia necesară. Iată cum va arăta pentru Arduino:

Static int vccRead(byte us =250) ( ADMUX = 1<

Întârzierea SUA a fost introdusă în codul funcției vccRead pentru a stabiliza rezultatele măsurătorilor și a crește acuratețea acestora. Un mic experiment numeric arată că rezultatele optime sunt obținute cu o întârziere de 100 µs.

Iată rezultatele pe care le-am obținut pentru diferite valori de latență atunci când sunt alimentate de la USB:

10 µs 50 µs 100 µs 200 µs 300 µs
3049
4278
4295
4137
4167
4311
4311
4152
4121
4311
3827
4829
4871
4808
4748
4829
4850
4829
4829
4808
4669
5068
5091
5068
5068
5091
5091
5068
5068
5091
5138
5138
5138
5138
5161
5138
5138
5138
5161
5138
3641
4688
4768
4768
4688
4748
4768
4768
4748
4650

Uneori trebuie să măsurați amplitudinea tensiunii de rețea, a frecvenței sau a altor parametri. Iată cum o fac - înainte de a porni unitatea de compresor, trebuie să vă asigurați că tensiunea din rețea nu este mai mică decât cea nominală. În caz contrar, motorul nu va porni și supapele pot să nu fie în poziția dorită. Principala dificultate aici este că este foarte de dorit să existe izolație galvanică de tensiunea de rețea. Acestea. Măsurarea tensiunii de rețea direct printr-un simplu divizor poate fi riscantă.

▌Măsurați grosimea sânilor
Inițial, proiectul a inclus următoarea soluție:

Rezistorul absoarbe cea mai mare parte a tensiunii; dioda zener este folosită aici mai mult ca o plasă de siguranță și ca o diodă inversă pentru semi-undă opusă. De fapt, nu este deosebit de necesar.

Ei bine, atunci totul este simplu. Optocuplorul H11L1M are în interior un declanșator Schmitt, adică. Există o anumită histerezis la pornire și oprire. Se aprinde la un curent prin LED-ul său de aproximativ 1 mA și se oprește la un curent de 0,8 mA.

Dacă vă uitați la oscilograma curentului de pe LED, eliminând-o din rezistența R35, veți vedea următoarea imagine pentru 220 de volți:


Rezoluția este de 50mV pe diviziune, declanșatorul este setat la 80mV la cădere.

Ar trebui să pornească la 100 mV și să se oprească la 80 mV, care va fi de 1 mA și, respectiv, 0,8 mA. Cursorele evidențiază momentele de pornire și oprire. Diferența de timp, dx = 8,38 ms

Dacă reduceți tensiunea la 110 volți, atunci:

dx va scădea la 6,94 ms, adică Ce este o milisecundă pentru un microcontroler care ticează la frecvențe megaherți? Da, o sumă colosală! Măsurarea cu precizie cu un temporizator în modul de captură nu este o problemă. Apoi puneți tabelul de corespondență în memorie și, s-ar părea, totul este cool? Da, dar nu chiar...

Soluția este ieftină și simplă. Dar nu foarte precis. Și în unele cazuri nu va fi deloc posibilă aplicarea acestuia.

Întreaga problemă este că durata depinde indirect de amplitudine. Într-o lume ideală, ar trece prin canal, dar rețelele moderne, în special cele industriale, sunt puternic înfundate cu diverși consumatori de impuls.

Ca tot felul de sudori, invertoare, unități puternice și alte lucruri. Ceea ce distorsionează forma sinusului. Făcând, în general, cumva obscen. Și dacă acesta nu este un sinus, ci un fel de prostie, atunci toate construcțiile noastre frumoase bazate pe timpi zboară. În primul rând, precizia scade catastrofal, dar inițial a fost așa. În al doilea rând, va trebui să calibrați de fiecare dată pentru o nouă rețea, tabelele nu pot fi stocate în memorie o dată pentru totdeauna. Ei bine, forma sinusului nu depinde deloc de tine, ci de Welder Cannibal LLC, situat în atelierul vecin.

Deci, puteți distinge în continuare 220 de volți de 110, dar puteți uita de precizia de până la cel puțin 5 volți. Dar în unele cazuri nu este necesar mai mult.

Am avut nevoie dintr-o dată. Prin urmare, începem să refacem proiectul original pe care l-am moștenit de la predecesorul meu.

Primul gând a fost să instalez un convertor tensiune-frecvență pe partea fierbinte, trecându-l prin același optocupler. Dar trebuia hrănit cu ceva pe partea fierbinte. Nu am vrut deloc să instalez o sursă de condensator. Ar fi posibil, desigur, să lipiți un mic modul 220AC-5DC pe un flyback, precum TSP-05. Disponibil pe Ali, este ieftin.

Ar trebui să vă faceți timp pentru a revizui acest modul. Lucru grozav pentru alimentarea oricărei porcării de putere redusă de la 220 de volți. Dar ar fi destul de greoi. Luați în considerare alimentatorul, apoi convertizorul de frecvență de joasă tensiune, optica...

▌Transformator
Al doilea gând a fost un transformator obișnuit. Cumpărați cel mai mic transformator de putere pe care îl puteți găsi și măsurați tensiunea pe piața secundară. L-am întrebat pe Element ce au de acest gen - au luat TPK-2.

În principiu este potrivit, dar s-a găsit o soluție mai bună.

O figurină mică de mărimea unui cub de bulion. Reține până la 3kV pentru defecțiune, raportul de spire este 1:1, dar acesta este un transformator de curent de 2mA:2mA. Adică, furnizăm curent la intrarea sa și eliminăm curentul. Curentul de intrare este pur și simplu setat de un rezistor în serie, iar un rezistor este, de asemenea, utilizat în paralel pentru a obține tensiunea de ieșire.

Acestea. diagrama arata cam asa:

R1 este selectat astfel încât curentul prin înfășurare să nu depășească 2mA, să rețină maximum 10mA, dar după ce se pierde liniaritatea de 2mA și Dumnezeu știe ce se va întâmpla la ieșire. Tensiunea noastră este de 220-250 volți, o luăm conform barei superioare. Dar asta înseamnă acțiune și avem nevoie de amplitudine. Acestea. înmulțiți 250 cu rădăcina lui 2 pentru a obține amplitudinea. 250*1,41 = 353,5 volți. Constatăm că prima rezistență ar trebui să fie de 180 kOhm.

Tensiunea microcontrolerului meu este de 5 volți, așa că este nevoie de rezistența R2, astfel încât la 2 mA să aibă aproximativ 4,5 volți, lăsând jumătate de volt ca rezervă. Aceasta va fi de aproximativ 2,2 kOhm.

Asta este, amplitudinea de ieșire este acum în jur de 5 volți, dar există o ambuscadă. Ea este variabilă. Și avem nevoie de măsurători de 0...5 volți. Ce să fac? Îndreptați.

▌Dă-mi o diodă!

Puteți instala o diodă, aceasta va tăia semi-undă negativă. Dar există o subtilitate aici. Dacă puneți o diodă direct în fața rezistenței de sarcină:

Apoi, pe semiunda inversă, se dovedește că vom întrerupe transformatorul de curent și ce se întâmplă atunci când are loc o pauză sursa actuala? Așa este - tensiune nebună. La urma urmei, el va încerca cu toată puterea să-și împingă 2mA prin rezistența URIAȘĂ inversă a diodei. Ca urmare, o astfel de tensiune va scădea pe dioda D1, încât nu va dura mult timp să se străpungă. Într-o astfel de conexiune, instalați doar o punte sau o diodă inversă D2, astfel încât curentul să aibă întotdeauna căi pe semiundă inversă.

Dar acestea vor fi deja două diode. De ce avem nevoie de un semiconductor suplimentar în circuit? Prin urmare, este mai ușor să lăsați un rezistor paralel și apoi să rectificați tensiunea deja eliminată.

Pentru ca sistemul să funcționeze, este nevoie de un alt rezistor. Faptul este că ADC-ul are o rezistență de intrare foarte mare, comparabilă cu conexiunea inversă a unei diode, deci dioda nu va funcționa, are nevoie de curent pentru a curge. Prin urmare, setăm a doua reducere la 100 kOhm și eliminăm deja semnalul din ea.

Există de fapt câteva dezavantaje aici. Faptul este că dioda noastră are propria sa cădere, așa că vom pierde o parte din amplitudinea ei. Dar asta e o prostie, o putem corecta oricând cu un rezistor, ridicând-o puțin. Ceea ce este mai rău este că caracteristica diodei este neliniară, ceea ce introduce distorsiuni.

Uită-te cu atenție, albastrul este sinusul original de la trans, iar galbenul este semiunda pozitivă de la diodă. Din punctul zero, sinusul merge așa cum ar trebui pentru un sinusoidal, dar semiunda diodei crește cu o curbură exponențială vizibilă și nu atinge cantitatea de cădere pe diodă (0,7 volți aproximativ pentru 1N4148 pe care îl am) .

Exponentul este luat din caracteristica curent-tensiune a diodei

Pentru mine, în proiectul meu, acest lucru nu este foarte critic. Ei bine, va fi un fel de escroc acolo aproape de zero, nu contează.

▌Dioda ta e un rahat, pentru cine mă iei? Dă-mi dioda perfectă!
Dar dacă ar fi critic, atunci aș construi o diodă ideală. Este realizat dintr-o diodă și un amplificator operațional. Există multe scheme diferite, prima care mi-a venit în minte a fost aceasta.

Funcționează simplu.

Amplificatorul are feedback negativ, așa că presupunem că intrările sale sunt scurtcircuitate între ele (scurtcircuit virtual).

Pe semiundă pozitivă, curentul I în =U în /R3 de la intrare curge în pământ prin rezistența R3. Dar, din moment ce în realitate nu există un scurtcircuit acolo, în plus, nimic nu curge sau curge prin intrările amplificatorului operațional (ei bine, aproape, există o cantitate minusculă nesemnificativă în viața reală). Apoi, curentul care curge prin R3 egal cu I in va fi absolut egal cu I out care curge de la ieșirea amplificatorului operațional prin R3 la sol. Formarea unei căderi de tensiune U este direct proporțională cu acest curent prin rezistor. Acestea. U out = I in *R3 = U in Fără nicio distorsiune.

Pe semi-undă negativă, amplificatorul operațional va încerca, prin feedback, să-și scadă ieșirea inversă sub zero pentru a o egaliza cu cea directă. Dar o diodă ambalată acolo nu îi va permite să facă asta. Niciun curent nu va curge prin R3 și nu există curent și tensiune. Ieșirea este 0.

Iată o schemă atât de simplă. Funcționează pe surse de alimentare bipolare și unipolare.

Singurul lucru este că pentru sursa de alimentare unipolară trebuie să luați un amplificator, în primul rând, o sursă de alimentare strict unipolară (Single-supply) și, în același timp, capabilă să accepte valori negative la intrări (Input Common-Mode Voltage) Gama), și în al doilea rând, cu o ieșire șină-2-șină, altfel va tăia vârfurile.

Acestea. Bunurile de larg consum precum LM358 nu vor funcționa, dar ceva precum AD823 se va descurca bine. Pentru alimentarea cu energie bipolară, orice bunuri de larg consum sunt potrivite, ei bine, poate că șina-2-șină nu ar fi de prisos, dar din nou, nivelurile necesare depind de tensiunea de alimentare. Dacă nu aveți nevoie de întreaga gamă de la plus la minus a sursei de alimentare, atunci vom pune orice rahat pentru trei copeici și nu vă faceți griji.

▌Nu! Înfige această diodă, știi unde...

A doua opțiune de comutare este puțin mai bună, nu există nicio diodă:

Aici este inclus direct în op-amp. Raportul rezistențelor este exact același ca în prima opțiune. Transformatorul este scurtcircuitat la pământul virtual, iar curentul care circulă acolo trece prin rezistența OS. Dar, deoarece sursa noastră de alimentare este unipolară, jumătatea de undă inferioară pur și simplu se îngroapă în pământ. Cerințele pentru amplificatorul operațional sunt aceleași ca în circuitul anterior. Rail-2-Rail și alimentare unică.

▌Hei, hei, de ce atâta negativitate? Fii pozitiv, frate!
Ei bine, iată a treia opțiune de includere. Aici nici măcar nu avem nevoie de un opamp; nu îndreptăm sau tăiem jumătatea de undă inferioară, ci îi adăugăm o componentă constantă. Ne aruncăm transa în mijlocul divizorului de tensiune. Rezistorul de pe secundar trebuie selectat astfel încât amplitudinea să nu depășească tensiunea de alimentare și să nu scadă sub aceasta.

Rezultatul arată cam așa:

Primul canal este de la ieșirea circuitului, iar al doilea canal este conectat la mijlocul divizorului. Va fi exact zero din semnalul nostru.

▌Ce zici de Titov China?
Ei bine, pentru orice arduiniști care nu știu să lipize, există un modul gata făcut.

Acestea sunt opțiuni relativ simple pentru măsurarea rețelei și pentru a nu pierde izolarea galvanică.

Prefaţă

În vremurile vechi, pre-digitale, oricine dintre noi trebuia să se mulțumească cu instrumente de măsurare cu arătătoare, începând de la ceasuri obișnuite, cântare și terminând cu... hmm, așa că imediat nu găsim nici măcar limita utilizării lor! Ei bine, să spunem - un microampermetru de laborator de precizie sau chiar mai impresionant - picoampermetru. Și erau destul de multe clase de precizie, în funcție de scop.

De exemplu, un indicator obișnuit al cantității de combustibil dintr-un rezervor de mașină este cel mai clar exemplu de inexactitate maximă a citirilor! Nu cunosc niciun șofer care să se bazeze pe acest „contor de afișare” și să nu alimenteze în avans. Pesimiștii inveterati ai șoferilor nu au condus niciodată fără o canistră de combustibil în portbagaj!

Dar în laboratoare, în special în Comitetul de verificare de stat, au existat comutatori cu o scală în oglindă și o clasă de precizie mult mai bună decât 0,5.

Și aproape toți am fost mulțumiți și fericiți. Și dacă nu erau mulțumiți, atunci și-au achiziționat instrumente mai precise, desigur, dacă se poate!

Dar acum era digitală a sosit. Cu toții am fost fericiți de asta - acum putem vedea imediat cifrele de pe indicatori și suntem mulțumiți de „acuratețea” oferită nouă. Mai mult, în vremurile moderne, aceste „digitale” omniprezente costă cu un ordin de mărime mai puțin decât „comutatorii inexacți” care au devenit o raritate. Cu toate acestea, puțini oameni cred că cantitățile care ni se arată în cifre rămân în continuare analogice, fie că este vorba de greutate sau de puterea curentă - nu contează. Aceasta înseamnă că aceste mărimi sunt încă măsurate analog! Și doar pentru procesare și prezentare acestea sunt convertite într-o valoare digitală. Aici sunt ascunse erorile, ceea ce ne face să surprindem când două termometre de cameră diferite în același loc arată valori diferite!

Calea de la valoarea măsurată la indicator

Să aruncăm o privire asupra întregului proces de măsurare-indicare. Mai mult, aleg în mod deliberat o cantitate electrică. În primul rând, suntem încă pe site-ul inginerilor electronici, nu al fizicienilor termici sau al brutarilor, să-mi ierte licența de comparație! În al doilea rând, vreau să-mi întăresc raționamentul cu exemple din experiența personală.

În primul rând, aleg puterea actuală!

Va trebui să repet platitudinea că pentru a obține o reprezentare digitală a unei cantități analogice, aveți nevoie de un convertor analog-digital (ADC). Dar, deoarece în sine ne este încă de puțin folos, vom avea nevoie de alte noduri pentru a finaliza tot ceea ce este planificat. Și anume:

  1. în fața ADC-ului însuși, aveți nevoie de un dispozitiv de normalizare, să spunem: un amplificator de normalizare sau atenuator, în funcție de raportul dintre valoarea de intrare și domeniul de conversie ADC;
  2. decodor după ADC, pentru a reprezenta echivalentul numeric convertit în codul digital al indicatorului corespunzător.

Există microcircuite gata făcute care combină atât un ADC, cât și un decodor. De exemplu, ICL7136 sau similar, folosit în multimetre.

În esență, toate aceste noduri într-o formă sau alta sunt pur și simplu necesare. Încă nu am numit senzorul în sine - în acest caz, un convertor curent-tensiune sau pur și simplu un șunt.

Deci, să parcurgem pe scurt întregul lanț. Curentul care trece printr-un șunt (un rezistor puternic cu rezistență foarte scăzută) creează o diferență de potențial la polii săi. Guten Tag, Herr Ohm! Dar această diferență este destul de mică și nu fiecare ADC este capabil să convertească complet această valoare, astfel încât semnalul (tensiunea) de la șunt trebuie amplificat la o valoare acceptabilă. Acesta este motivul pentru care este nevoie de un amplificator de normalizare. Acum ADC, după ce a primit o tensiune digerabilă la intrare, va efectua conversia cu cea mai mică eroare posibilă. La ieșirea sa obținem un număr corespunzător valorii curente a curentului măsurat în intervalul selectat, care trebuie decodat corespunzător pentru a fi afișat pe indicator. De exemplu, convertiți-l într-un cod indicator cu șapte segmente.

Aici nu văd nevoia să mă oprim mai în detaliu asupra fiecărei etape de mai sus, deoarece în articol urmăresc un scop diferit. Și detalii se găsesc din abundență pe Internet.

Specificații

Am așa-numitul sarcină electronică cu indicator de debit de curent. Există o diagramă de bază a sarcinii în sine, dar acolo veți avea nevoie de un ampermetru extern pentru a seta mai precis curentul. Am decis să conectez ambele dispozitive pentru a economisi spațiu și pentru a nu avea un stol întreg de multimetre.

Ampermetrul meu încorporat este asamblat și programat pe Tiny26L MK. O parte a acestui ampermetru este al doilea amplificator operațional (gratuit) al cipului LM358, care face parte din circuitul de balast de bază. Acestea. Acesta este amplificatorul meu de standardizare, deoarece căderea maximă de tensiune pe șunt (5A x 0,1 ohm) este de numai 0,5 volți, ceea ce în mod clar nu este suficient pentru întreaga gamă de conversie cu tensiunea de referință internă.

Potrivit lui T.O. (Engleză = Fișă de date) tensiunea nominală a sursei de referință încorporate (ION) este de 2,56 volți. Dimensiune foarte convenabilă! Cu toate acestea, în practică, nu se dovedește atât de grozav: tensiunea ION ajustată a MK-ului meu s-a dovedit a fi de 2,86 volți! Cum am stabilit că acesta este un subiect separat. Să ne întoarcem totuși la o tensiune convenabilă de 2,56 volți. Uite ce se întâmplă: maxim 0,5 volți cade pe șunt, ADC-ul convertește maximum 2,56 volți. Se sugerează un amplificator de normalizare cu un câștig de 5, atunci numărul obținut în timpul conversiei nu va necesita nicio aritmetică avansată pentru a reprezenta rezultatul: 5 amperi = 2,5 volți = 250 de unități (pentru conversia pe 8 biți). Trebuie doar să înmulțiți rezultatul cu doi și să puneți o virgulă zecimală între sute și zeci pentru a obține o reprezentare foarte convenabilă: unități, zecimi și sutimi de amper. Transformarea finală în semne cu șapte segmente este o chestiune de tehnologie. Totul este în regulă, îl poți implementa în hardware!

Totuși, așa cum am arătat deja cu exemplul ION-ului încorporat, nu este atât de ușor să obțineți o precizie acceptabilă (să nu mai vorbim de mare!) cu componentele utilizate. Puteți lua calea compensării erorilor matematic, folosind un program din MK, deși acest lucru va necesita calibrare. Această cale este destul de ușor de implementat în C și alte limbaje de nivel înalt. Dar pentru mine, un asamblator încăpățânat, să joc cu matematica folosind instrucțiunile RISC este o bătaie de cap în plus!

Am ales o cale diferită - corectarea câștigului amplificatorului de normalizare (NA). Nu aveți nevoie de multe pentru asta - un rezistor de tăiere! Valoarea acestuia trebuie aleasă corect, astfel încât domeniul de reglare să fie suficient, dar nu exagerat.

Selectarea elementelor de amplificare normalizatoare

Deci, este necesar să se determine intervalul de reglare. Primul pas este determinarea toleranțelor componentelor. De exemplu, șuntul meu are o toleranță de eroare de 1%. Alte rezistențe din circuitul amplificatorului de normalizare pot avea o toleranță de până la 10%. Și nu uitați de inexactitatea ION-ului nostru, care în cazul meu s-a ridicat la aproape +12%! Aceasta înseamnă că numărul real convertit va fi cu aproape 12% mai mic. Dar din moment ce știu deja această eroare, o iau în considerare în câștigul NU, care ar trebui să fie 5.72. Și deoarece erorile reale ale altor componente nu sunt cunoscute, rămâne de găsit eroarea totală maximă posibilă pentru a calcula intervalul de ajustare.

O simplă sumă a acestor „procente” sugerează: 1% din șunt plus de 2 ori 10% din rezistențele de feedback ale amplificatorului operațional. Total: 21%.

Să vedem dacă chiar așa este. Pentru a face acest lucru, să aruncăm o privire la partea din diagramă în care este prezentat acest NU cu valori deja selectate:

După cum puteți vedea, există un amplificator non-inversător cu un coeficient de transmisie reglabil, teoretic reglabil de la 4,979 la 6,735 la valorile indicate în diagramă. Dar, dacă luăm în considerare eroarea noastră de ±10% posibilă a fiecăruia dintre rezistențe, obținem, cu cea mai proastă combinație, Ku = 5,864 - 8,009, care depășește clar coeficientul necesar! Dacă apare această combinație, atunci va trebui să luați alte denominațiuni. Este mai bine să creșteți imediat valoarea rezistenței de reglare, de exemplu, la 39k. Atunci limita inferioară a lui Ku va fi 5,454, ceea ce este deja acceptabil.

Ei bine, eu – un „adevărat drogat de radio” – a trebuit să aleg un trimmer dintre cele disponibile și am fost pur și simplu norocos să investesc în gamă! Dacă aș avea un trimmer de altă valoare, nu ar conta, aș recalcula R2 și R3, care în cazul meu au o toleranță de 5%, așa că nu a trebuit să iau alt trimmer.

Depășirea neajunsurilor și omisiunilor tale

S-ar părea că totul a fost gândit și calculat - adăugați o taxă. Să testăm mai întâi acest design pe o placă! Făcut repede şi foarte bine! Ku este reconstruit nu așa cum era de așteptat, ci în limitele a ceea ce este necesar. Cu toate acestea, indicatorul nu avea să arate 0,00 când nu exista curent de sarcină! În primul rând, am bănuit că programul era în MK, dar când intrarea ADC a fost scurtcircuitată la firul comun, au apărut zerourile prețuite. Aceasta înseamnă că ceva vine la intrarea MK, în afară de zero volți. Testarea cu un multimetru a confirmat această ipoteză și a stabilit următoarea sarcină. Fără a intra în detalii ale cercetării mele, voi descrie doar rezultatul.

Motivul s-a dovedit a fi următorul: nu am ținut complet cont de faptul că op-amp-ul pe care l-am folosit era departe de a fi de cea mai bună calitate. Nici măcar nu este așa-zis. „șină la șină”. Aceasta înseamnă că potențialul său de ieșire nu va atinge niciodată niciunul dintre polii de alimentare, de exemplu. in cazul meu nu va fi niciodata egal cu 0 volti! Acum, dacă ar fi alimentat de la o sursă bipolară, atunci ieșirea ar fi zero așteptat. Dar sursa mea de alimentare este unipolară și nu am intenționat să complic circuitul cu vreun convertor. Soluția a fost găsită în crearea unui „pământ virtual”, adică. Datorită unei surse de alimentare separate (spre deosebire de circuitul de bază), am putut folosi o diodă pentru a schimba potențialul firului comun în raport cu polul negativ al bateriei.

Deci, placa este gravată și lipită. Este timpul să împachetați acest design într-o carcasă. Ceea ce, de fapt, s-a făcut. Cu toate acestea, în timpul funcționării, a apărut un alt mic defect - derivarea circuitelor de intrare ale amplificatorului operațional. Acest lucru a fost exprimat într-o schimbare negativă a citirilor, de exemplu. la un curent de câteva zeci de miliamperi, indicatorul încă arăta zerouri, ceea ce nu mi se potrivea! Aș permite o schimbare de câțiva mA - totuși unitățile de miliamperi nu sunt afișate. A trebuit să introduc un circuit de polarizare la intrarea NU.

Evaluările lui R4 și RZ sunt selectate astfel încât să ofere o polarizare de plus/minus câteva zeci de milivolți în raport cu „masa virtuală”. Nu am avut nicio dorință să refac placa finită și am adăugat divizorul ajustabil necesar în locul reglajului Ku.

În general, dispozitivul rezultat îmi satisface nevoile. Desigur, poate fi îmbunătățit pentru o lungă perioadă de timp, dar încă nu este nevoie!

Voi vorbi data viitoare despre partea digitală și matematică folosind exemplul unui volt-amperi într-o sursă de alimentare de laborator.