Senzor capacitiv pe microcontrolerele avr și întârzierea prin iterații

Salutări, un fan al microcontrolerelor!

intrare
Continuă să pun în aplicare primul meu proiect, abandonat odată, pe microcontroler - o lampă de stare. Și, așa cum am promis ultima oară, în curs de dezvoltare scriu mici note pentru începători. De data aceasta, să aruncăm o privire asupra modului în care este implementat senzorul capacitiv, iar întârzierile acestor sau acele operații sunt iterații ale bucla principală. În ceea ce privește proiectul în sine, pot spune că în momentul în care a fost scris întregul firmware de lucru. Rămâne să fie o schemă, un sigiliu și o testare într-o glandă normală. Atunci voi pune totul în curtea ta.







Atingeți butonul
Principiul butonului tactil este simplu. Luăm o mică suprafață, indiferent de ce formă, am luat o bucată de textolit în formă de folie (în continuare - buton). Îi lipim un rezistor de înaltă valoare, de ordinul 1 MΩ. Și conectăm butonul prin acest rezistor la sursa de alimentare. Solderăm la buton un fir care va conecta butonul cu un picior al microcontrolerului (mai departe - МК). Site-ul este izolat de un izolator subțire, deși fără el va funcționa. Tamponul butonului are o anumită capacitate, care crește atunci când degetul unei persoane este pe el.

Atingeți butonul. Acoperit cu bandă scotch

Algoritmul este după cum urmează:
1. Transferăm piciorul MC în modul de ieșire.
2. Aplicați un nivel scăzut pentru a descărca capacul butonului.
3. Transferăm piciorul MC în modul de intrare și așteptăm ca capacitatea butonului să fie încărcată prin rezistența de 1 MΩ iar nivelul superior va apărea la intrare. Așteaptarea este efectuată într-un ciclu în care contorul este incrementat.
4. Senzorul este încărcat - valoarea contorului poate fi utilizată pentru a evalua starea senzorului.

Rețineți că numărul iterației este în blocul atomic. Aceasta înseamnă că în acest timp întreruperile nu vor funcționa și nu ne vor determina timp pentru încărcarea senzorului.







Acum, pentru a folosi algoritmul nostru, trebuie să determinăm pragul de declanșare al butonului. Pentru a face acest lucru, în timpul inițializării, efectuăm o calibrare. Și ia ca un prag - o valoare de un sfert mai mult decât se întoarce cu un senzor liber.

Am verificat, pe un senzor gol funcția mă întoarce în mod stabil 15. Și când puneți degetul pe senzor - aproximativ 30. Astfel pragul pe care îl vom avea undeva este 15 + 15/4 = 18.

Apoi, în bucla principală a programului, rămâne să verificăm starea senzorului și să îl comparăm cu valoarea pragului. Dacă este depășită - butonul este apăsat, este necesar să reacționați.

Dacă este necesar, trebuie să adăugați o întârziere la apăsarea unității de procesare, astfel încât prelucrarea să nu funcționeze de mai multe ori la rând.

Eu, timp de câteva zile, am folosit butonul în timp ce depanam firmware-ul pentru lampă - senzorul funcționează clar!

Întârzierea prin repetarea bucla principală
Uneori în bucla principală este necesară efectuarea periodică a unor acțiuni cu o întârziere mare. Spuneți 2 secunde. Cu toate acestea, nu puteți doar să "dormiți" în timp ce faceți acest lucru, deoarece puteți trece prin, de exemplu, apăsând un buton tactil sau alt eveniment. În acest caz, există o cale simplă de ieșire. Luăm contorul, setăm-o la o anumită valoare și fiecare iterație a ciclului principal este decrementată. De îndată ce contorul a devenit zero, întârzierea noastră a expirat și a venit momentul pentru acțiunea noastră. În bucla principală, puteți adăuga o întârziere minimă, ceea ce nu va face critica aspectul evenimentului așteptat.

Astfel, cu ajutorul contoarelor, este ușor să se organizeze diferite întârzieri în bucla principală de program fără a fi ratat evenimente critice și fără a pierde octeți prețioși pe funcții de întârziere costisitoare.

rezultat
Pentru a dilua textul uscat, vreau să arăt vizual rezultatul lecției de astăzi. pentru că Fac o lampă de stare, apoi am folosit un led RGB. În ciclul principal vom schimba 7 culori de curcubeu + roz în cerc. Și când atingeți butonul tactil, doar clipiți albi. Microcontrolerul va funcționa la frecvența de 9,6 MHz, este suficient să eliminați divizorul cu 8 de la fuziuni în mod implicit (faceți CKDIV8 = 1). Bytesurile de fuziune sunt convenabile pentru a calcula aici cu acest calculator.

Întârzierea dintre schimbările de culoare se realizează prin cicluri. Ajustarea luminozității LED-ului se realizează cu ajutorul modulației binare, despre care am scris în detaliu ultima oară.

Schema de modulare în proteus sa dovedit a fi ușor diferită de cea reală: era necesar să se realizeze un senzor capacitiv pe două condensatoare și un comutator. Sursa de alimentare de 5V pentru MK este absentă în circuit, dar este necesar!







Trimiteți-le prietenilor: