用3个IO口控制6个LED灯,怎么做到的?查理复用!
扫描二维码
随时随地手机看文章
事情是这样开始的。买了个电动牙刷,几十块钱那种:收到的实物长这样:牙刷手柄上有1个按键和6个LED灯:拆开看看电路板:可以看出,电路板上用的单片机,只有8个脚,却要控制1个按键、6个LED灯、1个震动的马达电机:初看之下,GPIO应该是不够用的。单片机除去电源脚(正极)和GND脚(负极),只剩最多6个GPIO脚。那么是怎么做到够用的?原来,经过巧妙的电路设计,这款电动牙刷实现了用3个GPIO控制6个LED灯,节省了GPIO。这个巧妙的电路如下:6个LED灯为相同的型号,为方便查看,用红绿两种颜色区分两种不同的方向。
一、原理分析这个电路用到了单片机GPIO的三种状态:
- 高电平
- 低电平
- 高阻态
二、总结提升以上其实是用了一种叫“查理复用”(Charlieplex)的方法。为什么叫查理复用?很简单,因为这个方法来源于美信半导体公司的工程师Charlie Allen。查理复用是一种能够在驱动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灯的电路,就是这么设计的。
三、继续进阶如果要同时亮起两个以上的LED,怎么办?交替点亮他们就行,只要交替切换的速度够快,由于人眼的视觉暂留效应,看起来就是同时亮起的。值得一提的是,如果要同时亮起的LED较多,比如大规模的LED点阵,那么还要注意一些新的问题,颇有门道。本文不再展开,感兴趣的读者可以自行查询修炼,继续进阶。
四、最后要感谢这款电动牙刷,让我有机会写“查理复用”。只是最近更新又变慢了,毕竟写公众号不挣钱,还是努力上班,争取买个贵的电动牙刷呀!