谷动谷力

标题: 拆解电动牙刷,用3个IO口控制6个LED灯,怎么做到的?查理... [打印本页]

作者: 鸣涧    时间: 2023-10-26 21:32
标题: 拆解电动牙刷,用3个IO口控制6个LED灯,怎么做到的?查理...

拆解电动牙刷,用3个IO口控制6个LED灯,怎么做到的?查理复用!


▲ 本文要分析的电路
事情是这样开始的。买了个电动牙刷,几十块钱那种: 收到的实物长这样: 牙刷手柄上有1个按键和6个LED灯: 拆开看看电路板: 可以看出,电路板上用的单片机,只有8个脚,却要控制1个按键、6个LED灯、1个震动的马达电机: 初看之下,GPIO应该是不够用的。单片机除去电源脚(正极)和GND脚(负极),只剩最多6个GPIO脚。那么是怎么做到够用的?原来,经过巧妙的电路设计,这款电动牙刷实现了用3个GPIO控制6个LED灯,节省了GPIO。 这个巧妙的电路如下: 6个LED灯为相同的型号,为方便查看,用红绿两种颜色区分两种不同的方向。
一、原理分析这个电路用到了单片机GPIO的三种状态:所谓“高阻态”,是指GPIO对外部电路表现出极大的阻抗。因阻抗很大,几乎不会吸入电流,也不会对外输出电流。各个LED灯单独亮起,分为六种情况。1、当只有LED1亮起时,单片机各GPIO的状态如下:(带箭头的红线为电流回路) 2、当只有LED2亮起时,单片机各GPIO的状态如下: 3、当只有LED3亮起时,单片机各GPIO的状态如下: 4、当只有LED4亮起时,单片机各GPIO的状态如下: 5、当只有LED5亮起时,单片机各GPIO的状态如下: 6、当只有LED6亮起时,单片机各GPIO的状态如下: 整理如下: 就是这么简单!
二、总结提升以上其实是用了一种叫“查理复用”(Charlieplex)的方法。为什么叫查理复用? 很简单,因为这个方法来源于美信半导体公司的工程师Charlie Allen。 查理复用是一种能够在驱动LED,特别是驱动大量LED时有效地节约GPIO的方法。使用该方法,n个GPIO可以驱动 n*(n-1) 个LED,所以:这种方式能够实现的基础是:查理复用设计的方法:下面从最简单的开始,一步一步体会查理复用的电路设计。1、使用2个GPIO时最简单: LED1亮起时: LED2亮起时: 这里只用到高电平、低电平的状态,不需要用高阻态的状态。2、使用3个GPIO时,前面已经分析过: 可以等效为下图: 可以看出,确实是任意两个GPIO之间均串入了两个并联的LED,且LED方向相反。3、同样的原理,使用4个GPIO时: 点亮LED1时: 其他LED亮起的情况不再列举。查理复用这样的电路接法也会引发一些问题。首先,LED亮起时完全由单片机的GPIO输出电流,所以对于GPIO的电流驱动能力有一定的要求。设计电路时要注意查询自己使用的MCU的电流驱动能力,下图是STM32单片机中对GPIO电流驱动能力的说明: 其次,如果出现了某个LED开路或短路的情况,电流的流向会被打乱,LED亮起来的逻辑会变得错乱。最坏的情况下,电路会对GPIO索取大电流,导致单片机损坏。下图是假设LED1短路,那么在点亮LED5时,LED3也会亮起:
三、继续进阶如果要同时亮起两个以上的LED,怎么办?交替点亮他们就行,只要交替切换的速度够快,由于人眼的视觉暂留效应,看起来就是同时亮起的。值得一提的是,如果要同时亮起的LED较多,比如大规模的LED点阵,那么还要注意一些新的问题,颇有门道。本文不再展开,感兴趣的读者可以自行查询修炼,继续进阶。
四、最后要感谢这款电动牙刷,让我有机会写“查理复用”。只是最近更新又变慢了,毕竟写公众号不挣钱,还是努力上班,争取买个贵的电动牙刷呀!





欢迎光临 谷动谷力 (http://bbs.sunsili.com/) Powered by Discuz! X3.2