En pocas palabras, estoy controlando un simple motor de CC con un codificador de doble canal con un microcontrolador para un proyecto personal, y estoy tratando de encontrar la "mejor" implementación de la siguiente máquina de estados que se presenta en este Manual de referencia de TI :
Antesderealizarunainvestigaciónrealsobreeltema,yo,siendounidiotadecabezacaliente,tratérápidamentedeusarun(implementacióndesoftwaredea)D-flip-flopparaobtenerladireccióndelmotor,yluegoincrementarodisminuiruncontador.Segúnladirección.MediaC,mitadpseudocódigoaquí:
uint16_tcounter=0;uint8_tdirection=0;voidinterruptEncoderA(void){if(getInput(encoder_a)==1){direction=getPinValue(encoder_b);}direction?counter++:counter--;}voidinterruptEncoderB(void){direction?counter++:counter--;}
Lasinterrupcionesocurrenenambosbordesdelcanalcorrespondiente.Estaingenuaimplementacióntienealgunosproblemasmuyclaros.Porejemplo,cuandoelmotoravanzayretrocedeentrelosbordesdelcodificadorB,seguirácontandoenlamismadirección.
Séqueestapreguntapuedeserenrealidadalgosubjetiva,oinclusodependerdelaarquitecturadelhardware.Loquerealmenteestoybuscandosonsusopinionessobresolucioneseficientes,elegantesysimples.Siesposible,proporcioneunabrevedescripcióndelosprosyloscontrasdesurespuesta,ocualquierotrainformaciónqueconsidereútil.
Además,siéntaselibredecambiarcómofuncionanlasinterrupciones.SiesmásadecuadotenersolounainterrupciónquesedisparaencadabordedelrelojdelcodificadorAoB,otalvezsiprefieres4interrupciones(unaporborde,porcanal),hazlo.Soloasegúratedequeseaobvio.
Además,soloparadejarloenclaro,estapreguntaessobreunaimplementacióndemicrocontrolador,noHDL.