▲ 本文要分析的电路

事情是这样开始的。

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

收到的实物长这样:

牙刷手柄上有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,所以:

  • 使用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时最简单:

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点阵,那么还要注意一些新的问题,颇有门道。

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

四、最后

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

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

转了吗赞了吗在看吗

用3个IO口控制6个LED灯,怎么做到的?查理复用!相关推荐

  1. 单片机两个IO口控制三个LED灯

    在项目中经常会遇到单片机IO口资源不够用的情况,那么如何让单片机的IO口利用最大化呢,这里分享一下用单片机两个IO口控制三个LED灯的几种方法. 方法一:      S1和S2分别接单片机两个IO口, ...

  2. 记录一个 三个io口控制四个LED灯和一个按键的电路和怎么检测

    昨天要写个底层程序 发现要控制四个led灯和一个按键,按键开始一直不能很好的检测, 后面论坛问人才搞好. 分时扫描: 前1-4驱动LED,5检测KEY 1,LED1输出高,LED2输出低,LED3输入 ...

  3. IO口多路查理复用:三个单片机IO口控制六个LED

    简 介: 本文介绍了单片机的IO控制 LED 中的复用技术,特别查理复用基本原理和特点进行了介绍.使用一款IS31FL3731可以构成16×9的PWM亮度可控的 LED 矩阵. 关键词: 查理复用,C ...

  4. 如何巧妙利用4个IO口驱动12个LED灯

    在电路设计过程中有时经常遇到单片机的IO口不够用的情况.对于这样的问题,我们可以选择换单片机,也可以尝试一些巧妙的设计来避免IO口不够用的问题.例如当我们在设计中遇到许多LED灯需要控制的时候,而单片 ...

  5. 如何使用一个单片机的IO口控制两个LED?

    简 介: 本文介绍了一种使用单个IO口独立控制两个LED点亮的方案.并对于不同颜色的LED和不同工作电压下的MCU进行了讨论.给出了在不同的颜色组合.工作电压的情况下不同的驱动方案. 关键词: IO, ...

  6. 一个I/O口控制两个LED灯

    方案1: 优点:平时基本没有功耗: 缺点:电路复杂. 经本人在PIC18F4550测试板上测试,完全没有问题. 方案二: 本人没有测试. 优点:电路简单 缺点:平时还有功耗,二极管VD1一直导通态. ...

  7. 巧用GPIO口控制多个LED

    3个IO口控制6个LED灯 这个电路用到了单片机GPIO的三种状态: 高电平 低电平 高阻态 所谓"高阻态",是指GPIO对外部电路表现出极大的阻抗.因阻抗很大,几乎不会吸入电流, ...

  8. 单片机io口的控制实验c语言,单片机io口控制实验报告

    <单片机io口控制实验报告>由会员分享,可在线阅读,更多相关<单片机io口控制实验报告(5页珍藏版)>请在人人文库网上搜索. 1.单片机io口控制实验报告 精品文档,仅供参考单 ...

  9. 单片机c语言中io取反,单片机小白学步(21) IO口:基本的LED和按键操作

    原标题:单片机小白学步(21) IO口:基本的LED和按键操作 本篇我们先介绍最基础的几个IO口操作.学完本篇,大家要能自己独立完成下面几个实验. 1.点亮 2.一个按键控制LED,按下灯亮,释放灯灭 ...

最新文章

  1. Executor框架
  2. Java打印整数的二进制表示(代码与解析)
  3. PHP获取二维数组中某一列的值集合
  4. P1141 01迷宫(BFS+记忆化)
  5. 计算机组成原理-数制与编码
  6. no signatures that match those in shared user android.uid.system; ignoring!
  7. Stream学习过程中遇到的一个问题记录
  8. simpledateformat线程不安全_ArrayList为什么线程不安全?
  9. linux 查看系统进程命令
  10. springmvc返回jsp源代码解决办法
  11. SAP License:作业类型作为成本对象
  12. 微软紧急修复FIP-FS中的 “Year 2022” 漏洞
  13. 自动化运维之saltstack
  14. 【模电】0010 正弦波产生电路(RC正弦波振荡电路)
  15. html右键打印,怎么在鼠标右键添加打印选项?
  16. 详解Django的Models(django基础四)
  17. 成都盛铭轩:如何增加店铺流量
  18. ubuntu桌面便签_在Deepin 20、Ubuntu 20.04中安装便签小工具Stickynotes
  19. SuperMap iDesktop地质体模型匹配地形——精修地质体模型路线
  20. Java成员方法与静态方法的详解

热门文章

  1. SqlSugar-事务操作
  2. hibernate官方新手教程 (转载)
  3. 【转】GPS定位原理
  4. 在存储过程中如何使用另一个存储过程返回的结果集
  5. Android开发:第四日番外——Assets文件夹和RAW文件夹区别
  6. SPC.NET,为5年的开发做个结尾
  7. 浅谈 Request Response
  8. LINQ标准查询操作符
  9. UA MATH567 高维统计II 随机向量7 Grothendieck不等式
  10. C++单元测试学习总结9