He estado trabajando en algunas versiones diferentes de un circuito de control de luz de bicicleta que lee varios botones y establece varias salidas en consecuencia, como faros, luces traseras, luces intermitentes, etc.
Mi diseño actual se basa en un ATtiny24 ( Hoja de datos ) usando el oscilador interno (8MHz), programado en C utilizando AVR-GCC. Me gustaría mantener al mínimo los componentes externos, como los registros de desplazamiento. Los resistores están bien porque son baratos y pequeños, y estoy usando MOSFETs (NTD4960N: Hoja de datos ) para conducir los bancos de led
Básicamente, lo que estoy buscando es controlar los MOSFET con una señal PWM de 200Hz para controlar el brillo del LED, pero limitar el ciclo de trabajo al 90%. Teniendo esto en cuenta, solo necesitaría un pin para ser una salida durante un máximo del 90% del tiempo. En el 10% restante del tiempo, quiero cambiar el pin a una entrada para leer el estado de un botón.
Probé muchas configuraciones diferentes para permitir que el MOSFET se mantenga APAGADO cuando se supone que está APAGADO, independientemente de la entrada del botón, y esto es lo mejor que puedo encontrar:
Latensióndealimentación(VCC)esde5V,porloquecuandosepresionaelbotón,sevenaproximadamente0,9Venlapuertadeltransistor.Estonoessuficienteparaqueeltransistorcomienceaconducir,peropuedeserleídoporelMCUADCquesehahabilitadoutilizandolareferenciainternade1.1V.
AsíqueelcódigocontrolaelMOSFETconunaseñalPWMde200Hz.ElciclodetrabajovariaráconelbrillodelLEDdeseado,peronoserásuperioral90%.Duranteelúltimo10%delciclodePWM,lospinesdeE/Sseconfigurancomoentradas(pullupsinternosdeshabilitados,búferesdeentradadigitaldeshabilitados)yelADCseusaparaleerelestadodelpin.Laresistenciade10kmantieneelMOSFETapagado,ysisepresionaunbotón,elADClee0.9V.EstevalortodavíanoeslosuficientementealtoparaencenderelMOSFET,porloquelosLEDpermanecenapagados,independientementedelapresióndelbotón.
ComoelADCestáapagadoyencendido,descartolaprimeralecturayguardolasegunda.EstosehacecontiemposuficienteantesdequeelpindebareiniciarsecomosalidaparainiciarelpróximociclodePWM.Yaqueestoyleyendovariosbotones,sololeounoencadaciclodetrabajo,luegoactualizoelmultiplicadordeADCparaleerelsiguientebotónalfinaldelsiguienteciclodetrabajo;porlotanto,cadabotónseleeunavezcada[(númerodebotones)*(200Hz)^-1].LaslecturasdePWMybotonessemanejancompletamentemedianteinterrupciones,mientrasqueMAINdeterminaquéhacerconelestadodecualquierbotónenparticular.
Heconstruidoyprobadoestecircuito,yparecefuncionarperfectamente,peroqueríapresentarladescripciónaquíconlassiguientespreguntas:
- Primero,¿esunamalaidea?Siesasí,entonces¿porqué?
- ¿Existeunaformaobviamentemejordehacerloademásdelosregistrosdedesplazamiento/desplazamientoGPIO?
Puedopublicaralgunos(otodos)delcódigosilodesea.Simplementepenséqueladescripciónpodríasersuficiente,ynoqueríahacerestopormástiempodeloqueyaera.
ACTUALIZAR
Deberíahaberdichoestolaprimeravez,perolatensióndealimentacióndelaMCU(VCC)esde5V,latensióndelabatería(V_bat)esde12V(podríasermáscomo14enunabateríacompletamentecargada),ylacorrienteLEDtotal(comoenlacantidadquevaatravésdelFET)estarácercade2A.ElbancodeLEDconstarádenumerosascadenasparalelasde3LEDdeserie(blanco,V_LED=3.3V)yunaresistenciadeserieencadacadena.Lacorrientepulsadaesdealrededorde50mAporcuerda.Con40cuerdasmásomenosiguala2Aentotal.
HeprobadoyverificadomiversiónADCdelcircuito,asícomolaversión"digital" presentada por DrFriedParts a continuación con una pequeña corriente (total de 50 mA), pero aún no he probado ninguno de los circuitos con mayor carga de corriente.
Este es el proyecto original que estoy rediseñando. La primera vez que construí este controlador de luz para bicicletas, era nuevo para los microcontroladores, por lo que fue más una experiencia de aprendizaje que cualquier otra cosa.