软件工程师在调试软件时,遇到一个奇怪的问题。就是电路上用了一个IO口直接控制一个LED的亮灭,没有经过三极管做开关来控制,但是LED一直灭不了,软件上把IO口置0,LED就高亮,把IO口置1,LED变暗了,却灭不了。
软件工程师试了很多方法,都没有找到原因。怀疑是IO配置有问题,把IO由普通IO输出模式配置成推挽输出模式,没有效果,LED灭不了。怀疑是闪烁频率太快,把PWM取消,让IO口置1,一直输出高电平,结果一样,LED灭不了。又怀疑是LED的限流电阻阻值太小了,就把限流电阻阻值改大,情况也是一样,LED灭不了……
无奈之下,他只好请教我。我一听他描述完情况后,大概知道是什么原因了。然后,我让他把原理图给我看一下。他把原理图打开给我看,如下图。
我看了一下原理图,果然跟我预测的差不多,他的原理图上给LED供电的电压是5V,而单片机的工作电压是3.3V。
此时,我已经胸有成竹,跟软件工程师说,你把IO口配置成开漏输出就可以了。他听了,不解地问,他已经将IO配置成推挽输出都不行呀,配置成开漏输出能有什么用呢?
我让他照做就是,现在没时间跟他解释,我要去产线解决些问题。没办法,他只好硬着头皮捣鼓起来了。
等我从产线溜达一圈回来后,软件工程师已经笑嘻嘻的了。他说问题已经解决了,把IO口配置开漏输出就可以了。他一边怒赞我料事如神,一边让我给他解释原因。
我把原因详细地跟他解释清楚。因为原理图上给LED供电电压是5V,而单片机的供电电压是3.3V,也就是说单片机的IO口输出电压最大也只是3.3V,而且电路是直接用IO口驱动LED的,本来是IO的高电平是控制LED的灭的,但IO的高电平是3.3V,和LED的供电电压有1.7V的压差,满足了LED的导通条件,所以LED一直保持亮的状态,灭不了。但是IO配置成开漏输出时,此时IO的输出电压取决外部的上拉电源,而现在的上拉电源是5V,IO置高电平时是5V,LED的压降是0V,没有满足导通条件,所以LED灭了。