单片机IO口不够,我想用一个IO口既实现输入功能又实输出功能,但是出问题了
最近设计一个产品,由于功能比较多,所用的单片机的IO已经用完,但是还有一个功能需要用到一个IO口控制。
这个功能是这样的,检测到充电时,就关掉电池的供电,而充电IC有一个充电检测脚,则好用了单片机最后的一个IO脚。单片机IO不够,如果这个功能一定要有的,省不掉,那岂不是要更换单片机,换成IO口比较多的单片机。但是换单片机成本又要增加了,老板那边不是很乐意。
在这左右为难的时候,我突然冒出了一个想法,能不能用一个IO口既可以实现输入功能,又可以实现输出功能。我琢磨了一下,好像可以用充电IC那个充电检测IO去实现这个想法。因为充电IC那个充电检测脚是开漏输出的,我打算让这个充电检测脚经过一个电阻连接到单片机的IO上,再经过一个电阻连接到一个控制电池电源的MOS管的一个三极管的基极上,如下图所示。
工作原理计划是这样的,单片机的IO(PB9)设置成输入模式,并且设置成上拉。当没有充电时,充电IC的充电检测脚输出高电平,三极管Q21导通,MOS管Q20导通,电池电源供电。当充电时,充电IC的充电检测脚输出低电平,IO(PB9)检测到低电平,认为设备进入了充电状态,就开始做一些充电时的相关操作,并且这时Q21截止,MOS(Q20)也就截止,电池电源断开,从而实现了文章开始所说的功能。
想法是美好的,但现实是残酷的。当PCB板做回来后,不管是不是充电状态,单片机PB9检测到的状态一直都是低电平。
经排查,发现是三极管导通时,基极电压变成0.6V,因为单片机的IO设置成输入模式时,上拉是弱上拉,驱动能力弱,限流电阻压降小,最终到IO的电压是0.6V加上电阻的压降,达不到高电平的电压范围。所以充电时,PB9电压是0V,单片机检测到低电平,不充电时,PB9电压虽然比0.6V大一些,但是单片机识别出来还是低电平,因此不管是充电还是不充电,PB9检测到的都是低电平。
为了解决这个问题,我思考了很久。最后被我想出了一个办法,就是把三极管Q21换成N沟道MOS管。因为三极管是电流控制电压的器件,输入阻抗低,而MOS管是电压控制电流的器件,输入阻抗高,这样输入高电平时,电平不会被拉低。
最后,更换器件,验证功能正常。