sunsili 发表于 2024-4-8 23:28:11

MCU如何灵活配置GPIO使产品功耗更低?

MCU如何灵活配置GPIO使产品功耗更低?

    前面的连续多篇文章,我们对开关电源进行了深入的分析和探讨,为产品的供电部分先打下了基础,从本篇开始,我们将进入核心的控制芯片部分,开始对MCU的各个功能模块分别进行专题探讨;我想既然我们是希望通过给大家分享一些实战开发中积累的小技巧,那就不能像教科书一样,围绕MCU的每个功能模块的工作原理来进行说明;我期望每一期都设定一个主题,在介绍一个功能模块的同时,也契合产品设计里一个非常实际的问题来进行探讨,就像本文的标题一样,产品的低功耗设计,是我们作为工程应用设计人员,必须要非常重视的一个设计指标,我们今天就从MCU的GPIO的功能模块开始,以低功耗设计为主题,开启我们的MCU之旅吧。
    MCU的GPIO是它众多功能模块里面最基础的,也是每个电路设计里必用的功能,尤其是在小型的控制电路里,或者一个SOT-23-6封装的MCU,只提供若干个GPIO就已经能满足产品的需求了,因此GPIO口的应用是我们先深入探讨的第一课;我们先从基本的工作模式开始:
(1)输入模式:输入浮空、输入上拉、输入下拉、模拟输入这四种
上图为输入端口的内部逻辑图,当设置为输入浮空时,上、下拉电阻上的开关都是断开的,输入信号通过TTL 触发器进入到输入数据寄存器,并被MCU内核读取;这种情况下,如果MCU外围IO口上没有接线路,则这个管脚就是处于浮空状态的;端口的电平状态不确定,完全受外部输入所影响;这种应用在一些键盘矩阵输入应用里较为常见;但是这个浮空状态因为它的不确定性,在使用时要对你外围电路的电平状态有充分的了解。
    上图设置为输入上拉,则是将IO端口上部的开关闭合,内置1个上拉电阻;这样在IO外部无任何输入信号时,IO的输入状态也是高电平,这就解决了IO状态不确定性的问题。但注意这个上拉电阻阻值是在40~100K的范围里,它的上拉驱动能力是有限的,在使用这个模式对接 类似I2C、1-wire 总线时,这个上拉电阻阻值是偏大的,还是需要在外部单独增加上拉电阻,才能确保信号的稳定性。
    上图设置为输入下拉,则是将IO端口下部的开关闭合,下拉状态将IO的初始状态确定为低电平,阻值跟上拉是一样的,在40~100K的范围里。
    上图设置为模拟输入,这种一般是内部还要接入到ADC的功能模块或COMP比较器、运放等模块,用于模拟量的输入检测,这也是用的比较多的设计,如采用NTC热敏电阻测温电路。(2)输出模式:开漏输出及上/下拉可配、推挽式输出及上/下拉可配、推挽式复用功能及上下拉可配、开漏复用功能及上下拉可配 这四种模式。如上图,开漏输出是指PMOS断开(不起作用)情况下,下方的N-MOS管可控制输出开、关;开漏输出的配置非常实用,可以解决MCU工作电平与外部电路电平不匹配的问题,比如MCU的IO口电平为3.3V,而外部被驱动电路为5V供电,也是可以通过开漏输出去驱动的,因为MCU内部的N-Mos管是可以承受5V的电平的;但要注意外部电路灌入N-MOS管的电流需要限制在芯片规格书要求的范围内,通常是15mA上下(具体要仔细看MCU的规格书,千万别超标了)。注意,这个模式里还可以配置上、下拉电阻,但是如果选择了上拉电阻,那它的工作电压就是MCU的VDD了,这点要注意;当你需要明确输出电平的状态为高电平时,可以配置为上拉;如果没有配置上拉,那开漏输出为1时,是得不到高电平的,实际上是IO口浮空状态,也就是这个浮空状态,才有利于我们外部加我们想要的上拉电平,从而实现电平的转换。上图为推挽输出设置为高电平输出时的信号流,IO端口的上部分的PMOS管导通,下部的NMOS管断开;输出高电平驱动外部电路;推挽输出的驱动能力也是在15mA左右,特殊说明的端口除外;它们也是可以配置上下拉电阻的,但是对于推挽输出模式,上下拉电阻的作用并不实用,反而增加端口的功耗。
上图为推挽式复用功能,它是由片上外设功能模块进行驱动的输出,其他的功能跟普通推挽的原理是一样的;主要是它复用到哪个内部模块里去,比如UART串口、SPI串口等等;他们也都是可以设置上、下拉电阻的;在UART总线上还是有作用的。
    上图为开漏式复用功能,它也是由片上外设模块所驱动,其他部分则跟普通的开漏输出原理一致,也都可以设置上下拉电阻;比如内部连到I2C功能模块,那配置了上拉电阻后,就是可以在端口总线上级联多个I2C的设备进行通信了。
    前面详细说明了GPIO口的工作原理,但都还没有真正进入今天的正题,他们跟低功耗设计有什么关系?其实不然,我们只有深度了解了GPIO口的工作原理才能合理规范的使用它。接下来我们将开发实践中积累的低功耗设计的经验分享给大家:
(1)注意MCU的选型,这个非常重要的,同一个品牌的芯片里也有普通功耗和低功耗的芯片(价格会贵一点点,但是对于整体设计来说,还是值得的)(2)MCU内部的功能模块,没有用到的,全部关闭;当你只用到一个简单的输出控制,那内部的什么ADC、UART、I2C等等都是不用的,这些在功能模块使能时都可以关闭。(3)合理设置IO的输入、输出模式;合理设置上拉下拉电阻。这个就是上面花那么大篇幅介绍工作原理的目的。当外部电路初始状态为高,那如果时输入IO口,则不需要再设置上拉;如果是输出属性,则需要把输出设置为高,这样在端口上就不会出现损耗。注意没有使用的端口也是进行初始化配置,让这些端口处于最省电状态。(4)合理使用GPIO口的休眠、唤醒功能;现在先进一点的arm内核的MCU,都已经具备端口休眠功能,可通过电平或边沿状态变化进行唤醒,这样可以节约MCU运行功耗。(5)在设计程序时,使用合适的工作主频,决定MCU的功耗水平,并不是主频越高越好,能满足设计的需要即可;另外在设计GPIO口的输入功能时,能使用中断触发的,就不要采用定期查询的方式,定期查询的方式对于MCU的功耗来说肯定是大于中断触发式的。
(6)我们一般在应用GPIO口时,都是用来驱动一些外围电路,最简单的就是LED状态灯,千万别小看这个LED灯的设计,或者一个最基本的设计也会让你多付出 1~2mA的功耗,对于一个超低功耗的设计来说,也是不能忍受的。因此不要忽略每个细节外围电路,在选型LED灯器件时,选择高转换效率的高亮灯,只需要0.5mA就能让它的亮度满足指示所需,而且如果能设计成间歇式指示(如呼吸灯),就不要设计成常亮式指示;这些都是节能的细节设计。
(7)外部功能模块如果不是需要持续工作的电路,都可以采用带控制端的方式,需要时将其打开,不需要时,关闭它的电源。下面举个最常见的一个NTC热敏电阻采样电路的设计:
上图为普通的设计电路,能实现功能,但是这个分压电路在时时刻刻损耗着功率;我们优化成如下:上图利用一个GPIO口,设置为开漏输出,初始化为开漏输出高,无上下拉,这时候电路是不起作用的,也不会有功率损耗;当需要进行温度采集时,可以将GPIO设置为输出低,这时候,电路起作用了,可以通过GPI去检测ADC的电压;实现对温度的检测,这个电路里省略了中间的一些防护和滤波电路,只是想给大家说明一个节约功耗的机理,希望大家是实际设计电路时能综合全面的考虑问题。其实低功耗设计,它涉及到MCU及外围电路的全面配合,肯定不只是GPIO这个功能模块所能覆盖的,但是所有的设计理念应该都是贯穿在我们每个设计环节里面的,因此,从小做起,让我们的产品指标更加的优秀,这就是我们开发人员的追求,欢迎各位小伙伴们留下你们宝贵的经验,可以私信交流。
欢迎小伙伴能分享转发,请注明文章来源,尊重原创,拒绝抄袭!

页: [1]
查看完整版本: MCU如何灵活配置GPIO使产品功耗更低?