Taula de continguts:

Com interpretar la direcció de rotació des d’un commutador rotatiu digital amb un PIC: 5 passos
Com interpretar la direcció de rotació des d’un commutador rotatiu digital amb un PIC: 5 passos

Vídeo: Com interpretar la direcció de rotació des d’un commutador rotatiu digital amb un PIC: 5 passos

Vídeo: Com interpretar la direcció de rotació des d’un commutador rotatiu digital amb un PIC: 5 passos
Vídeo: Разоблачение цифровой фотографии Дэна Армендариза 2024, Maig
Anonim
Com interpretar la direcció de rotació d’un commutador rotatiu digital amb un PIC
Com interpretar la direcció de rotació d’un commutador rotatiu digital amb un PIC

L'objectiu d'aquest instructable és il·lustrar com interaccionar un commutador rotatiu digital (codificat en quadratura) amb un microcontrolador. No us preocupeu, us explicaré què significa per a nosaltres la quadratura codificada. Aquesta interfície i el programari que l’acompanya permetran al microcontrolador reconèixer el sentit de rotació de cada moviment d’un punt a un altre. Recentment he utilitzat aquest tipus d’interruptor en un projecte de microcontrolador que requeria que s’introduís un punt de consigna de pressió mitjançant un comandament de 16 retén en lloc de botons amunt / avall. La idea era permetre a l'usuari "marcar" la pressió desitjada. Com a resultat, vam haver de desenvolupar una rutina de programari per obtenir la informació de posició del commutador i deduir la direcció de rotació per tal d’incrementar o disminuir el punt d’ajust de pressió del sistema principal. al microcontrolador, la teoria del funcionament del commutador rotatiu, la teoria del funcionament del programari i la rutina de deducció. Finalment, us mostraré la meva aplicació de la rutina de deduccions. A mesura que avancem, intentaré que les coses siguin una mica genèriques perquè la idea es pugui aplicar a tantes plataformes com sigui possible, però també compartiré el que he fet perquè pugueu veure una aplicació específica.

Pas 1: parts

Parts
Parts

Per implementar-ho, necessitareu: Un commutador rotatiu (codificat en quadratura) Resistències extretes Plataforma de microcontroladors adequada Per al meu projecte, he utilitzat un codificador òptic Grayhill 61C22-01-04-02. El full de dades del commutador rotatiu demana resistències de tracció de 8,2 k ohm a les dues línies de dades que provenen del commutador. Voldreu consultar el full de dades del codificador que opteu per utilitzar. El commutador rotatiu que he utilitzat també es pot demanar amb un polsador axial. És una característica útil per fer seleccions que s'han marcat, etc., però no parlaré aquí de la seva interfície. Tinc una "plataforma de microcontroladors adequada" a la llista perquè (crec) es pot implementar en més d'una plataforma. He vist molta gent que utilitza altres microcontroladors per a Instructables, així que vull mostrar també l'enfocament general. Vaig escriure tot el codi a PIC Basic Pro per utilitzar-lo amb un microxip PIC16F877A. Realment, el més important que necessiteu al microcontrolador és la possibilitat d’interrompre quan hi ha un canvi lògic en qualsevol dels dos pins. Al PIC16F877A, s’anomena interrupció de canvi PORTB. Pot haver-hi altres noms en altres controladors. Aquesta característica d'interrupció del microcontrolador forma part del que fa que aquesta implementació sigui tan elegant.

Pas 2: interfície de maquinari

Interfície de maquinari
Interfície de maquinari

Una solució "senzilla" seria tenir un commutador "monopolar-16" amb 16 connexions al microcontrolador. A continuació, cada sortida del commutador estaria lligada a un pin del microcontrolador de manera que el microcontrolador pugui comprovar cada posició de marcatge. Es tracta d’un ús excessiu de pins d'E / S. Les coses empitjoren encara més si volem disposar de més de 16 posicions (retencions) a l’interruptor. Cada posició addicional del commutador requeriria una entrada addicional al microcontrolador. Això es converteix ràpidament en un ús molt ineficient de les entrades d’un microcontrolador. Introduïu la bellesa del commutador rotatiu. El commutador rotatiu només té dues sortides al microcontrolador que figuren A i B a la fitxa tècnica. Només hi ha quatre nivells lògics possibles que poden tenir aquestes línies: AB = 00, 01, 10 i 11. Això redueix considerablement el nombre de línies d'entrada que heu d'utilitzar per connectar l'interruptor al microcontrolador. Per tant, hem reduït el nombre de línies d’entrada a només dues. Ara que? Sembla que realment necessitem 16 estats diferents, però aquest nou commutador només en té quatre. Ens hem disparat al peu? No. Segueix llegint. Explicarem una mica de la teoria darrere de l'operació del commutador rotatiu per explicar.

Pas 3: teoria del funcionament del maquinari

Teoria del funcionament del maquinari
Teoria del funcionament del maquinari
Teoria del funcionament del maquinari
Teoria del funcionament del maquinari
Teoria del funcionament del maquinari
Teoria del funcionament del maquinari

La detecció de la direcció de rotació és possible mitjançant l’esmentat commutador “single-16 throw”, però utilitza moltes entrades al microcontrolador. L’ús del commutador rotatiu redueix el nombre d’entrades al microcontrolador, però ara hem d’interpretar els senyals que provenen del commutador i traduir-los a una direcció de rotació. Aquesta és també una de les elegències clau d’aquesta solució. Això significa que hi ha un codi de 2 bits que dóna el commutador que correspon a la posició del commutador. Podríeu estar pensant: "Si hi ha una entrada de dos bits al microcontrolador, com representem les 16 posicions?" Aquesta és una bona pregunta. No els representem a tots. Només hem de conèixer les posicions relatives del pom per poder determinar el sentit de gir. La posició absoluta del comandament és irrellevant. Per a la rotació en sentit horari, el codi que dóna l’interruptor es repeteix cada quatre retencions i té un codi gris. Codificat en gris significa que només hi ha un canvi de bit per cada canvi de posició. En lloc que l'entrada AB compti la rotació en sentit horari en binari com aquest: 00, 01, 10, 11, canvia així: 00, 10, 11, 01. Fixeu-vos que per a aquest darrer patró, només hi ha una entrada que canvia entre conjunts. Els valors en sentit antihorari per a l'entrada AB al microcontrolador seran els següents: 00, 01, 11, 10. Això és simplement el revers del patró en sentit horari amb la primera llista AB = 00. Mireu els diagrames per obtenir una explicació més visual..

Pas 4: teoria del funcionament del programari

Teoria del funcionament del programari
Teoria del funcionament del programari

La rutina que dedueix el sentit de rotació és impulsada per interrupcions. El microcontrolador que seleccioneu ha de poder interrompre cada cop que hi hagi un canvi en qualsevol dels dos pins (com a mínim) quan la interrupció estigui activada. Això s’anomena interrupció de canvi PORTB al PIC16F877A. Sempre que es gira el commutador, el microcontrolador s'interromprà i l'execució del programa s'enviarà a la rutina de servei d'interrupció (ISR). L'ISR esbrinarà ràpidament de quina manera s'ha girat l'interruptor, establirà un indicador adequadament i tornarà ràpidament al programa principal. Necessitem que això passi ràpidament en cas que l’usuari giri el commutador molt ràpidament. Sabem que el patró AB codificat en gris es repeteix cada quatre posicions, de manera que si fem que la rutina funcioni per a les transicions entre aquestes quatre posicions, funcionarà per a la resta. Fixeu-vos que en un cicle de quatre posicions hi ha quatre arestes. Una vora ascendent i una vora descendent per a l'entrada A, així com l'entrada B. El microprocessador s’interromprà cada vegada que hi hagi una vora que significa que el microcontrolador s’interromprà cada vegada que es giri el comandament. Com a resultat, l’ISR ha d’esbrinar de quina manera es va girar el comandament. Per ajudar-nos a esbrinar com fer-ho, recorrem a la forma d'ona per a la rotació en sentit horari. Fixeu-vos que cada vegada que A té un avantatge, el seu nou valor sempre és diferent del de B. Quan el comandament passa de la posició 1 a 2, A passa de lògica-0 a lògica-1. B segueix sent 0 per a aquesta transició i no coincideix amb el nou valor d'A. Quan el comandament passa de la posició 3 a la 4, A té una vora descendent mentre que B roman a la lògica-1. Fixeu-vos de nou que B i el nou valor de A són diferents. Ara mateix, podem veure que qualsevol moment A provoca la interrupció durant la rotació en sentit horari, el seu nou valor és diferent del de B. Comproveu B per veure què passa. B té una vora ascendent quan l'interruptor passa de la posició 2 a 3. Aquí, el nou valor de B és el mateix que A. Mirant l'últim límit restant per a la rotació en sentit horari, B té una vora descendent que es mou de la posició 4 a 5. (La posició 5 és la mateixa que la posició 1.) El nou valor de B és igual que A també aquí. Ara podem fer algunes deduccions! Si A provoca la interrupció i el nou valor de A és diferent del de B, la rotació era en sentit horari. A més, si B provoca la interrupció i el nou valor de B és el mateix que A, llavors la rotació era en sentit horari. Examinem ràpidament el cas de rotació en sentit antihorari. Igual que la rotació en sentit horari, la rotació en sentit antihorari provocarà quatre interrupcions en un cicle: dues per a l'entrada A i dues per a l'entrada B. L'entrada A té una vora ascendent quan el comandament es mou de la posició 4 a 3 i una vora descendent es mou de la posició 2 a 1 Quan el comandament es mou de la posició 4 a 3, el nou valor de A és el mateix que el valor de B. Fixeu-vos que quan A es mou de la posició 2 a 1, el seu nou valor també és el mateix que el de B. Ara, podem veure que quan A provoca la interrupció i el seu nou valor coincideix amb el de B, la rotació era en sentit antihorari. Ràpidament, analitzarem l'entrada B per verificar-ho tot. B provocarà una interrupció quan el comandament es mou de la posició 5 (que és la mateixa que 1) a 4 i quan el comandament es mou de la posició 3 a 2. En tots dos casos, el nou valor de B no coincideix amb el valor existent de A que és el contrari dels casos en què B provoca la interrupció per a la rotació en sentit horari. Aquesta és una bona notícia. Per resumir, si A provoca la interrupció i el seu nou valor no coincideix amb el valor de B o si B provoca la interrupció i el nou valor de B coincideix amb el valor de A, sabem que hi havia una rotació en sentit horari. Podem comprovar si hi ha cap rotació en sentit antihorari en altres programes del programari o podem suposar que, com que no era rotació en sentit horari, era en sentit antihorari. La meva rutina simplement va suposar.

Pas 5: programari

Programari
Programari
Programari
Programari

No he utilitzat les interrupcions integrades a PIC Basic Pro. He utilitzat un parell de fitxers que he inclòs al meu codi de Darrel Taylor per conduir la rutina. Aquí és on pertany un enorme crèdit a Darrel. Els fitxers són gratuïts. Simplement visiteu el seu lloc web per obtenir més informació, altres aplicacions i per descarregar els fitxers. Podeu ometre aquesta part si no utilitzeu cap PIC amb interrupcions de Darrel Taylor. Només cal que configureu les interrupcions segons sigui necessari a la plataforma que utilitzeu. Per obtenir la configuració de les interrupcions de Darrel Taylor (DT), heu de fer dues coses: 1.) Incloeu els fitxers DT_INTS-14.bas i ReEnterPBP.bas a codi.2.) Copieu-lo i enganxeu-lo al vostre codi code. ASMINT_LIST macro; IntSource, Label, Type, ResetFlag? INT_Handler RBC_INT, _ISR, PBP, sí endm INT_CREATEENDASM Inseriu pestanyes i espais com el gràfic al final de la instrucció perquè pugueu veure les coses una mica més fàcils al vostre codi. Haureu de modificar-lo lleugerament per adaptar-lo a les vostres necessitats. A Etiqueta, substituïu ISR pel nom de la subrutina que és el vostre ISR. No oblideu el subratllat! Perquè les interrupcions funcionin, hi ha dues coses més a fer: 1.) Escriviu l'ISR. Escrivireu igual que aneu a escriure una subrutina PBP, excepte que haureu d'inserir @ INT_RETURN al final de la subrutina en lloc de RETURN. Això reconeixerà la interrupció i retornarà l'execució del programa al lloc on es va deixar al bucle principal. Dins de l'ISR, heu d'esborrar el senyal d'interrupció perquè el programa no quedi atrapat en una interrupció recursiva. Simplement llegir PORTB és tot el que cal fer per esborrar el senyal d'interrupció del PIC16F877A. Cada microcontrolador té una forma diferent d’esborrar els senyals d’interrupció. Consulteu el full de dades del microcontrolador. 2) Quan arribeu al punt del codi que voleu habilitar la interrupció, utilitzeu aquesta línia de codi: @ INT_ENABLE RBC_INT Quan vulgueu desactivar la interrupció, feu servir: @ INT_DISABLE RBC_INT Hi ha moltes de coses empaquetades en el que acabo de cobrir, així que resumiré ràpidament. Fins ara, el vostre programa hauria de ser semblant a això:; Qualsevol configuració necessària o codeINCLUDE "DT_INTS-14.bas" INCLOU "ReEnterPBP.bas" macro ASMINT_LIST; IntSource, Label, Type, ResetFlag? INT_Handler RBC_INT, _myISR, PBP, yes endm INT_CREATEENDASM; Qualsevol altra configuració o codi necessari @ INT_ENABLE RBC_INT; Codi que necessita saber de quina manera gira el comandament @ INT_DISABLE RBC_INT; Un altre codiEND; Fi de programyISR:; codi ISR aquí @ INT_RETURN (Taula de configuració del gestor d’interrupcions) Crec que és aquí on qualsevol persona que no utilitzi interrupcions PIC o DT es pugui unir de nou. Ara cal escriure l’ISR perquè el microcontrolador sàpiga de quina manera gira el comandament. Recordem de la secció de teoria del programari que podem deduir el sentit de rotació si coneixem l’entrada que ha provocat la interrupció, el seu nou valor i el valor de l’altra entrada. Aquí teniu el pseudocodi: Llegiu PORTB en una variable de zero per esborrar el senyal d'interrupció Comproveu si A ha provocat la interrupció. Si és cert, compareu A i B. Comproveu si és diferent, si és diferent, en cas contrari, era en sentit horari EndifCheck si B va provocar la interrupció. Si és cert, compareu A i B Comproveu si és diferent, si és el mateix, era una rotació en sentit horari, si no, en sentit contrari a les agulles del rellotge. Descobrir el nou valor de l’entrada modificada i de l’altra entrada (sense canvis) és fàcil perquè els podem llegir a l’ISR. Hem de saber quin era l'estat de cadascú abans que s'enviés l'execució a la ISR. Això passa a la rutina principal. La rutina principal està asseguda i espera que una variable d’octets que anomenem CWflag s’estableixi a 1 o que l’ISR l’esborri a 0. Després de cada canvi reconegut del comandament o si no hi ha activitat del comandament, la variable s'estableix en 5 per indicar un estat d'inactivitat. Si la bandera es posa o esborra, la rutina principal augmenta o disminueix immediatament la pressió del punt de configuració adequadament en funció de la rotació i, a continuació, torna a establir la variable CWflag a 5 perquè el comandament ara torna a estar inactiu. Com que la rutina principal comprova el CWflag, també documenta l'estat dels valors del commutador rotatiu A i B. Això és realment senzill i té el següent aspecte: oldA = AoldB = BT No hi ha realment res de fantàstic aquí. Només cal que incloeu aquestes dues línies al començament del bucle que comprovin la rotació del CWflag. Només estem actualitzant els valors lògics de les entrades del comandament giratori dins del bucle d’increment / decrement de la rutina principal perquè puguem veure quina entrada ha provocat la interrupció quan s’executa l’ISR. Aquí teniu el codi ISR: ABchange: scratch = PORTB 'Llegiu PORTB per esborrar el senyal d'interrupció' Si A provoca la interrupció, comproveu B per la direcció de rotació IF oldA! = A THEN 'Si A i B són diferents, era rotació en sentit horari IF A! = B THEN GOTO CW 'En cas contrari, era rotació en sentit contrari a les agulles del rellotge. era rotació en sentit horari IF A == B THEN GOTO CW 'En cas contrari, era rotació en sentit antihorari ELSE GOTO CCW ENDIF ENDIFCW: CWflag = 1 @ INT_RETURNCCW: CWflag = 0 @ INT_RETURN He inclòs el codi ISR en un fitxer AB_ISR.bas perquè Les pestanyes del codi no apareixen de la manera que haurien de fer-ho. Ara, ja que l’ISR té els valors antics de les entrades A i B, pot determinar quina entrada va provocar la interrupció, comparar-la amb l’altra entrada (sense canvis) i determinar la direcció. de rotació. Tot el que ha de fer la rutina principal és comprovar el CWflag per veure quina direcció ha girat el comandament (si ho ha fet) i augmentar o disminuir un comptador, un punt de consigna o el que vulgueu o necessiteu. Espero que això us ajudi i no hagi estat massa confús. Aquest tipus d'interfície és especialment útil si el vostre sistema ja utilitza interrupcions, ja que només és una interrupció més per afegir. Gaudeix-ne!

Recomanat: