说到上下拉电阻的作用,在课本中学习时经常会看OD OC门、增强输出驱动能力、维持确定的高低电平状态、抗外界干扰......
之前始终对维持确定的高低电平状态没有足够深的理解,既然单片机自身是有输出高低电平的能力,为什么还需要在外部上下拉,这不是浪费能量吗?
直到自己做项目遇到了奇奇怪怪的现象,并且最终解决了问题,才算是真正体会到了上下拉电阻的必要性。
原来的电路方案如上图,左边板卡中的MCU使用两个通用IO口控制右边的按键板,按键板控制机器的启动和关闭,其中用LED1和LED2两种颜色的灯来指示机器开关机状态。指示灯的要求是机器通电LED1亮,开机LED1灭LED2亮,关机LED1重新亮LED2灭。
非常简单的一个单片机控制方案,装上机器之后却出了问题:220V通电后1~2s的时间内两颗LED灯是同时点亮的,随后LED2才灭。
一开始始终想不通,LED2程序都没有给高电平,他怎么会亮。后来才想起来,从单片机启动到程序运行是有一段时间的,而这个时间IO口的状态是默认状态,查询单片机手册,发现默认状态是有内部上拉。内部上拉电阻阻值是10k。
这么一来,就说得通了,设计右边板卡的工程师三极管下拉电阻其实是为了管子的开关特性考虑,而左边板卡又没有加上下拉。右边板卡的三极管基极下拉电阻是20k,单片机内部上拉电阻为10k,3.3V的供电电源,三极管基极电压就能达到2.2V,足够将三极管导通,因此就出现了两颗LED都点亮的现象。
随后把R1和R2的阻值都改为了1k,通电后发现再没有LED同时点亮的情况。但是很不巧,又出现了一个问题,机器关机时需要LED1再次亮起,LED2灭掉,但状态切换后LED1又出现了一个闪灭的现象。原来是单片机的程序中写了机器关掉之后会有一个自身的复位,而单片机在复位的时候引脚也是默认状态!所以复位的时候本来是需要LED1常亮的,结果因为电阻改小了他又闪灭。
当然把R1又改回20k就能达到要求了。但这毕竟只是止血措施,否则项目改版的成本会增加不少,而且单片机引脚的上下拉本也不是右边板卡的责任范围。
如上图电路应该是本设计比较好的方案,经过了这个电路的问题分析和改进,才算是深入理解了为什么上下拉电阻能够维持IO口的稳定状态。现在,不论是单片机启动时IO口的默认状态,还是复位时的重置,都不会对LED的状态产生影响,因为在单片机状态没定时有上下拉电阻来给。而右边板卡设计时使用的基极下拉电阻正常使用和选择阻值也不会有影响。
全部0条评论
快来发表一下你的评论吧 !