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

260da7eb5b4366388931ad01a0d6fe86.png

▲ 本文要分析的电路

事情是这样开始的。

买了个电动牙刷,几十块钱那种:

2a9de5abebc9a0dab6510ae5e1db57f0.jpeg

收到的实物长这样:

896150072cdb3a3f1aaf73debe157e47.jpeg

牙刷手柄上有1个按键和6个LED灯:

e9353d2ccadfb60c11ae6cc3d70b74ff.jpeg

拆开看看电路板:

425ba5672205286e56138355206bc3da.jpeg

可以看出,电路板上用的单片机,只有8个脚,却要控制1个按键、6个LED灯、1个震动的马达电机:

78a431cbfebbab4e2d541d66da44b9db.jpeg

初看之下,GPIO应该是不够用的。

单片机除去电源脚(正极)和GND脚(负极),只剩最多6个GPIO脚。

那么是怎么做到够用的?

原来,经过巧妙的电路设计,这款电动牙刷实现了用3个GPIO控制6个LED灯,节省了GPIO。

b278989e18f2236c702aee8d16138dbe.jpeg

这个巧妙的电路如下:

9c46015d6c0680b2bfd72e47fe535497.png

6个LED灯为相同的型号,为方便查看,用红绿两种颜色区分两种不同的方向。

一、原理分析

这个电路用到了单片机GPIO的三种状态:

  • 高电平

  • 低电平

  • 高阻态

所谓“高阻态”,是指GPIO对外部电路表现出极大的阻抗。因阻抗很大,几乎不会吸入电流,也不会对外输出电流。

各个LED灯单独亮起,分为六种情况。

1、当只有LED1亮起时,单片机各GPIO的状态如下:(带箭头的红线为电流回路)

6ef4018bb7a9bbed8dd5b262e9d38586.png

2、当只有LED2亮起时,单片机各GPIO的状态如下:

e8b6b608c2851a43fca41f4d3f46d94e.png

3、当只有LED3亮起时,单片机各GPIO的状态如下:

024b4fe0c5abaa62268224b3c057dacb.png

4、当只有LED4亮起时,单片机各GPIO的状态如下:

42fc2e0ca230c0205b0dcef3acd7ccba.png

5、当只有LED5亮起时,单片机各GPIO的状态如下:

c1baf01aa8eaaa69c3444a4606934ab8.png

6、当只有LED6亮起时,单片机各GPIO的状态如下:

2bf413ca7fddd3a4e296e57b90160ed6.png

整理如下:

1c452e77250972386109b6b1a7b2ffa5.png

就是这么简单!

二、总结提升

以上其实是用了一种叫“查理复用”(Charlieplex)的方法。

为什么叫查理复用?

c76010034f6dddf9d4cc031dfc384800.jpeg

很简单,因为这个方法来源于美信半导体公司的工程师Charlie Allen。

b58477a2a5d4f5bfedd5b4e01192b920.gif

查理复用是一种能够在驱动LED,特别是驱动大量LED时有效地节约GPIO的方法。

使用该方法,n个GPIO可以驱动 n*(n-1) 个LED,所以:

  • 使用2个GPIO可以驱动2个LED。

  • 使用3个GPIO可以驱动6个LED。

  • 使用4个GPIO可以驱动12个LED。

  • 以此类推。

这种方式能够实现的基础是:

  • 单片机GPIO的三个状态:高电平、低电平、高阻态。

  • LED具有单向导电性。

查理复用设计的方法:

  • 任意两个GPIO引脚之间串入两个LED,这两个LED为并联,且LED方向相反。

  • 当你想要点亮某个特定的LED时,就将其两端所连接到的GPIO引脚分别设定为高电平和低电平,其它剩余的GPIO引脚设定为高阻态。

  • 前面电动牙刷中6个LED灯的电路,就是这么设计的。

下面从最简单的开始,一步一步体会查理复用的电路设计。

1、使用2个GPIO时最简单:

a31ed0a83d7c2865f1ea83c0255cb0dc.png

LED1亮起时:

8b81ecefb863ab6d0bfca0c5436181e2.png

LED2亮起时:

d5fc3b3c70b5902dfad058fed75cd781.png

这里只用到高电平、低电平的状态,不需要用高阻态的状态。

2、使用3个GPIO时,前面已经分析过:

2f704c7067f22f4d26ce1c6aeea36306.png

可以等效为下图:

ba981b30c276051ef2b66ac756851f73.png

可以看出,确实是任意两个GPIO之间均串入了两个并联的LED,且LED方向相反。

3、同样的原理,使用4个GPIO时:

3f823dacf5b7a893654cb974e89ad17c.png

点亮LED1时:

646d79eccf312517ffd8953dfaf5c6e5.png

其他LED亮起的情况不再列举。

查理复用这样的电路接法也会引发一些问题。

首先,LED亮起时完全由单片机的GPIO输出电流,所以对于GPIO的电流驱动能力有一定的要求。设计电路时要注意查询自己使用的MCU的电流驱动能力,下图是STM32单片机中对GPIO电流驱动能力的说明:

9a56bef0ea3475d92686e744ddc69f36.png

其次,如果出现了某个LED开路或短路的情况,电流的流向会被打乱,LED亮起来的逻辑会变得错乱。最坏的情况下,电路会对GPIO索取大电流,导致单片机损坏。下图是假设LED1短路,那么在点亮LED5时,LED3也会亮起:

f8c1d1ec40c6e029c4387f68f26bba49.png

三、继续进阶

如果要同时亮起两个以上的LED,怎么办?

交替点亮他们就行,只要交替切换的速度够快,由于人眼的视觉暂留效应,看起来就是同时亮起的。

值得一提的是,如果要同时亮起的LED较多,比如大规模的LED点阵,那么还要注意一些新的问题,颇有门道。

本文不再展开,感兴趣的读者可以自行查询修炼,继续进阶。

四、最后

要感谢这款电动牙刷,让我有机会写“查理复用”。

只是最近更新又变慢了,毕竟写公众号不挣钱,还是努力上班,争取买个贵的电动牙刷呀!

ad10a331042ba5b379814645c4ac5f6a.jpeg

往期推荐

9dc6f64ba344465263d2374c20c57d71.jpeg

拆解老式电饭锅限温器并验证其原理

9a976acbfb0362f7623df01ce896a7c9.jpeg

拆解日本松下的老古董收录机,感受50年前的电路设计,满满的历史感

e95d3b30e0980e5fad1c7dabc6d08df0.jpeg

拆解】某平台19元的儿童电话手表,究竟怎么做到的?

2bd444f98445752e45547be57ea55caf.jpeg

拆解】支付宝盒,支付宝到账100万!

猜你喜欢

转载自blog.csdn.net/karaxiaoyu/article/details/133286781
今日推荐