Principiile microcontrolerului

13. Principiile de sănătate; Sistemul NEW START - Dr. Călin Mărginean (Iunie 2019).

$config[ads_text] not found
Anonim

Principiile microcontrolerului

Circuite digitale


Intrebarea 1

Citiți următoarea citare și apoi studiați termenul de microcontroler pentru a vedea ce relevanță are pentru citare:

Am fost la prima mea conferință de calculatoare de la New York Hilton acum 20 de ani. Când cineva a prezis că piața pentru microprocesoare ar fi în cele din urmă în milioane, altcineva a spus: "Unde vor merge toți" # 1 "> Răspundeți răspunsului Ascundeți răspunsul

Te las să faci temele la această întrebare!

Note:

Citat nu este doar amuzant, dar este și surprinzător, mai ales pentru cei dintre noi care s-au născut fără calculatoare în casele noastre, cu mult mai puține computere personale.

Un punct pe care doresc să-l fac în studierea termenului de "microcontroler" este acela de a vedea că majoritatea computerelor existente nu fac parte din soiul pe care îl gândește în mod obișnuit prin eticheta "computer". Acele computere pentru uși - precum și controlul motorului computerele din automobile, aparatele de bucătărie, telefoanele celulare, implanturile biomedicale, cardurile de ziua de naștere și alte dispozitive mici - sunt mult mai mici și mult mai specializate decât computerele "de uz general" pe care oamenii le folosesc la birouri pentru a scrie documente sau naviga pe internet. Acestea sunt partea silențioasă și nevăzută a "revoluției computerizate" moderne și, în multe privințe, sunt mai potrivite pentru studenții care încearcă să exploreze electronice digitale decât omologii lor mai mari, cu scop general.

intrebarea 2

O unitate de microcontroler sau MCU este un tip special de calculator digital folosit pentru a asigura secvențierea automată sau controlul unui sistem. Microcontrolerele diferă de computerele obișnuite digitale, fiind foarte mici (de obicei, un singur chip integrat), cu mai mulți pini dedicați pentru intrarea și / sau ieșirea semnalelor digitale și memorie limitată. Instrucțiunile programate în memoria microcontrolerului o spun cum să reacționeze la condițiile de intrare și ce tipuri de semnale trebuie trimise la ieșiri.

Cel mai simplu tip de semnal "înțeles" de un microcontroler este un nivel de tensiune discret: fie "mare" (aproximativ + V) sau "scăzut" (potențial aproximativ al solului) măsurat la un pin specificat pe cip. Tranzistorii interni ai microcontrolerului produc aceste semnale "înalte" și "joase" la pinii de ieșire, acțiunile lor fiind modelate de comutatoarele SPDT pentru simplitate:

Microcontrolerele pot fi programate pentru a emula funcțiile de porți logice digitale (AND, OR, NAND, NOR etc.) în plus față de o gamă largă de funcții combinaționale și multivibrator. Singurele limite reale la ceea ce poate face un microcontroler sunt memoria (cât de mare poate fi stocată un program) și pinii de intrare / ieșire de pe cipul MCU.

Cu toate acestea, microcontrolerele sunt ele însele constituite din multe mii (sau milioane!) De circuite de poartă logică. De ce ar fi logic să folosiți un microcontroler pentru a efectua o funcție logică pe care o mică parte din porțile constituentei ar putea să o realizeze direct "# 2"> Dezvăluiți răspunsul Ascundeți răspunsul

Ușurința de configurare și flexibilitate!

Note:

Rețineți că nu m-am deranjat să-mi explic răspunsul meu extrem de tare. Acesta este un subiect pe care îl doresc elevilor să se gândească mult și mult, pentru că răspunsul (răspunsurile) real la această întrebare sunt motivele care conduc la dezvoltarea tuturor dispozitivelor digitale programabile.

Întrebarea 3

Un student decide să construiască un circuit de lumină cu ajutorul unui microcontroler în locul unui timer 555 sau al unui alt circuit astabil cu cablu dur. Din păcate, există o problemă undeva. Când este alimentat pentru prima oară, LED-ul se aprinde timp de 1 secundă, apoi se oprește și nu mai pornește din nou. Singurul mod în care LED-ul se aprinde vreodată este dacă MCU-ul este resetat sau puterea lui este deconectată și pornită:

Declarați Pin0 ca ieșire

ÎNCEPE

Setați Pin0 HIGH

Întrerupeți timp de 1 secundă

Setați Pin0 LOW

Sfârşit

Un coleg, când este rugat să vă ajute, modifică înregistrarea programului și îl retransmite de pe computerul personal unde este editat la microcontroler, printr-un cablu de programare. Lista de programe citește acum:

Declarați Pin0 ca ieșire

BUCLĂ

Setați Pin0 HIGH

Întrerupeți timp de 1 secundă

Setați Pin0 LOW

ENDLOOP

Când MCU este resetat cu noul program, LED-ul începe să clipească și să clipească. . . un fel de. LED-ul este "pornit" de cele mai multe ori, dar o dată la fiecare secundă se oprește și apoi revine imediat. De fapt, perioada "off" este atât de scurtă încât abia se poate observa.

Ceea ce a dorit elevul a fost un ciclu de taxare de 50%: "activat" timp de 1 secundă, apoi "oprit" timp de o secundă, repetând ciclul pe o perioadă nedeterminată. În primul rând, explicați semnificația modificării programului de clasă și apoi modificați din nou lista de programe astfel încât LED-ul să facă ceea ce studentul dorește.

Revelați răspuns Ascundeți răspunsul

O "buclă" este necesară pentru ca MCU să repete secvența de pornire / oprire / oprire. Ceea ce este necesar acum este o altă întârziere de timp în cadrul buclei:

Declarați Pin0 ca ieșire

BUCLĂ

Setați Pin0 HIGH

Întrerupeți timp de 1 secundă

Setați Pin0 LOW

Întrerupeți timp de 1 secundă ( nouă linie de cod )

ENDLOOP

Note:

Scopul acestei întrebări este ca elevii să înțeleagă că microcontrolerul trebuie să-i spună că trebuie să "pătrundă" prin instrucțiunile de lumină intermitentă. Într-adevăr, aceasta este doar o ilustrare a buclelor într-un context practic.

În cazul în care vă întrebați de ce scriu în pseudocod, iată câteva motive:

Nu există experiență anterioară cu programarea necesară pentru a înțelege pseudocodul
Nu merge niciodată în stil
Hardware independent
Nu există erori de sintaxă

Dacă aș fi decis să prezint codul care ar fi într-adevăr să funcționeze într-un microcontroler, aș fi pus la îndoială problema obositoarei. În acest fel, pot comunica spiritul programului fără a fi înlănțuit cu un standard de programare real. Singurul dezavantaj este că studenții vor trebui să traducă pseudocodul meu într-un cod real care va rula efectiv pe hardware-ul specific MCU, dar aceasta este o problemă garantată pentru unii, indiferent de ce limbă de programare reală aș alege.

Desigur, aș fi putut lua abordarea lui Donald Knuth și mi-aș fi inventat setul de hardware și instrucțiuni proprii (imaginar). . .

Întrebarea 4

Un student decide să construiască un circuit luminos folosind un microcontroler. LED-ul trebuie să clipească și să se stingă numai când butonul de apăsare este apăsat. Se închide când comutatorul este eliberat:

Declarați Pin0 ca ieșire

Declare Pin1 ca intrare

CÂND PIN1 este HIGH

Setați Pin0 HIGH

Întrerupeți timp de 0, 5 secunde

Setați Pin0 LOW

Întrerupeți timp de 0, 5 secunde

endwhile

LED-ul clipește și se oprește foarte bine, atâta timp cât comutatorul cu buton este apăsat atunci când MCU este alimentat sau resetat. De îndată ce comutatorul este eliberat, LED-ul se stinge și nu se mai repetă. Dacă întrerupătorul nu a fost apăsat niciodată în timpul pornirii, LED-ul nu se aprinde niciodată! Explicați ce se întâmplă și modificați programul după cum este necesar pentru a remedia această problemă.

Revelați răspuns Ascundeți răspunsul

Bucla condiționată "WHILE" trebuie să fie plasată într-o buclă necondiționată:

Declarați Pin0 ca ieșire

Declare Pin1 ca intrare

BUCLĂ

CÂND PIN1 este HIGH

Setați Pin0 HIGH

Întrerupeți timp de 0, 5 secunde

Setați Pin0 LOW

Întrerupeți timp de 0, 5 secunde

endwhile

ENDLOOP

Următoarele întrebări: în ce scop servesc rezistența R în butonul "butoane ascunse"> Note:

Scopul acestei întrebări este ca elevii să înțeleagă ce reprezintă bucla "WHILE" în termeni practici: o buclă cu condiție (e). De asemenea, contractează loopul condițional împotriva looping-ului necondiționat și arată modul în care ambele joacă un rol în sistemele interactive cum ar fi acesta.

În cazul în care vă întrebați de ce scriu în pseudocod, iată câteva motive:

Nu există experiență anterioară cu programarea necesară pentru a înțelege pseudocodul
Nu merge niciodată în stil
Hardware independent
Nu există erori de sintaxă

Dacă aș fi decis să prezint codul care ar fi într-adevăr să funcționeze într-un microcontroler, aș fi pus la îndoială problema obositoarei. În acest fel, pot comunica spiritul programului fără a fi înlănțuit cu un standard de programare real. Singurul dezavantaj este că studenții vor trebui să traducă pseudocodul meu într-un cod real care va rula efectiv pe hardware-ul specific MCU, dar aceasta este o problemă garantată pentru unii, indiferent de ce limbă de programare reală aș alege.

Desigur, aș fi putut lua abordarea lui Donald Knuth și mi-aș fi inventat setul de hardware și instrucțiuni proprii (imaginar). . .

Întrebarea 5

Examinați următoarea diagramă schematică și listare program (scrisă mai degrabă în "pseudocode" decât în ​​limbajul de programare formal) pentru a determina ce tip de funcție logică de bază este implementată în această unitate de microcontroler:

Declarați Pin0 ca ieșire

Declarați Pin1 și Pin2 ca intrări

BUCLĂ

DACĂ Pin1 este HIGH, setați Pin0 HIGH

ELSEIF Pin2 este HIGH, setați Pin0 HIGH

ELSE setat Pin0 LOW

ENDIF

ENDLOOP

Revelați răspuns Ascundeți răspunsul

Acest microcontroler implementează funcția logică OR.

Note:

Deși această funcție logică ar fi putut fi implementată mai ușor și mai ieftin în logica hard-wire (gate), scopul este de a face pe elevi să se gândească la efectuarea operațiilor logice printr-un set de instrucțiuni secvențializate în interiorul unui dispozitiv programabil (MCU). Acesta este un salt conceptual, de bază, dar foarte important.

În cazul în care vă întrebați de ce scriu în pseudocod, iată câteva motive:

Nu există experiență anterioară cu programarea necesară pentru a înțelege pseudocodul
Nu merge niciodată în stil
Hardware independent
Nu există erori de sintaxă

Dacă aș fi decis să prezint codul care ar fi într-adevăr să funcționeze într-un microcontroler, aș fi pus la îndoială problema obositoarei. În acest fel, pot comunica spiritul programului fără a fi înlănțuit cu un standard de programare real. Singurul dezavantaj este că studenții vor trebui să traducă pseudocodul meu într-un cod real care va rula efectiv pe hardware-ul specific MCU, dar aceasta este o problemă garantată pentru unii, indiferent de ce limbă de programare reală aș alege.

Desigur, aș fi putut lua abordarea lui Donald Knuth și mi-aș fi inventat setul de hardware și instrucțiuni proprii (imaginar). . .

Întrebarea 6

Examinați următoarea diagramă schematică și listare program (scrisă mai degrabă în "pseudocode" decât în ​​limbajul de programare formal) pentru a determina ce tip de funcție logică de bază este implementată în această unitate de microcontroler:

Declarați Pin0 ca ieșire

Declarați Pin1 și Pin2 ca intrări

BUCLĂ

DACĂ Pin1 este LOW, setați Pin0 LOW

ELSEIF Pin2 este LOW, setați Pin0 LOW

Setarea ELSE Pin0 HIGH

ENDIF

ENDLOOP

Revelați răspuns Ascundeți răspunsul

Acest microcontroler implementează funcția logică AND.

Note:

Deși această funcție logică ar fi putut fi implementată mai ușor și mai ieftin în logica hard-wire (gate), scopul este de a face pe elevi să se gândească la efectuarea operațiilor logice printr-un set de instrucțiuni secvențializate în interiorul unui dispozitiv programabil (MCU). Acesta este un salt conceptual, de bază, dar foarte important.

În cazul în care vă întrebați de ce scriu în pseudocod, iată câteva motive:

Nu există experiență anterioară cu programarea necesară pentru a înțelege pseudocodul
Nu merge niciodată în stil
Hardware independent
Nu există erori de sintaxă

Dacă aș fi decis să prezint codul care ar fi într-adevăr să funcționeze într-un microcontroler, aș fi pus la îndoială problema obositoarei. În acest fel, pot comunica spiritul programului fără a fi înlănțuit cu un standard de programare real. Singurul dezavantaj este că studenții vor trebui să traducă pseudocodul meu într-un cod real care va rula efectiv pe hardware-ul specific MCU, dar aceasta este o problemă garantată pentru unii, indiferent de ce limbă de programare reală aș alege.

Desigur, aș fi putut lua abordarea lui Donald Knuth și mi-aș fi inventat setul de hardware și instrucțiuni proprii (imaginar). . .

Întrebarea 7

Examinați următoarea diagramă schematică și listare program (scrisă mai degrabă în "pseudocode" decât în ​​limbajul de programare formal) pentru a determina ce tip de funcție logică de bază este implementată în această unitate de microcontroler:

Declarați Pin0 ca ieșire

Declarați Pin1 și Pin2 ca intrări

BUCLĂ

DACĂ Pin1 este LOW, setați Pin0 HIGH

ELSEIF Pin2 este LOW, setat Pin0 HIGH

ELSE setat Pin0 LOW

ENDIF

ENDLOOP

Revelați răspuns Ascundeți răspunsul

Acest microcontroler implementează funcția logică NAND.

Note:

Deși această funcție logică ar fi putut fi implementată mai ușor și mai ieftin în logica hard-wire (gate), scopul este de a face pe elevi să se gândească la efectuarea operațiilor logice printr-un set de instrucțiuni secvențializate în interiorul unui dispozitiv programabil (MCU). Acesta este un salt conceptual, de bază, dar foarte important.

În cazul în care vă întrebați de ce scriu în pseudocod, iată câteva motive:

Nu există experiență anterioară cu programarea necesară pentru a înțelege pseudocodul
Nu merge niciodată în stil
Hardware independent
Nu există erori de sintaxă

Dacă aș fi decis să prezint codul care ar fi într-adevăr să funcționeze într-un microcontroler, aș fi pus la îndoială problema obositoarei. În acest fel, pot comunica spiritul programului fără a fi înlănțuit cu un standard de programare real. Singurul dezavantaj este că studenții vor trebui să traducă pseudocodul meu într-un cod real care va rula efectiv pe hardware-ul specific MCU, dar aceasta este o problemă garantată pentru unii, indiferent de ce limbă de programare reală aș alege.

Desigur, aș fi putut lua abordarea lui Donald Knuth și mi-aș fi inventat setul de hardware și instrucțiuni proprii (imaginar). . .

Întrebarea 8

Examinați următoarea diagramă schematică și listare program (scrisă mai degrabă în "pseudocode" decât în ​​limbajul de programare formal) pentru a determina ce tip de funcție logică de bază este implementată în această unitate de microcontroler:

Declarați Pin0 ca ieșire

Declarați Pin1 și Pin2 ca intrări

BUCLĂ

DACĂ Pin1 este HIGH, setați Pin0 LOW

ELSEIF Pin2 este HIGH, setați Pin0 LOW

Setarea ELSE Pin0 HIGH

ENDIF

ENDLOOP

Revelați răspuns Ascundeți răspunsul

Acest microcontroler implementează funcția logică NOR.

Note:

Deși această funcție logică ar fi putut fi implementată mai ușor și mai ieftin în logica hard-wire (gate), scopul este de a face pe elevi să se gândească la efectuarea operațiilor logice printr-un set de instrucțiuni secvențializate în interiorul unui dispozitiv programabil (MCU). Acesta este un salt conceptual, de bază, dar foarte important.

În cazul în care vă întrebați de ce scriu în pseudocod, iată câteva motive:

Nu există experiență anterioară cu programarea necesară pentru a înțelege pseudocodul
Nu merge niciodată în stil
Hardware independent
Nu există erori de sintaxă

Dacă aș fi decis să prezint codul care ar fi într-adevăr să funcționeze într-un microcontroler, aș fi pus la îndoială problema obositoarei. În acest fel, pot comunica spiritul programului fără a fi înlănțuit cu un standard de programare real. Singurul dezavantaj este că studenții vor trebui să traducă pseudocodul meu într-un cod real care va rula efectiv pe hardware-ul specific MCU, dar aceasta este o problemă garantată pentru unii, indiferent de ce limbă de programare reală aș alege.

Desigur, aș fi putut lua abordarea lui Donald Knuth și mi-aș fi inventat setul de hardware și instrucțiuni proprii (imaginar). . .

Întrebarea 9

Examinați următoarea diagramă schematică și listare program (scrisă mai degrabă în "pseudocode" decât în ​​limbajul de programare formal) pentru a determina ce tip de funcție logică de bază este implementată în această unitate de microcontroler:

Declarați Pin0 ca ieșire

Declarați Pin1 și Pin2 ca intrări

BUCLĂ

DACĂ Pin1 este identic cu Pin2, setați Pin0 LOW

Setarea ELSE Pin0 HIGH

ENDIF

ENDLOOP

Revelați răspuns Ascundeți răspunsul

Acest microcontroler implementează funcția logică Exclusive-OR.

Note:

Deși această funcție logică ar fi putut fi implementată mai ușor și mai ieftin în logica hard-wire (gate), scopul este de a face pe elevi să se gândească la efectuarea operațiilor logice printr-un set de instrucțiuni secvențializate în interiorul unui dispozitiv programabil (MCU). Acesta este un salt conceptual, de bază, dar foarte important.

În cazul în care vă întrebați de ce scriu în pseudocod, iată câteva motive:

Nu există experiență anterioară cu programarea necesară pentru a înțelege pseudocodul
Nu merge niciodată în stil
Hardware independent
Nu există erori de sintaxă

Dacă aș fi decis să prezint codul care ar fi într-adevăr să funcționeze într-un microcontroler, aș fi pus la îndoială problema obositoarei. În acest fel, pot comunica spiritul programului fără a fi înlănțuit cu un standard de programare real. Singurul dezavantaj este că studenții vor trebui să traducă pseudocodul meu într-un cod real care va rula efectiv pe hardware-ul specific MCU, dar aceasta este o problemă garantată pentru unii, indiferent de ce limbă de programare reală aș alege.

Desigur, aș fi putut lua abordarea lui Donald Knuth și mi-aș fi inventat setul de hardware și instrucțiuni proprii (imaginar). . .

Întrebarea 10

Un microcontroler este un tip special de calculator digital folosit pentru a asigura secvențierea automată sau controlul unui sistem. Microcontrolerele diferă de computerele obișnuite digitale, fiind foarte mici (de obicei, un singur chip integrat), cu mai mulți pini dedicați pentru intrarea și / sau ieșirea semnalelor digitale și memorie limitată. Instrucțiunile programate în memoria microcontrolerului o spun cum să reacționeze la condițiile de intrare și ce tipuri de semnale trebuie trimise la ieșiri.

Cel mai simplu tip de semnal "înțeles" de un microcontroler este un nivel de tensiune discret: fie "mare" (aproximativ + V) sau "scăzut" (potențial aproximativ al solului) măsurat la un pin specificat pe cip. Tranzistorii interni ai microcontrolerului produc aceste semnale "înalte" și "joase" la pinii de ieșire, acțiunile lor fiind modelate de comutatoarele SPDT pentru simplitate:

Nu este nevoie de multă imaginație pentru a vizualiza modul în care microcontrolerele pot fi utilizate în sistemele practice: activarea și dezactivarea dispozitivelor externe în funcție de pinul de intrare și / sau de condițiile de timp. Exemplele includ controlul aparatelor (temporizatoarele cuptorului, controlorii de temperatură), controlul motorului pentru motoare (injectoarele de combustibil, sincronizarea aprinderii, sistemele de autodiagnosticare) și robotica (servo acționarea, procesarea senzorială, logica navigației). De fapt, dacă locuiți într-o națiune industrializată, probabil că dețineți mai multe duzini de microcontrolere (încorporate în diverse dispozitive) și nici nu-i dați seama!

Una dintre limitările practice ale microcontrolerelor, totuși, este limitarea curentului de ieșire redus: de obicei mai mică de 50 mA. Miniaturizarea circuitelor interne ale microcontrolerului interzice includerea tranzistorilor de ieșire care au o putere de putere semnificativă și astfel trebuie să conectăm tranzistorii la pinii de ieșire pentru a conduce sarcini semnificative.

Să presupunem că am dorit ca un microcontroler să conducă o supapă solenoidală acționată prin cc care necesită 2 amperi de curent la 24 volți. O soluție simplă ar fi utilizarea unui tranzistor NPN ca un dispozitiv "intercalat" între microcontroler și supapa solenoid ca acesta:

Din nefericire, un singur BJT nu asigură suficient câștig curent pentru a acționa solenoidul. Cu un curent de ieșire de 20 mA de la pinul microcontrolerului și un β de numai 25 (tipic pentru un tranzistor de putere), acesta oferă doar aproximativ 500 mA la bobina solenoidului.

O soluție la această problemă implică două tranzistoare bipolare într-un aranjament de perechi Darlington :

Cu toate acestea, există încă o altă soluție - înlocuiți singurul BJT cu un singur MOSFET, care nu necesită deloc curent de unitate. Afișați cum se poate face acest lucru:

Revelați răspuns Ascundeți răspunsul

Note:

Scopul acestei întrebări de lungă durată nu este doar de a avea studenții să înțeleagă cum să înlocuiască un BJT cu un MOSFET, ci și să îi introducă conceptul de microcontroler, care este un dispozitiv de importanță tot mai mare în sistemele electronice moderne.

Unii studenți se pot întreba cu privire la scopul diodei în acest circuit. Explicați-le că aceasta este o diodă comutatoare, uneori numită diodă roată liberă, necesară pentru a împiedica supraîncălzirea tranzistorului de către tranzistoarele de înaltă tensiune produse de bobina solenoidală când este deconectată ("declanșarea inductivă").

Întrebarea 11

Un microcontroler este utilizat pentru a oferi o corecție automată a factorului de putere pentru o sarcină AC:

Examinați această diagramă schematică, apoi răspundeți la următoarele întrebări:

Cum poate microcontrolerul să înțeleagă factorul de putere al încărcării AC "# 11"> Răspuns dezvălui Ascunde răspunsul

Vă voi lăsa pe voi și pe colegii dvs. să discutați despre modul în care MCU ar putea detecta factorul de putere. Există mai multe soluții valide pentru a face acest lucru!

Condensatoarele de 20 μF și 80 μF ar fi ambele implicate: DCBA de ieșire MCU ar fi 0101 (rețineți că ieșirile trebuie să scadă pentru a energiza releele lor respective!). Cu această ieșire, factorul de putere corectat ar fi mai degrabă 0.99939 decât versiunea inițială 0.77.

Note:

Această întrebare prezintă câteva concepte interesante de revizuire, precum și sintetizarea conceptelor vechi și noi în domeniul electronicii, pe care elevii dvs. trebuie să le ia în considerare. Asigurați-vă că aveți suficient timp pentru discuții pe această temă, precum și orice timp de revizuire necesar pentru calculele factorului de putere!

Întrebarea 12

Acest microcontroler este programat să varieze luminozitatea percepută a unui LED prin intermediul modulației PWM (Pulse Width Modulation) a ieșirii pinului 0:

Declarați Pin0 ca ieșire

Declare X ca o variabilă întreagă

BUCLĂ

Setați Pin0 LOW

Întrerupeți timp de 100 - X microsecunde

Setați Pin0 HIGH

Întrerupeți pentru microsecunde X

ENDLOOP

Determinați ce valoare trebuie să fie X pentru a seta luminozitatea LED-ului la 80% și, de asemenea, ce este frecvența semnalului PWM.

Revelați răspuns Ascundeți răspunsul

Această întrebare este probabil cel mai bine răspuns prin desenarea unei diagrame de timp a ieșirii Pin 0, notând timpii de 100 - X μs și X μs.

Următoarele întrebări: Care este rezoluția acestui control PWM, având în vedere că X este o variabilă întreagă "note hidden"> Note:

Modularea lățimii impulsurilor (PWM) este o metodă foarte utilă și utilă de a genera o ieșire analogică de la un microcontroler (sau alt circuit electronic digital) capabil să aibă numai ieșiri de tensiune "înaltă" și "scăzută". Cu PWM, timpul (sau mai precis ciclul de sarcină ) este domeniul analogic, în timp ce amplitudinea este domeniul digital. Acest lucru ne permite să "furișăm" un semnal analogic printr-un canal de date digital (on-off).

În cazul în care vă întrebați de ce scriu în pseudocod, iată câteva motive:

Nu există experiență anterioară cu programarea necesară pentru a înțelege pseudocodul
Nu merge niciodată în stil
Hardware independent
Nu există erori de sintaxă

Dacă aș fi decis să prezint codul care ar fi într-adevăr să funcționeze într-un microcontroler, aș fi pus la îndoială problema obositoarei. În acest fel, pot comunica spiritul programului fără a fi înlănțuit cu un standard de programare real. Singurul dezavantaj este că studenții vor trebui să traducă pseudocodul meu într-un cod real care va rula efectiv pe hardware-ul specific MCU, dar aceasta este o problemă garantată pentru unii, indiferent de ce limbă de programare reală aș alege.

Desigur, aș fi putut lua abordarea lui Donald Knuth și mi-aș fi inventat setul de hardware și instrucțiuni proprii (imaginar). . .

Întrebarea 13

Multe microcontrolere sunt echipate cu o funcție PWM încorporată, astfel încât să nu trebuie să codificați singur un algoritm personalizat PWM. Acest fapt indică popularitatea modulației puls-lățime ca schemă de control. Explicați de ce PWM este atât de popular și dați câteva exemple practice despre cum poate fi folosit.

Revelați răspuns Ascundeți răspunsul

Te las să faci propriile cercetări pentru această întrebare! Răspunsul (răspunsurile) este / nu este greu de găsit.

Note:

Modularea lățimii impulsurilor (PWM) este o metodă foarte utilă și utilă de a genera o ieșire analogică de la un microcontroler (sau alt circuit electronic digital) capabil să aibă numai ieșiri de tensiune "înaltă" și "scăzută". Cu PWM, timpul (sau mai precis ciclul de sarcină ) este domeniul analogic, în timp ce amplitudinea este domeniul digital. Acest lucru ne permite să "furișăm" un semnal analogic printr-un canal de date digital (on-off).

Întrebarea 14

Modulul de lățime a impulsului (PWM) nu este util doar pentru generarea unei ieșiri analogice cu un microcontroler, dar este de asemenea util pentru recepția unei intrări analogice printr-un pin care manipulează numai nivelurile de tensiune digitale de tip on-off (low-low). Următorul circuit ia un semnal de tensiune analogic într-un comparator, generează PWM, apoi trimite acel semnal PWM la intrarea unui microcontroler:

Declare Pin0 ca intrare

Declare Last_Pin0 ca variabilă booleană

Declare Time_High ca o variabilă întreagă

Declare Time_Low ca o variabilă întreagă

Declare Duty_Cycle ca variabilă în virgulă mobilă

Setați Time_High și Time_Low la zero

BUCLĂ

Setați Last_Pin0 egal cu Pin0

Dacă Pin0 este HIGH, incrementarea Time_High by one

Dacă Pin0 este LOW, incrementați Time_Low cu unul

Dacă Last_Pin0 nu este egal cu Pin0, mergeți la SUBROUTINE

ENDLOOP

subrutină

Setați Duty_Cycle egal cu (Time_High / (Time_High + Time_Low))

Setați Time_High și Time_Low la zero

Reveniți la bucla de apelare

ENDSUBROUTINE

Explicați modul în care funcționează acest program. Indiciu: variabila booleană Last_Pin0 este utilizată pentru a detecta când starea Pin0 a fost modificată de la 0 la 1 sau de la 1 la 0.

Revelați răspuns Ascundeți răspunsul

Partea cea mai dificilă a acestui program este găsirea funcției variabilei Last_Pin0 și modul în care aceasta determină când să execute subrutina. Vă recomandăm cu fermitate să efectuați un "experiment de gândire" cu un semnal de intrare cu undă pătrată lentă la microcontroler, examinând modul în care variabilele Time_High și Time_Low devin incrementate cu starea valului pătrat.

Note:

Modularea lățimii impulsurilor (PWM) este o metodă foarte utilă și utilă de a genera o ieșire analogică de la un microcontroler (sau alt circuit electronic digital) capabil să aibă numai ieșiri de tensiune "înaltă" și "scăzută". Aici, de asemenea, o vedem folosită ca o formă de modulare a semnalului de intrare . Cu PWM, timpul (sau mai precis ciclul de sarcină ) este domeniul analogic, în timp ce amplitudinea este domeniul digital. Acest lucru ne permite să "furișăm" un semnal analogic printr-un canal de date digital (on-off).

În cazul în care vă întrebați de ce scriu în pseudocod, iată câteva motive:

Nu există experiență anterioară cu programarea necesară pentru a înțelege pseudocodul
Nu merge niciodată în stil
Hardware independent
Nu există erori de sintaxă

Dacă aș fi decis să prezint codul care ar fi într-adevăr să funcționeze într-un microcontroler, aș fi pus la îndoială problema obositoarei. În acest fel, pot comunica spiritul programului fără a fi înlănțuit cu un standard de programare real. Singurul dezavantaj este că studenții vor trebui să traducă pseudocodul meu într-un cod real care va rula efectiv pe hardware-ul specific MCU, dar aceasta este o problemă garantată pentru unii, indiferent de ce limbă de programare reală aș alege.

Desigur, aș fi putut lua abordarea lui Donald Knuth și mi-aș fi inventat setul de hardware și instrucțiuni proprii (imaginar). . .

Întrebarea 15

Computerele digitale comunică prin dispozitive externe prin porturi : seturi de terminale, de obicei dispuse în grupuri de 4, 8, 16 sau mai multe (4 biți = 1 nybble, 8 biți = 1 octet, 16 biți = 2 octeți). Aceste terminale pot fi setate la stări logice ridicate sau joase prin scrierea unui program pentru calculatorul care trimite o valoare numerică portului. De exemplu, aici este o ilustrare a unui microcontroler fiind instruit să trimită numărul hexazecimal F3 la portul A și 2C la portul B:

Să presupunem că am dori să folosim cei patru biti ai portului A (pinii 7, 6, 5 și 4) pentru a conduce bobinele unui motor pas cu pas în această secvență de opt pasi:

Pasul 1:
0001
Pasul 2:
0, 011
Pasul 3:
0, 010
Pasul 4:
0110
Pasul 5:
0100
Pasul 6:
1100
Pasul 7:
1000
Pasul 8:
1001

Pe măsură ce fiecare pin este ridicat, acesta acționează pe un MOSFET de putere, care transmite curentul prin bobina respectivă a motorului pas cu pas. Urmând o secvență de "schimbare" așa cum se arată, motorul va roti o cantitate mică pentru fiecare ciclu.

Scrieți secvența necesară de numere care trebuie trimise la portul A pentru a genera această ordine specifică de schimburi de biți, în hexazecimal. Lăsați cei patru biți inferiori ai portului A toate în starea logică scăzută.

Revelați răspuns Ascundeți răspunsul

Pasul 1:
10 16
Pasul 2:
30 16
Pasul 3:
20 16
Pasul 4:
60 16
Pasul 5:
40 16
Pasul 6:
C0 16
Pasul 7:
80 16
Pasul 8:
90 16

Următoarea întrebare: scrieți aceeași secvență în zecimal, mai degrabă decât în ​​hexazecimal:

Pasul 1:
Pasul 2:
Pasul 3:
Pasul 4:
Pasul 5:
Pasul 6:
Pasul 7:
Pasul 8:

Note:

Deși rădăcina acestei întrebări nu este altceva decât o conversie binară-hexazecimală, ea introduce, de asemenea, studenții la conceptul de control al stărilor de biți în porturile microcomputerelor prin scrierea valorilor hexazecimale. Ca atare, această întrebare este foarte practică!

În cazul în care studenții solicită, spuneți-le că un prefix pentru semnăturile dolarului este uneori folosit pentru a desemna un număr hexazecimal. Alte ori, se utilizează prefixul 0x (de exemplu, $ F3 și 0xF3 înseamnă același lucru).

Întrebarea 16

Examinați următoarea diagramă schematică și listare program (scrisă mai degrabă în "pseudocode" decât în ​​limbajul de programare formal) pentru a determina ce tip de funcție logică de bază este implementată în această unitate de microcontroler:

Declarați Pin0 ca ieșire

Declarați Pin1 și Pin2 ca intrări

BUCLĂ

DACĂ Pin1 este identic cu Pin2, setați Pin0 HIGH

ELSE setat Pin0 LOW

ENDIF

ENDLOOP

Revelați răspuns Ascundeți răspunsul

Acest microcontroler implementează funcția logică Exclusive-NOR.

Note:

Deși această funcție logică ar fi putut fi implementată mai ușor și mai ieftin în logica hard-wire (gate), scopul este de a face pe elevi să se gândească la efectuarea operațiilor logice printr-un set de instrucțiuni secvențializate în interiorul unui dispozitiv programabil (MCU). Acesta este un salt conceptual, de bază, dar foarte important.

În cazul în care vă întrebați de ce scriu în pseudocod, iată câteva motive:

Nu există experiență anterioară cu programarea necesară pentru a înțelege pseudocodul
Nu merge niciodată în stil
Hardware independent
Nu există erori de sintaxă

Dacă aș fi decis să prezint codul care ar fi într-adevăr să funcționeze într-un microcontroler, aș fi pus la îndoială problema obositoarei. În acest fel, pot comunica spiritul programului fără a fi înlănțuit cu un standard de programare real. Singurul dezavantaj este că studenții vor trebui să traducă pseudocodul meu într-un cod real care va rula efectiv pe hardware-ul specific MCU, dar aceasta este o problemă garantată pentru unii, indiferent de ce limbă de programare reală aș alege.

Desigur, aș fi putut lua abordarea lui Donald Knuth și mi-aș fi inventat setul de hardware și instrucțiuni proprii (imaginar). . .

Întrebarea 17

Computerele digitale comunică prin dispozitive externe prin porturi : seturi de terminale, de obicei aranjate în grupuri de 4, 8, 16 sau mai mult. Aceste terminale pot fi setate la stări logice ridicate sau joase prin scrierea unui program pentru calculatorul care trimite o valoare numerică portului. De exemplu, aici este o ilustrare a unui microcontroler instruit să trimită numărul hexazecimal 2B la portul A și A9 la portul B:

Să presupunem că am dori să folosim primii șapte biți ai fiecărui port (pinii 0 până la 6) pentru a conduce două display-uri cu 7 cataloage comune, în loc să folosim IC-decodor BCD-7-segment:

Scrieți valorile hexazecimale necesare pentru ieșirea la porturile A și B pentru a genera afișarea "42" la cele două unități de afișare cu 7 segmente.

Revelați răspuns Ascundeți răspunsul

Port A = 5B 16 Port B = 66 16

Rețineți că și următoarele răspunsuri sunt valide:

Port A = DB 16 Port B = E6 16

Următoarea întrebare: scrieți aceleași valori numerice în zecimal, mai degrabă decât în ​​hexazecimal.

Note:

Rădăcina acestei întrebări este puțin mai mult decât conversia binară-hexazecimală, dar introduce și studenții la conceptul de control al stărilor de biți în porturile microcomputerelor prin scrierea valorilor hexazecimale. Ca atare, această întrebare este foarte practică! Deși este puțin probabil ca cineva să omite decodoarele BCD-7-segment atunci când construiește un afișaj zecimal din două cifre (pentru că faci acest lucru folosindu-se atât de multe prețioase microcontroler I / O pini), este cu siguranță posibil! Există multe alte aplicații decât acest lucru în cazul în care trebuie să obțineți microcontrolerul pentru a scoate o anumită combinație de stări înalte și joase, iar cel mai rapid mod de a programa acest lucru este de a trimite valori hex la porturi.

În cazul în care studenții solicită, spuneți-le că un prefix pentru semnăturile dolarului este uneori folosit pentru a desemna un număr hexazecimal. Alte ori, se utilizează prefixul 0x (de exemplu, $ F3 și 0xF3 înseamnă același lucru).

Întrebarea 18

O metodă de a conduce pixeli într-un afișaj pe bază de grilă este de a organiza pixelii în rânduri și coloane, apoi selectați pixeli individuali pentru iluminare prin intersecția unei linii de rând specifice și a unei linii specifice de coloană. În acest exemplu, controlam o rețea de 8 x 8 de LED-uri cu două porturi de 8 biți (1 octet) ale unui microcontroler:

Rețineți că este necesară o stare ridicată la unul dintre bornele portului B pentru a activa un rând, iar pe unul dintre pinii portului A este necesară o stare scăzută pentru a activa o coloană, deoarece anodurile LED se conectează la portul A și catodurile LED se conectează la port B.

Determinați codurile hexazecimale pe care ar trebui să le emise la porturile A și B pentru a energiza LED-ul în colțul din stânga jos al grila 8 × 8.

Port A =

Portul B =

Revelați răspuns Ascundeți răspunsul

Port A = $ FE

Port B = 80 USD

Note:

Întrebarea 19

Examinați următoarea diagramă schematică și listare program (scrisă mai degrabă în "pseudocode" decât în ​​limbajul de programare formal) pentru a determina ce tip de funcție logică de bază este implementată în această unitate de microcontroler:

Declarați Pin0 ca ieșire

Declarați ca intrări Pin1, Pin2 și Pin3

BUCLĂ

DACĂ Pin1 este HIGH, setați Pin0 HIGH

ELSEIF Pin2 este HIGH, setați Pin0 HIGH

ELSEIF Pin3 este HIGH, setați Pin0 HIGH

ELSE setat Pin0 LOW

ENDIF

ENDLOOP

Revelați răspuns Ascundeți răspunsul

Acest microcontroler implementează o funcție OR logică 3 intrări.

Note:

Deși această funcție logică ar fi putut fi implementată mai ușor și mai ieftin în logica hard-wire (gate), scopul este de a face pe elevi să se gândească la efectuarea operațiilor logice printr-un set de instrucțiuni secvențializate în interiorul unui dispozitiv programabil (MCU). Acesta este un salt conceptual, de bază, dar foarte important.

În cazul în care vă întrebați de ce scriu în pseudocod, iată câteva motive:

Nu există experiență anterioară cu programarea necesară pentru a înțelege pseudocodul
Nu merge niciodată în stil
Hardware independent
Nu există erori de sintaxă

Dacă aș fi decis să prezint codul care ar fi într-adevăr să funcționeze într-un microcontroler, aș fi pus la îndoială problema obositoarei. În acest fel, pot comunica spiritul programului fără a fi înlănțuit cu un standard de programare real. Singurul dezavantaj este că studenții vor trebui să traducă pseudocodul meu într-un cod real care va rula efectiv pe hardware-ul specific MCU, dar aceasta este o problemă garantată pentru unii, indiferent de ce limbă de programare reală aș alege.

Desigur, aș fi putut lua abordarea lui Donald Knuth și mi-aș fi inventat setul de hardware și instrucțiuni proprii (imaginar). . .

Întrebarea 20

Un elev construiește un circuit de microcontroler pentru a porni un LED o dată pentru fiecare cinci acționări ale comutatorului de intrare. Circuitul este simplu, microcontrolerul folosind o buclă condiționată pentru a crește o variabilă de fiecare dată când este apăsat butonul:

Declarați Pin0 ca ieșire

Declare Pin1 ca intrare

Declare X ca o variabilă întreagă

BUCLĂ

CÂND PIN1 este HIGH

Adăugați 1 la X (X = X + 1)

endwhile

Dacă X este egal cu 5, setați Pin0 HIGH și setați X la 0

ELSE setat Pin0 LOW

ENDIF

ENDLOOP

Din păcate, programul nu se execută așa cum a fost planificat. În loc de LED-ul care apare o dată la fiecare cinci acționări comutator, se pare că se aprinde aleatoriu când comutatorul este eliberat. Uneori LED-ul se aprinde după prima acționare a comutatorului, în timp ce alteori este nevoie de mai mult de cinci apăsări ale comutatorului pentru a porni.

După o analiză atentă, apare elevului că problema se află în buclă WHILE. Deoarece microcontrolerul este mult mai rapid decât mâna umană, acea buclă se execută de mai multe ori în timp ce comutatorul este apăsat mai degrabă decât o singură dată, ceea ce înseamnă că variabila X numără de la 0 la 5 de mai multe ori pentru fiecare acționare a comutatorului. Este doar întâmplător că X va fi egal cu cinci după ieșirea din buclă WHILE.

Ceea ce are nevoie elevul este ca comutatorul să crească cu 1 numai pentru o tranziție întreruptă la comutare: la marginea pozitivă a impulsului de intrare. Problema este cum să faceți acest lucru folosind programarea.

Un alt student, în cazul în care se confruntă cu aceeași problemă, a ales să o rezolve în acest fel și a funcționat foarte bine:

Declarați Pin0 ca ieșire

Declare Pin1 ca intrare

Declare comutator ca o variabilă booleană (0 sau 1)

Declare Last_Switch ca o variabilă booleană (0 sau 1)

Declare X ca o variabilă întreagă

BUCLĂ

Setați Last_Switch egal cu Switch

Setați comutatorul egal cu Pin1

IF Switch = 1 și Last_Switch = 0 apoi adăugați 1 la X (X = X + 1)

ELSE nu fac nimic pentru X

ENDIF

Dacă X este egal cu 5, setați Pin0 HIGH și setați X la 0

ELSE setat Pin0 LOW

ENDIF

ENDLOOP

Explicați modul în care acest program crește cu succes X numai la fiecare tranziție întrerupătoare a comutatorului buton, în timp ce celălalt program crește rapid X pe întreaga durată a apăsării butonului.

Revelați răspuns Ascundeți răspunsul

Cheia pentru a înțelege modul în care funcționează acest algoritm este realizarea variabilei Last_Switch va fi întotdeauna o scanare (executarea buclă) în spatele variabilei Switch.

Întrebare la întrebare: contează unde în program următoarele două linii merg "note ascunse"> Note:

Acest algoritm de detecție a impulsurilor este foarte frecvent utilizat în programele care se referă la intrările de comutatoare din lumea reală. Efectuează în software ceea ce rețeaua de detectare a impulsurilor are în interiorul jgheaburilor declanșate de margine, pentru același efect: de a iniția un anumit fel de acțiune numai la marginea unui semnal de impuls.

  • ← Foaia de lucru anterioară

  • Fișa foilor de lucru

  • Foaia de lucru următoare →