TinyFL-微控制器手电筒驱动器

哈勃!


我想讲一个故事,讲述我如何进入Cree XM-L LED上的中国大灯手中,以及接下来发生了什么。



背景知识


曾几何时,我从一个中国站点订购了带有明亮LED的手电筒。 事实证明,手电筒非常符合人体工程学(尽管可能会更容易),但其驱动程序还有很多不足之处。


它发出足够明亮的光,但驾驶员只有3种模式-非常明亮,明亮和频闪,只需按一下按钮即可在两种模式之间切换。 为了简单地打开和关闭手电筒,每次必须对这三种模式进行分类。 另外,打开手电筒时,电池电量耗尽了,因此我的一对18650罐深了电。


这一切令人不舒服和烦人,所以在某个时候我决定为此做我的司机,这将是进一步的故事。


带旧驱动器的手电筒

这是一个手电筒,可能很多人已经处理过类似的手电筒


看起来像原始驱动程序


职权范围


如您所知,为了取得良好的结果,任何开发都应具有良好的技术规格,因此我将尝试为自己制定。 因此,驱动程序应:


  • 能够通过短按一个按钮(不固定的按钮)来打开/关闭。 也许这就是所有这些开始的主要原因。
  • 当二极管几乎不发光时,具有平滑(无级)的亮度控制,从最亮的“ turbo”到“ moonlight”。 亮度应均匀变化。
  • 记住为休息设置的亮度。
  • 监视电池电量,在电池即将放电(大约3.3V)时发出警告,并在电池完全放电(大约2.9V)时关闭。 对于不同的电池,这些参数可能不同。 因此,工作电压应在2.7〜4.5V的范围内。
  • 有2种特殊模式-紧急信标和频闪(嗯,为什么不呢?)
  • 为了能够打开/关闭后部LED(在夜间骑自行车时,这确实是一种信号灯)。
  • 具有反极性和静电防护。 不一定,但这将是一个不错的补充,因为在黑暗中您可能会错误地将电池放在错误的一侧。
  • 在尺寸上小于原始驱动程序,但具有相同的占用空间。 中国车手实在是太庞大了,要使其变得更大并不容易。

好吧,如果改装了手电筒,为什么不内置带有微型USB连接器的充电器呢? 我总是手头有这样的电缆和USB充电,并且我必须寻找本地电源。



我对Arduino有一定的经验,因此决定在AVR系列MK上制作驱动程序。 它们广泛可用,易于编程,并且具有低功耗(睡眠)模式。


Attiny13a微控制器被选为驱动程序的“大脑”-它是最便宜的Atmel MC(现在已被Microchip吸收)之一,板上有所有东西-用于连接按钮和LED的GPIO,用于生成PWM信号的计时器,用于测量的ADC电压和EEPROM保存参数。 只有1 KB的闪存可用(但手电筒需要多少闪存),以及64 B RAM和相同数量的EEPROM。
Attiny13提供多种外壳选择,尤其是DIP-8,可以将其直接插入间距为2.54mm的普通面包板中。


由于从手电筒的背面到头部只有3根电线,因此按钮被迫接地(大约不可能短接至正极-稍后),因此您将不得不在正极上切换LED-这意味着您需要一个P通道杆。 我将AO3401当作这样的晶体管,但是可以选择SI2323,它更昂贵,但具有更小的开路电阻(40 mOhm,而AO3401在4.5 V时具有60 mOhm),因此,驱动器的发热更少。


从言行举止,我在面包板上收集了初步版本


目前,它是由编程器直接供电的,电压为5 V(由于USB电缆的损耗,实际上更低)。 到目前为止,XM-L还没有使用LED,而是在脚上固定了常规LED并放置了具有高阈值电压的弱晶体管。
然后,在Altium Designer程序中绘制了一个图表,并在其中添加了反极性和ESD保护功能。



所有组件的详细说明和目的

先决条件:


U1-采用8S1封装的Attiny13a微控制器(SSU索引)


C1-微控制器电源的去耦电容器,应在0.1微法拉的范围内(外壳1206或0805),温度系数X7R


R1-R2是一个用于测量电池电压的电阻分压器,可以设置任何额定值,这里是主比率(750K / 220K,分压比率4.41)和泄漏电流,如果增加额定值(电流约为4μA)会更大。 由于使用内部ION(1.1 V,根据数据手册,它可以在1.0 V-1.2 V之间),所以分压器输出的最大电压不应超过1V。对于分压器750/220,分压器输入的最大允许电压为4.41 V,即足以应付所有类型的锂电池。
我用这个计算器计算了分频器。


R3-保护微控制器端口的输出免受短路影响(如果PB1突然拉至VCC,则大电流将流过该引脚,并且MC可能烧坏)


R4-将RESET MK上电,没有它,可以从拾音器重启。


Q1-在SOT-23封装中的P通道场效应晶体管,我安装了AO3401,但安装了具有合适引脚分配的任何其他晶体管(例如,SI2323)


R7是限流栅极电阻。 由于晶体管的栅极具有一定的容量,因此对该容量充电时,大电流会流经该引脚,并且该引脚可能会发生故障。 您可以将其设置在100-220欧姆的范围内(不再应该这样,晶体管将长时间处于半关闭状态,结果,它会发热更多)。


R6-电阻上拉百叶窗供电。 如果PB0进入高阻状态,则将通过此电阻在门Q1上安装逻辑1,并且晶体管将关闭。 这可能是由于代码或编程模式中的错误引起的。


D2-“锁定”二极管-允许电压“下陷”(当LED短时间打开到全亮度时)从电容器馈送MK一段时间,还可以防止极性反接。
您可以在SOD323封装中放置任何肖特基二极管,且压降最小,我放置BAT60。


最初,在场效应晶体管上进行了防止电源极性反接的保护措施(可以在通过战利品制成的板上看到)。 接线后出现了令人不愉快的功能-当负载打开时,电压下降并且MK重新启动,因为现场工作人员没有限制相反方向的电流。 刚开始,我在VCC和GND之间焊接了一个200 uF的电解电容器,但是由于其尺寸太大,我不喜欢这种解决方案。 由于SOT-23和SOD-323具有相似的尺寸,因此我必须焊接晶体管并在其位置放一个二极管。


总共,电路中仅需要安装10个组件。


可选组件:


R5和D1负责背光(LED2)。 R5的最小额定值为100欧姆。 额定值越高,后面的LED点亮越弱(它在没有PWM的恒定模式下打开)。 D1-外壳1206中的任何LED我都放绿色,因为 在视觉上,它们在相同的电流下比其他电流更亮。


D3和D4是保护二极管(TVS),我在SOD323封装中使用了PESD5V0(5.0V)。 D3通过按钮保护电源D4免受过压。 如果按钮被薄膜覆盖,则其中没有特殊含义。 可能值得使用双向保护二极管,否则,当极性接反时,电流将流过它们,并且它们会烧毁(请参阅双向保护二极管的CVC)。


C2-情况A的钽电容器(类似于1206),在驱动器不稳定时(在LED的高开关电流下可能会挤压电源电压)进行设置是有意义的


所有大小为0603的电阻器(对我来说,这是手动焊接的适当限制)


组件一切都清楚了,您可以根据上述方案制作印刷电路板。
首先要做的是构建未来电路板的3D模型以及孔-IMHO,在Altium Designer中,这是确定PCB几何形状的最便捷方法。
我测量了旧驱动器及其安装孔的尺寸-电路板应固定在其上,但尺寸要小一些(出于多功能性,突然之间您必须将其构建在其他位置)。
合理的最小值在大约25x12.5mm(纵横比2:1)的某个地方,带有两个直径为2mm的孔,可使用本机螺钉将其固定到灯壳上。


我在SolidWorks中制作了3D模型,然后将其作为STEP导出到Altium Designer。
然后,我将组件放置在板上,使触点位于角上(更方便且更容易接地),Attiny13置于中心,晶体管更靠近LED触点。
我铺开了电源线,将剩下的组件放回原处,并分开了信号线。 为了方便连接内存,我为它带来了单独的触点,该触点与电池触点重复。
我在顶层做了所有布线(一个跳线除外),以便能够在家中用LUT制作电路板。
信号路径的最小宽度为0.254 mm / 10 mil,功率路径的最大宽度尽可能。


这就是Altium Designer中的接线板外观


Altium Designer可以查看电路板在3D模式下的外观(为此,您需要所有组件的模型,其中一些必须自己构建)。
也许有人会说示踪剂不需要3D模式,但对我个人而言,这是一项方便的功能,可以方便地放置组件以方便焊接。



在撰写本文时,已制作了3种版本的电路板-第一种用于LUT,第二种用于工业制造,第三种,最后进行了一些更正。


制板


自制方式


LUT-激光熨烫技术,一种通过在掩模上进行蚀刻来生产电路板的方法,该掩模通过将碳粉从纸张转换为铜而获得。 这种方法非常适合简单的单面电路板,例如该驱动器。
该网络上有很多关于该技术的文章,因此,我将不做详细介绍,而只是简要地告诉您我是如何做到的。


首先,您需要准备一个模板,该模板将打印在热敏纸上。 我将top_layer层导出为PDF,得到矢量图像。



由于电路板很小,因此有必要选择一块尺寸大几倍的PCB板,并进行行业所谓的镶板。
出于这些目的,CorelDraw非常方便,但是您可以使用任何其他矢量编辑器。
我将模板的副本放在文档上,在木板之间留出0.5-1mm的间隙(这取决于分离方法,稍后再说),木板应该对称放置-否则将很难分开。


我拿起一块单面PCB,尺寸稍大于组装好的面板,清洁并除脂(我更喜欢先用橡皮擦,然后再用酒精擦)。 我在热敏纸上打印了一个用于蚀刻的模板(在此重要的是不要忘记镜像该模板)。
在熨斗和耐心的帮助下,轻轻地在纸上抚摸,我将其翻译为软沸石。 我等到它冷却下来,然后小心地剥离纸。
可以对铜的自由区域(未覆盖碳粉)进行清漆或粘合(铜的面积越小,蚀刻反应越快)。


这样的家用镶板-大量的木板可以弥补制造缺陷


我用柠檬酸在过氧化氢溶液中毒使木板中毒,这是最经济的方式,尽管速度很慢。
比例如下:对于100毫升过氧化物,3%是30克柠檬酸和约5克盐,将它们全部混合并倒入装有text石的容器中。
加热溶液会加快反应速度,但可能导致碳粉剥落。


未知的化学魔术开始了:铜被气泡覆盖,溶液呈蓝色


一段时间后,我取出蚀刻后的板并清洁碳粉。 我无法用任何溶剂将其洗掉,因此我用细砂纸将其机械去除。


现在,仍然需要对电路板进行镀锡-这将有助于焊接并保护铜免受氧化并促进焊接。 我更喜欢使用Rose合金进行镀锡-这种合金在约95度的温度下熔化,因此可以在沸水中镀锡(是的,也许不是最可靠的镀锡成分,但对于自制电路板而言)。



镀锡后,我在一块板上钻孔(对于触点,我使用硬质合金钻头f1.0,对于跳线使用-f0.7),由于缺少其他工具,我用dremel进行了钻孔。 我不喜欢因为灰尘而切割斜纹棉布,因此,在钻孔后,我用一把办公刀将木板切开-在两侧,我在一条线上进行多次切割,然后将其切成小块。 这让人想起工业上使用的V形切割方法,只不过有一个由铣刀制成的切口。


看起来像是准备焊接的电路板


准备好板子后,就可以开始对组件进行接线了。 首先,我焊接一个小电阻(电阻0603),然后焊接其他所有东西。 电阻与MK相邻,因此以相反的顺序焊接可能会出现问题。 焊接后,我检查驱动器供电是否短路,然后已经可以启动固件MK。


驱动程序准备下载固件


工业方式


LUT快速且价格合理,但是该技术也有其缺点(就像几乎所有“家用” PP制造方法一样)。 制造双面板是有问题的,可以蚀刻走线,而您只能梦想将孔金属化。


幸运的是,进取的中国人长期以来一直以工业方式提供印刷电路板制造服务。
奇怪的是,中文单层板的价格将比两层板高,因此我决定在印刷电路板上增加第二层(底部)。 电源路径和接地在此层上重复。 同样,可以从晶体管(下层的铜多边形)制成散热片,这将使驱动器能够在更高的电流下工作。


Altium Designer中板子的底层


对于这个项目,我决定在PcbWay网站上订购印刷电路板。 该站点有一个方便的计算器,用于根据板的参数,大小和数量来计算板的成本。 计算成本后,我下载了先前在Altium Designer中创建的gerber文件,中文检查了该文件,电路板投入生产。


制作一组10个TinyFL电路板花了我5美元。 注册新用户时,第一次订购可享受5美元的折扣,因此我只支付了运费,运费也大约为5美元。
在此站点上,有机会将项目置于公共领域,因此,如果有人要订购这些板,则只需将该项目添加到购物篮中即可。


几周后,只有我来了相同的董事会 漂亮的 工业制造。 它们只能解压缩并用固件填充。



程序(固件)


编写驱动程序固件时出现的主要困难与闪存的极小尺寸有关-Attiny13只有1024字节。
同样,由于亮度变化是平滑的,因此要均匀地改变亮度也是一项艰巨的任务-为此,我们必须进行伽玛校正。


驾驶员控制算法


短按该按钮可打开驱动器,然后将其关闭。
所选的亮度模式将在关机期间存储。


如果在操作过程中连按两下按钮(双击),则其他LED将会打开/关闭。
在操作过程中长按此键,灯的亮度将逐渐变化。 反复长按可更改方向(更强/更弱)。


驱动程序会定期检查电池电压,如果电池电压低于设定值,则警告用户放电,然后关闭以避免深度放电。


驱动程序算法的更详细描述
  1. 当给MK供电时,外围设备就建立好了,MK进入睡眠状态(如果定义了STARTSLEEP)。 给驱动器供电后,如果定义了STARTBLINKS,则两个LED都会闪烁一定次数。
  2. 睡吧 Attiny13在掉电模式下睡眠(这是最经济的模式,根据数据手册,MK消耗约为1μA),只有中断才能退出。 在这种情况下,这是INT0中断-按下按钮(将PC1设置为逻辑0)。
    在PC1上,应打开内部弱上拉电路。 ADC和比较器是整个外围设备电流的主要消耗者,因此也需要将其关闭。 睡眠期间,寄存器和RAM的内容被存储,因此不需要EEPROM来记住亮度。
  3. 睡眠后,外围设备和PWM开启,驱动器进入无休止的循环,在该循环中,将监视按钮并定期检查电池电压。
  4. 如果按下按钮,则按下时间。
    4.1。 如果短按,则需要双击(如果定义了BTN_DBCLICK)。
    如果是这样,则额外的LED2开关
    如果不是,请转到步骤2(睡眠)
    4.2。 如果长按(比BTN_ONOFF_DELAY长)-激活亮度控制模式。 在这种模式下:
    • 按下按钮时,变化方向反转(更多/更少),PWM填充百分比发生变化。
    • / (RATE_MAX / RATE_MIN), ;
    • n- (AUXMODES_DELAY) , . — ( 25 , 8 ) ( 50, 1 ). , - .
  5. — ADC2, .
    • BAT_WARNING –
    • BAT_WARNING – , . - . , 5 .
    • BAT_SHUTDOWN — .2 ().


, — , - , . - , , . P- , , — , . .
rate, 255 rate = 100% .
1.2 1, 1200000/256 = 4.7 . ( ), (, , , ). , 9.6 (CKSEL[1:0]=10, CKDIV8=1) 4.8 (CKSEL[1:0]=01, CKDIV8=1), 8 4 , .


, , . , ( ) , , , 1.5 , 2 ( Cree XM-L — 3 ).
, (rate=255) 3. , . , RATE_MAX . , SI2323DS 4 , 2 , .


-


. , 5-10% , 75-100% . , n , , , .


, -. , 1 12 . , rate_step_array. , , .



n- ( BAT_PERIOD) . , VIN R1-R2, PB4 ( ADC2 ).


, , Vref, 1.1 . — , (, 1.1 1023 255, 8- ). , 6 , 255 1.1 , 4.33 ( 4.03), .


, . BAT_WARNING ( , — BAT_INFO_STEP, ), BAT_SHUTDOWN .
, .. , .


, , . , 4.03 R1 = 1M R2 = 330, R = 1330K 4 = 3 .
() 1 . , , ( - — ).



, Arduino C/C++.
, (defines) flashlight.h.
Arduino IDE Attiny13(a) Atmel Studio – , Arduino IDE, .


Arduino IDE

Attiny13 IDE. .
Tools>Board Attiny13(a) Tools>Frequency 1.2MHz.
"" .ino, — . , — Arduino IDE. - , .cpp.
, , *.hex. .


Atmel Studio

IDE flashlight.atsln, — flashlight.h () flashlight.cpp .
— .
F7, ( , , ). debug flashlight.hex, .


USBASP AVRDUDEPROG. GUI avrdude, — . ( Attiny13(a), Fuses read. , , . programm, . flashlight.h


要上传固件,请转到“程序”选项卡,在Flash行中以HEX格式(flashlight.hex)选择已编译的固件文件,然后单击“程序”。 固件状态将显示在下面的窗口中。 如果下载失败,则可能是联系不良,它会发生-值得再次尝试。 顺便说一下,出于这个原因,已设置了STARTBLINKS参数-在向驱动器供电时,LED2的单次闪烁可指示驱动器与编程器的接触。
代替USBASP,您可以使用Arduino下载固件, 此处此处均提供更多详细信息。


USBASP编程器通过带环的夹子连接到驱动器


要将USBASP连接到tinka,我使用一个8针SOIC的夹子。 这不是一个非常方便的设备,您必须在折磨10分钟之前折磨一下(也许我只是碰到了一个有缺陷的夹子)。 也有SOIC-DIP适配器,在焊接之前将微电路插入其中并注入固件-此选项更方便,但是失去了对驱动器在线编程的能力(即在将MK焊接到板上之后更新固件)。
如果这还不存在,那么您只需将电线焊接到MK的端子上,然后将其连接到Arduino。


标定


流过驱动器和LED的电流不应超过最大值。 对于XM-L LED,这是3 A,对于驱动器,它取决于所使用的晶体管,例如,对于SI2323,最大电流约为4 A,但是由于过热,最好以较低的电流驱动。 为了降低最大亮度时的电流,使用了RATE_MAX参数(#define RATE_MAX xx,其中xx是从0到255的最大亮度)。
ADC的校准不是强制性的步骤,但是如果您希望驱动器准确监控阈值电压,则必须对其进行修补。


该计算不会提供很高的测量精度,因为,首先,电阻器可以在公差范围内变化(通常为1%至5%),其次,内部离子的散射范围为1.0至1.2V。
因此,唯一可接受的方法是以ADC单位(BAT_WARNING和BAT_SHUTDOWN)设置值,并通过实验将其选择为所需值。 为此,您需要耐心,编程器和可调电源。
我将固件中的BAT_PERIOD值设置为1000(每秒检查一次电压),然后逐渐降低电源电压。 当驾驶员开始警告放电时,我根据需要保留了BAT_WARNING的当前值。
这不是最方便的方法,也许将来您需要执行自动校准过程,并将值保存在EEPROM中。


手电筒总成


当电路板准备就绪并且固件泛滥时,您最终可以将其替换为旧驱动程序。 我拆焊了旧的驱动器,然后焊接了一个新的驱动器。


根据此方案,新的驱动程序代替旧的驱动程序被连接


在检查电源中是否存在短路之后,我连接了电源并检查了可操作性。 然后我安装了充电板(TP4056),为此我必须在充电连接器上钻一个小孔,然后用热熔胶将其固定(重要的是胶水不会流入连接器中,很难将其从那里取出)。


我之所以没有用螺钉来固定电路板,是因为壳体中的螺纹由于反复扭曲而断裂,只是将胶水倒在其上,并且将电线粘在焊接处以免磨损。 我决定用丙烯酸无色清漆覆盖驱动器和充电器,这有助于防止腐蚀。



测试和计算制造成本


完成所有操作后,就可以开始测试驱动程序了。 用常规的万用表测量电流,然后将其连接到电源的开路。


旧驱动器的功耗(在4.04 V下测量):


  1. 睡眠期间-未测量
  2. 最大模式:0.60 A
  3. 中模:0.30 A
  4. 频闪仪:0.28 A

新驱动器的功耗(在4.0 V下测量):


  1. 在睡眠模式下,它消耗的电流约为4μA,远低于锂离子电池的自放电电流。 该模式下的主电流流经电阻分压器。
  2. 在最小模式下,“月光”约为5-7 mA,如果我们假设一个18650电池的容量约为2500 mA * h,那么我们可以获得约20天的连续运行时间 。 MK本身消耗的电流约为1.2-1.5 mA(工作频率为1.2 MHz)。
  3. 在最大模式下,“涡轮”-消耗约1.5 A电流,在这种模式下,它将工作约一个半小时。 此类电流上的LED开始变得非常热,因此该模式不适用于长期运行。
  4. 紧急信标-平均消耗约80毫安的电流,在这种模式下,手电可以工作30个小时。
  5. 频闪仪-消耗约0.35 A的电流,最多可工作6个小时。

发行价


如果您在Chip and Deep中购买组件,则大约会产生100卢布(60卢布的Attiny13,约40卢布的剩余散粉)。 从中国订购是合理的,如果制造了几件,那么就一件而言,它会更便宜,中国人通常批量销售10件以上。
如果在中国订购,将以10件300卢布的价格释放费用(无交货)。
布线和闪烁一个驱动程序大约需要一个小时。


结论


中国的手电筒变得更加方便,尽管现在我对其手电筒有所抱怨-前部太重了,不需要真正地聚焦。
将来,我计划制作一个带有电源按钮(带固定装置)的手电筒驱动程序版本。 没错,我对如此大量的项目感到困惑。 您认为值得再做一个吗?


特写驱动程序(版本2_t)


UPD :添加了对Arduino IDE的支持。


固件,电路和电路板布线的源代码现在位于github上,您可以在此处下载: https : //github.com/madcatdev/tinyfl_t

Source: https://habr.com/ru/post/zh-CN464673/


All Articles