Învățați cum să creați dispozitive pe microcontrolere

Indicator de încărcare a acumulatorului

Unul dintre prietenii mei avea nevoie de un indicator de încărcare a acumulatorului de 12V. I-am sugerat să aleagă ceva de la soluții de circuite gata, sunt multe. Dar nu i-a plăcut nimic.







Deci, înainte de mine am stat sarcina:
1. simplitatea designului;
2. componente ieftine;
3. Consumul redus de curent;
4. Indicație intuitivă a gradului de încărcare a bateriei;
5. cât mai multe niveluri de control posibil (nu numai "încărcate", "normal" și "descărcate");
6. Utilizarea proiectului pentru acest articol.

Ca dispozitiv indicator pentru monitorizarea vizuală a nivelului de încărcare, am decis să folosesc un LED RGB (trei LED-uri într-o carcasă) și am decis să indice nivelurile de încărcare cu culoarea luminii LED. Deoarece este necesar un consum redus de curent, am decis să pornesc LED-ul o dată la două secunde.

Acum, cu culoarea afișajului, acceptăm:
1. LED-ul este stins (încărcare completă);
2. alb;
3. albastru-verde (turcoaz);
4. albastru;
5. verde;
6. albastru-roșu (purpuriu);
7. roșu-verde (portocaliu);
8. Roșu (necesită urgent plata).

Ca un dispozitiv de control vom selecta un Attiny13A ieftin, are o "placă" care are un ADC de 10 biți. De asemenea, trebuie să calculăm divizorul de tensiune, deoarece trebuie să monitorizăm tensiunea de la maxim 14.7V, iar tensiunea maximă la intrarea la ADC Attiny13A este de 5V. Calculul se face conform formulei (figura 1):

Am pornit de la acele denominații pe care le aveam în posesia mea. Puteți alege propriul dvs., dar rețineți că dispozitivul nostru ar trebui să consume cât mai puțin curent posibil. Am 12k și 6.2k.

Pentru comoditatea proiectării unui PCB, puteți face acest lucru: intrare ADC, plasați o parte a chipului (vyv.2); ieșiri către LED-uri - pe de altă parte (vyv.5,6,7), port B0 (verde), B1 (albastru), respectiv B2 (roșu).

Ei bine, este posibil pe hârtie sau în altă parte să schițeze schema reală. Am folosit programul nemaipomenit "Rusplan" (figura 3).

HL3 - verde; HL2 - Albastru; HL1 - Roșu.

Circuitul adăugat: D1, D2, R6 - Rezistor separator, diodă și diodă zener, pentru a proteja împotriva polarității inverse și a tensiunii de intrare excesive. Deci, pentru a spune "doar pentru caz".

Să terminăm acum modelul nostru în "Proteus". Conectăm porturile microcontrolerului respectiv portul B0, B1, B2 cu LED-urile necesare și portul B3 (îl vom configura ca ADC) la ieșirea separatorului de tensiune.

E timpul să începem programul de management. Dar, înainte de aceasta, vom descrie verbal algoritmul indicatorului.

1. Trebuie să rupem gama noastră (10.0V - 14.7V) în 8 părți:
4,7 / 8 = 0,59. ia pasul de 0.6B.

2. Scrieți potrivirea culorii-tensiune:
Nu arde - de la 14,7 la (14,7 - 0,6) = 14,1;
ALB - de la 14.1 la 13.5;
TURQUOISE - de la 13.5 la 12.9;
ALBASTRU - de la 12.9 la 12.3;
VERDE - de la 12,3 la 11,7;
PURPLE - de la 11,7 la 11,1;
ORANGE - de la 11.1 la 10.5, putem distinge primul avertisment de încărcare (intermitent suplimentar);
RED - de la 10.5 - ......, puteți evidenția ultimul avertisment despre încărcare (intermitent suplimentar).

3. Acum calculați tensiunea după divizor (la intrarea ADC).

Formula este deja familiară, doar în loc de U1 vom înlocui valorile noastre, obținem:
Nu arde - de la 5.00 la 4.80;
ALB - de la 4.80 la 4.60;
TURQUOISE - de la 4.60 la 4.40;
BLUE - de la 4.40 la 4.19;
GREEN - de la 4.19 la 3.99;
PURPLE - de la 3.99 la 3.78;
ORANGE - de la 3.78 la 3.58, puteți selecta primul avertisment despre încărcare (intermitent suplimentar);
RED - de la 3.58 - 0.00, puteți evidenția ultimul avertisment despre încărcare (intermitent suplimentar).

Ei bine, tot ce avem nevoie este deja acolo. Executați AVR. Permiteți-mi să vă că salvați fișierul de proiect (de exemplu, „indicator“) trebuie să fie localizat în directorul rădăcină al orice unitate într-un dosar cu un nume format din doar litere amintesc, și în numele fișierului trebuie să fie utilizat numai litere.

Puneți imediat o buclă infinită astfel încât controlerul să nu termine executarea programului și să nu uitați să o faceți mai târziu. Configurați intrarea, selectați "intrări", "ADC" și observați cum a apărut panoul torsiune (fig.5, 6).

Alegem "proprietățile" "twirl", eu îmi place foarte mult răsucirile mari, așa că voi alege dimensiunea maximă. Selectăm "conexiune", specificăm: la noi o concluzie "2", este ADC3, o selectăm (рис.8).

Configurați ieșirile (avem LED-uri), portul roșu B2, portul albastru B1, portul verde B0. Pentru aceasta alegem: "ieșiri", "LED". În consecință, în proprietățile extinse, selectăm culoarea LED-ului și polaritatea sa. În ultimul articol am inclus LED-uri cu un catod comun, să le includem acum cu un anod comun, deci alegem: "polaritate", "LOW". În proprietățile conexiunii, specificați porturile corespunzătoare pentru fiecare dintre ele (Figura 9-17).

Apoi, trebuie să citiți datele de la ADC (ADC). Trageți "macrocomandă componentă", "proprietăți", selectați "ADC0". În coloana din dreapta vedem inscripțiile - "ReadAsByte, ReadAsInt, ReadAsVoltage, ReadAsString". De fapt, tensiunea la intrarea ADC poate fi citită în moduri diferite. In variabilele "Flaukode" sunt astfel: INT (-32768 ...... 0.32767), BYTE (0 ...... 255), STRING PUNCTUL FLOATING (virgulă mobilă). În Attiny13 format din zece cifre ADC, aceasta înseamnă că valoarea maximă citită de codul de ADC este egal cu 1023. Aceasta este, ADC au de tensiune de la 0 la 5V, iar ieșirea este codul de la 0 până la 1023. Pentru a utiliza măsurarea mai precisă de tensiune trebuie să utilizați o variabilă INT, în cazul în care nu au nevoie de mai multă precizie, puteți utiliza BYTE tip, apoi, respectiv: intrare 0 ... .5v și variabila va lua valori de la 0 ... .255. Să folosim toate cele zece cifre (0 ... .1023) și să recalculează tensiunile (p.5) în codurile ADC.

1. Nu arde - 5.0V ... .4.8V
1023 ... .982.

2. WHITE - 4,8V ... .4.6V
982 ... .941.

3. TURQUOISER - 4.60V ... .4.40V
941 .... 900.

4. BLUE - 4,40V ... .4.19V
900 ... 857.

5. VERDE - 4.19V ... .3.99V
857 ... 816.

6. PURPLE - 3.99V ... .3.78V
816 ... .773.

7. ORANGE - 3.78V ... .3.58V
773 ... .733.

8. RED - 3.58V ... .0.00V
733 ... .0.

Să continuăm. În coloana din dreapta vedem inscripțiile - "ReadAsByte, ReadAsInt, ReadAsVoltage, ReadAsString". Desigur, alegeți "ReadAsInt", apoi faceți clic pe "variabile". trebuie să desemnați variabila noastră (figurile 19, 20, 21).

Acum, codul ADC după fiecare măsurătoare este stocat într-o variabilă de tip INT sub numele "u_input" (Fig.22).







Dacă codul citit de la ADC este mai mic sau egal cu 982 (4.8V), activați culoarea albă (toate cele trei LED-uri). Utilizați "decizia", ​​operatorul de ramură. Trageți-o și în proprietăți, comparați valoarea variabilei "u_input", cu numărul 982 (figurile 24, 25).

În plus, dacă u_input este mai mică sau egală cu 941, culoarea este turcoaz, respectiv, activăm LED-urile albastre și verzi (figura 26).

Asta am obținut (figura 27).

Acum, să ne amintim ultimele două puncte ale algoritmului nostru. Când tensiunea bateriei este sub 11,1V. ar fi drăguț să evidențiați o clipire suplimentară a LED-urilor cu culoarea corespunzătoare care avertizează că bateria are nevoie de încărcare.

Cum să "clipi" LED-urile? Puteți veni cu voi înșivă. Am făcut trei clipuri scurte pe portocaliu (roșu, verde) și cinci scurte pe roșu. În ultimul articol a fost: tragerea buclă, setarea numărului de cicluri etc. (Figura 28).

În continuare, trebuie să verificăm ce avem. Începem simularea.

Cine nu lucrează, nu-ți face griji. Nimeni nu este imun la greșelile automate. Bună este depanarea, puteți trece prin programul și puteți observa evenimentele și variabilele. Sunt sigur că o poți face! Figura 29 prezintă algoritmul complet.

Învățați cum să creați dispozitive pe microcontrolere

Fig. 29 (Algoritm)

Continuăm să compilam proiectul. Pentru a coincide cu durata de pauză specificată în proiect, este necesar pentru a expune aceeași frecvență de ceas ca în „Proteus“ și în „flaukode“ folosi oscilator intern cu 9.6Mgts de frecvență (ris.30,31).

Apoi compilam proiectul (Fig.32.33).

Codul HEX pe care l-am primit. Așa-numitul firmware. Programul pentru "SI" este localizat în dosarul cu fișierele la articol.

Acum să conducem simularea în "proteus".

Plăcile de circuite imprimate se pot dezvolta proprii, sub carcasa dorită, dimensiunile componentelor etc. Am folosit bine-cunoscutul program "Sprint layout5.1". Plata mea este sub LUT (Fig.34).

Firmware-ul microcontrolerului

Programatorul este construit în conformitate cu această schemă, există mai multe, dar îmi place acest lucru (Fig.35).

Software pentru firmware.

Puteți utiliza celălalt, cel mai important lucru este să îl puteți utiliza.

Din punct de vedere fizic, biții de fuziune sunt localizați în patru octeți speciali:
- Blocarea Bit Byte - blocare biți pentru a proteja programul de copiere;
- Fuse Extended Byte - byte suplimentar - funcții speciale;
- Fuse High Byte - byte înalt;
- Siguranță Low Byte - low byte.

Din punct de vedere istoric, se întâmplă astfel că, dacă fuziunea este egală cu:
0 înseamnă programat / aprins / activ
1 - înseamnă NU programată / NU cusută / Neactivată.

CKSEL - selectarea ceasului pentru microcontroler.
Pentru funcționarea microcontrolerului (ca și pentru orice procesor) sunt necesare impulsuri de ceas. Sursa semnalului de ceas poate fi:
- generatorul RC intern. Nu sunt necesare elemente suplimentare. Convenabil, dar generatorul RC are o precizie mică (până la 10% eroare) și, în plus, "plutește" de la temperatură. Pentru aplicații care nu sunt critice în timp, este foarte util.
- Rezonator cuarț extern (sau ceramic). Avem nevoie de un rezonator, plus două condensatoare de 15-30 pF. În consecință, două picioare ale microcontrolerului vor fi ocupate - XLAT1 și XLAT2. Se utilizează atunci când măsurătorile de timp exacte sau frecvența de operare a microcontrolerului sunt necesare mai mari decât oscilatorul intern RC care poate furniza.
- Puteți încă să activați microcontrolerul de la o sursă de ceas extern. Poate fi un alt microcontroler (pentru lucrul de sincronizare) sau un circuit extern care dă semnalul dorit. Semnalul de ceas este alimentat la piciorul XLAT1.

WDTON - include ceasul ceasului câinilor.
Pentru aplicațiile responsabile, unde nu este permisă suspendarea programului (fie o eroare de programare sau o întrerupere dăunătoare), utilizați Ceasul de urmărire a câinilor. Acesta este cronometrul intern al microcontrolerului, care rulează de la generatorul său independent. Când acest timer depășește, microcontrolerul este resetat și pornește programul de la început. Programatorul trebuie să introducă în programul de testare (de obicei în bucla principală) o comandă specială pentru a zero acest timer (WDR). Comanda este executată periodic și temporizatorul este resetat, fără a lăsa să se reverse. Dacă microcontrolerul "se blochează" oprește comenzile de zero, timerul se deplasează și resetează microcontrolerul.
WDTON = 1 - Urmăriți cronometrul pentru câini - dezactivat (poate fi activat programabil);
WDTON = 0 - Urmăriți ceasul de câine - activat (nu poate fi oprit programat).
În aplicații normale nu este necesară.

SCKDIV8 - împărțirea frecvenței ceasului cu 8.
Aici totul este simplu:
SCKDIV8 = 1 - microcontrolerul funcționează la frecvența oscilatorului principal;
SCKDIV8 = 0 - microcontrolerul funcționează la o frecvență de 8 ori mai mică decât frecvența oscilatorului principal.

SUT - specifică viteza de pornire a microcontrolerului.
După eliminarea "resetării" (sau alimentării), programul scris în microcontroler nu începe să funcționeze imediat. Microcontrolerul așteaptă un timp, pentru ca generatorul de ceas să pornească în mod corespunzător, tensiunea de alimentare este setată etc. Timpul de așteptare înainte de începerea programului și setarea biților SUT1 ... 0. Cel mai adesea nu suntem o viteză de lansare critică, așa că vă sfătuiesc să vă puneți la maxim.

RSTDISBL-vă permite să utilizați piciorul Reset ca un alt port I / O. Uneori lucrul potrivit, dar trebuie să știți că după programarea RSTDISBL microcontrolerul nu mai poate fi fulgerat cu un programator secvențial! Prin urmare, fără prea multă nevoie, nu o atingeți.
RSTDISBL = 1 - piciorul de resetare acționează ca reset;
RSTDISBL = 0 - piciorul de resetare acționează ca un alt port I / O, programarea în serie este dezactivată.

SPIEN - permisiune de programare în serie.
Setarea implicită este programată (0) - programarea serială este activată.
SPIEN = 0 - programarea serială este activată;
SPIEN = 1 - programarea în serie este interzisă.

BODLEVEL și BODEN - monitorizarea tensiunii de alimentare a microcontrolerului (detector de maro).
Dacă sursa de alimentare a microcontrolerului scade la cea mai mică valoare acceptabilă sau puțin mai mică, atunci funcționarea microcontrolerului va fi instabilă. Posibile acțiuni eronate, pierderi de date, ștergerea accidentală a EEPROM. Microcontrolerul poate monitoriza nivelul de putere (BODEN = 0) și când atinge nivelul setat de biții BODLEVEL, acesta este resetat și rămâne în RESET până când nivelul crește până la nivelul de operare. În aplicațiile non-critice pe care nu le puteți folosi.

SELFPRGEN este un pic care permite programului să scrie în memoria programului. (Microcontrolerele AVR pot, în timpul lucrărilor, să modifice conținutul zonei programului, adică să se programeze).
SELFPRGEN = 1 - schimbarea zonei programului este interzisă;
SELFPRGEN = 0 - este permisă modificarea zonei programului.

EESAVE - protecția EEPROM împotriva ștergerii.
Când comanda de ștergere completă a microcontrolerului este trimisă (de obicei se face cu fiecare programare de cristal), EEPROM este, de asemenea, șters. Dacă doriți ca EEPROM să rămână neatinsă - activați această siguranță. Acest lucru este important dacă memoria EEPROM stochează date importante.
EESAVE = 1 - ștergeți EEPROM-ul cu Flash;
EESAVE = 0 - lăsați EEPROM când curățarea este intactă.

Învățați cum să creați dispozitive pe microcontrolere

Acestea sunt extrase din fișa tehnică ATtiny13. Căutați-l în fișierele articolului și, de preferat, învățați.

Expunem fuzzy în cazul nostru (specific), cu extrase din fișa tehnică și fotografii pentru claritate și înțelegere.

Mai întâi avem peste CKSEL1, CKSEL0. Prin referința 5, citim: "Setarea implicită a CKSEL1..0 are ca rezultat oscilatorul intern RC @ 9.6 MHz. Consultați Tabelul 18-3 pentru detalii ", în mod implicit acești biți sunt setați la un oscilator RC intern cu o frecvență de 9,6 MHz. Iar detaliile setărilor pot fi găsite la pagina 118 din fișa tehnică, în tabelul 18-3. Și mai jos (Fig.38-41) afișează toate opțiunile pentru setările CKSEL1, CKSEL0.

Acesta este modul în care tuningul CKSEL funcționează de la oscilatorul intern cu o frecvență de 9,6 MHz în chipblaster (în stânga) și în proteus (din dreapta), (fig.42).

Următoarea fuziune este SUT0, SUT1. Valoarea implicită a SUT1..0 determină timpul maxim de pornire pentru sursa ceasului implicit. Pentru detalii, consultați Tabelul 18-3.

Am ales-o la maxim 64 ms. (Fig.43, 44).

Alte siguranțe:
CKDIV8 - nu este nevoie să împărțim frecvența ceasului cu 8, nu o atingem;
WDTON - nu avem nevoie de un paznic, nu-l atingem;
EESAVE - pentru a proteja EEPROM-ul de la ștergerea noastră, de asemenea, pentru orice, lăsăm-o așa cum este;
RSTDSBL - nu folosim pinul 1 al microcontrolerului ca port I / O și dacă nu dorim să rămânem fără microcontroler, nu îl atingem;
BODLEVEL - vom avea o sursă de energie stabilă (baterie), nu avem nevoie de această fuziune, lăsăm așa cum este;
SPMEN este un SELFPRENIU redenumit, din programul nostru nu am zalazim în memoria programului, așa că și noi nu îl atingem.

Asta am obținut, într-un ambalaj transparent etanșat cu adeziv topit (Fig.47, 48), sper că veți fi mai bine!







Trimiteți-le prietenilor: