Implementarea microcontrolerelor cu sarcini specifice simplifică proiectele complexe

Prin transferarea sarcinilor și acțiunilor de la microcontrolerul sau microprocesorul principal, microcontrolerele cu sarcini specifice contribuie la simplificarea procesului de proiectare pentru o varietate de aplicații.

by gabi

În lumea de astăzi, microcontrolerele mari pe 32-biți (MCU) și microprocesoarele (MPU) care rulează un sistem de operare în timp real (RTOS) sunt din ce în ce mai frecvente. Cu toate acestea, un singur microcontroler de mari dimensiuni care gestionează o aplicație complexă poate întâmpina probleme legate de resursele CPU în ceea ce privește micile sarcini de întreținere, care nu sunt complexe, dar care consumă timp.

Dispozitivele mai mici, cum ar fi microcontrolerele pe 8- și 16-biți, pot fi utilizate pentru a prelua aceste sarcini de la dispozitivul pe 32-biți, fapt care stimulează inovarea și dezvoltarea pe toată gama de microcontrolere, de la 8-biți până la 32-biți.

Multe sarcini ar fi mai ușor de gestionat dacă dispozitivul pe 32-biți ar transfera unele dintre aceastea către subprocesoare care se pot ocupa doar de una sau două dintre aceste sarcini pentru care au nevoie de puțină supraveghere pentru a le îndeplini. Acest lucru eliberează resurse CPU din procesorul principal, ceea ce reduce complexitatea software-ului, îmbunătățind în același timp performanța și timpul de execuție.

De exemplu, un microcontroler pe 8-biți poate fi utilizat pentru a crea un expander I/O. Acestea nu sunt dispozitive complexe, dar consumă mult timp de procesare din cauza deservirii frecvente a întreruperilor. Prin utilizarea unui microcontroler dedicat pentru această sarcină, dispozitivul mai mare poate reduce utilizarea I/O și numărul de întreruperi pe care trebuie să le gestioneze. În plus, setul de caracteristici al expanderului I/O este setat în software, ceea ce îi permite să fie personalizat și ajustat pentru aplicație.

Figura 1: Tabelul de căutare al unui expander I/O avansat  — © Microchip Technology

Principalul beneficiu al creării unui expander I/O folosind un microcontroler pe 8-biți este flexibilitatea. Setul de caracteristici al unui expander I/O ASIC este încorporat în dispozitiv, în timp ce microcontrolerul își definește comportamentul pe baza software-ului pe care îl execută. Această flexibilitate permite ca versiunea bazată pe microcontroler să fie adaptată pentru a corespunde nevoilor aplicației finale.

Implementarea unui expander I/O avansat

La nivel intern, expanderul I/O avansat operează pe o structură bazată pe tabele de căutare. Înainte de citire sau scriere, se trimite o adresă virtuală. Această adresă nu este corelată cu regiștrii microcontrolerului – ea este specifică doar tabelului de căutare. Astfel, funcțiile care nu se află în regiștrii fizici ai microcontrolerului pot fi adăugate transparent. De asemenea, intrările din tabel pot fi ușor rearanjate pentru utilizări specifice. Un alt beneficiu al acestei structuri este abilitatea de a adăuga permisiuni la tabelul de căutare. De exemplu, pentru a crea un registru doar pentru citire, este suficient să omiteți intrarea din tabelul de căutare pentru scriere.

Figura 2: Stocarea memoriei în dispozitiv  — © Microchip Technology

Această structură mai complexă se pretează, de asemenea, la funcționalități non-standard. Funcția “MEM OP” permite microcontrolerului să salveze sau să încarce în memorie configurația curentă a intrărilor și ieșirilor de uz general (GPIO).

MEM OP poate, de asemenea, să reseteze configurația GPIO la parametrii setați la compilare.

Opțional, microcontrolerul poate fi setat să încarce setările salvate la pornire. Dacă este activat, microcontrolerul încearcă să încarce setările din configurația 0. Dacă configurația nu reușește validarea sumei de control, atunci microcontrolerul va reveni la constantele din timpul compilării. Dacă nu se dorește, această caracteristică poate fi dezactivată în software.

Figura 3: Funcționalitatea MEM OP  — © Microchip Technology

Avantajul soluției bazate pe microcontroler constă în flexibilitatea extremă. Spre deosebire de ASIC-urile de pe piață, microcontrolerul poate fi configurat cu funcționalități non-standard specifice aplicației utilizate. Această aplicație a fost dezvoltată pentru familia de microcontrolere de uz general PIC16F15244. Codul sursă este disponibil pe Microchip Discover (https://mplab-discover.microchip.com/) și Github.

Convertor tensiune-frecvență (V/F)

Convertorul tensiune-frecvență (V/F) demonstrează utilizarea perifericelor hardware pentru a crea o funcție independentă de nucleu care, în mod normal, ar trebui să fie creată cu un circuit integrat extern. Unul dintre cele mai mari avantaje ale acestei configurații este acela că perifericele sunt configurate în software, ceea ce face ca exemplul să fie ușor de modificat. Un alt beneficiu este implementarea convertorului în microcontroler, ceea ce reduce lista de materiale (BOM) și suprafața de proiectare necesară.

Figura 4: Convertor tensiune-frecvență – TC9400 – Diagrama bloc funcțională  — © Microchip Technology

O provocare a abordării bazate pe microcontroler este că aceasta nu este la fel de performantă ca soluția analogică, deoarece rezoluția ieșirii este limitată în mod intrinsec de ADCC (Analog-to-Digital Converter with Computation). Practic, ADCC-ul are 12-biți, dar a fost configurat pentru o rezoluție supraeșantionată pe 14-biți. De asemenea, oscilatorul controlat numeric (NCO – Numerically Controlled Oscillator) de pe placă, utilizat pentru a sintetiza frecvența de ieșire, are o rezoluție finită și poate avea oscilații la ieșire, în funcție de valoarea măsurată de ADC.

Pentru a implementa această soluție, există trei blocuri distincte de periferice – un bloc de eșantionare analogică, un bloc oscilator de ieșire și un generator de ciclu de lucru.

Figura 5: Diagrama bloc a soluției  — © Microchip Technology

Bloc de eșantionare analogică

Blocul de eșantionare analogică este responsabil pentru conversia analog-digitală. Pentru a putea obține o ieșire de 100 kHz în limitele de frecvență ale dispozitivului, ADCC a fost configurat să acumuleze mai multe eșantioane, apoi să facă o medie pentru a obține un rezultat supraeșantionat pe 14-biți.

Un dezavantaj al acestei supraeșantionări este zgomotul statistic suplimentar adăugat la rezultat. Zgomotul este compensat prin medierea supraeșantionării și prin adăugarea de histerezis. Pentru a implementa histerezisul, se utilizează funcția de întrerupere de prag a ADCC-ului. (Pentru simplificare, vor fi abordate doar aspectele specifice legate de modul în care acest exemplu utilizează caracteristica de întrerupere de prag).

Figura 6: Implementarea blocului de eșantionare analogică  — © Microchip Technology

Atunci când ADCC termină de calculat media supraeșantionării, rezultatul este comparat cu valoarea dintr-un registru de referință din periferic. Dacă diferența dintre cele două este mai mare sau mai mică decât pragurile setate, atunci este declanșată o întrerupere. CPU maschează întreruperea fără a fi afectată, însă această întrerupere declanșează un acces direct la memorie (DMA) care copiază rezultatul mediei supraeșantionării în registrul de referință al ADCC, care actualizează punctul mediu al histerezisului. Dacă pragurile nu sunt depășite, atunci această copie DMA nu va avea loc, ceea ce nu va declanșa actualizarea DMA a blocului oscilatorului de ieșire.

Blocul oscilatorului de ieșire

Figura 7: Structura blocului oscilatorului de ieșire  — © Microchip Technology

Blocul oscilator de ieșire al acestei soluții este responsabil pentru generarea unui semnal de ceas la frecvența de ieșire dorită. Semnalul de ieșire este conectat intern la generatorul de ciclu de funcționare, care înjumătățește frecvența de ieșire, dar creează o ieșire cu un ciclu de funcționare de 50%. Datorită acestui fapt, blocul oscilator de ieșire funcționează la o frecvență dublă față de cea de ieșire.

Inima blocului oscilator de ieșire este un oscilator controlat numeric (NCO). Perifericul NCO funcționează prin adăugarea unei valori incrementale într-un acumulator pe frontul de creștere al unui ceas de intrare. Depășirea acumulatorului este utilizată pentru a deriva ieșirea perifericului. (Pentru explicații complete privind NCO, consultați fișa tehnică).

În acest exemplu, NCO2 a fost configurat pentru a crea intern frecvența de ceas de intrare necesară pentru a obține o ieșire de 100 kHz de la o intrare de 14-biți. Este utilizat rezultatul pe 14-biți deoarece rezultatul nativ pe 12-biți de la ADCC nu este suficient de mare pentru a genera ieșirea de 100 kHz fără o sursă externă de ceas.

Rezultat ADC Ieșire NCO1 (dublată) Frecvența de ieșire
0x0000 0 Hz 0 Hz
0x0001 12.2 Hz 6.1 Hz
0x0100 3.1 kHz 1.6 kHz
0x1000 50 kHz 25 kHz
0x3FFF 200 kHz 100 kHz

Ieșiri ideale ale convertorului V/F de 100 kHz, cu Watchdog-ul oprit.

Dacă frecvența de ieșire a NCO2 este modificată sau dacă se utilizează o sursă alternativă, frecvența de ieșire va fi scalată la un interval de ieșire diferit. De exemplu, dacă NCO2 este redus la 1,28 MHz, ieșirea atinge maximul la 10 kHz.

Rezultat ADC Frecvența de ieșire NCO1 (dublată) Frecvența de ieșire
0x0000 0 Hz 0 Hz
0x0001 1.2 Hz 0.6 Hz
0x0100 312.5 Hz 156.3 Hz
0x1000 5 kHz 2.5 kHz
0x3FFF 20 kHz 10 kHz

Ieșiri ideale ale convertorului V/F de 10 kHz, cu Watchdog-ul oprit.

Generator Duty Cycle

Blocul ‘Duty Cycle Generator’ al acestei soluții este responsabil pentru crearea unei ieșiri cu un ciclu de funcționare de 50%. Această caracteristică este opțională – ieșirea de la NCO poate fi utilizată direct, deși ciclul de funcționare variază într-o măsură mult mai mare.

Figura 8: Diagrama bloc a generatorului de ciclu de funcționare  — © Microchip Technology

Acest generator este implementat utilizând una dintre celulele logice configurabile (CLC). Acestea sunt mici blocuri logice configurabile, asemănătoare unei celule dintr-o configurație FPGA (Field Programmable Gate Array). CLC-urile pot fi utilizate ca porți logice discrete, cum ar fi AND-OR sau OR-XOR. Ele pot fi, de asemenea, configurate ca latch-uri sau circuitele basculante bistabile (flip-flop). În această soluție, un CLC a fost implementat ca un flip-flop J-K cu resetare. J și K sunt menținute la nivelul logic HIGH. Blocul oscilator de ieșire este utilizat ca ceas pentru flip-flop. Fiecare impuls de ceas de intrare determină comutarea ieșirii, ceea ce generează un ciclu de funcționare de 50%. Notă: oscilația frecvenței provenită de la blocul oscilator de ieșire va afecta ciclul de funcționare.

Timerul 6 este utilizat ca un temporizator astabil “watchdog”. Dacă ieșirea nu produce un front (crescător sau descrescător), atunci temporizatorul se va supraîncărca și va genera un impuls de ceas către CLC. Acest lucru controlează partea inferioară a intervalului de frecvență de ieșire. În loc să ajungă la curent continuu, ieșirea comută la jumătate din frecvența temporizatorului, pentru o ieșire de 6 Hz.

Pentru implementarea exemplului, a fost selectată familia de microcontrolere PIC18-Q43 datorită numărului mare de periferice utilizate. Codul sursă pentru acest proiect este disponibil pe Microchip Discover (https://mplab-discover.microchip.com/) și Github.

Concluzie

În timp ce microcontrolerele și microprocesoarele de înaltă performanță sunt aici pentru a rămâne, microcontrolerele pe 8- și 16-biți sunt instrumente neprețuite pentru realizarea unor sarcini mici și specializate. Sarcinile nu sunt neapărat complexe, dar pot consuma mult timp sau pot fi critice. Prin externalizarea sarcinilor, dispozitivele pe 32-biți pot avea implementări mai simple care îmbunătățesc fiabilitatea, reduc utilizarea memoriei și consumul de energie.

Autor Robert Perkel

Microchip Technology   |   https://www.microchip.com

S-ar putea să vă placă și

Adaugă un comentariu