一、前言
今天看到网络上一个短视频,一位面试官询问学生,这个单片机电路有什么问题? 如何解决?
这个问题就在于工作在3.3V下的STM32单片机是无法关断 PNP 三极管的,这是因为它的发射极连接到5V电压。面试官看到学生无法回答如何来解决这个问题,于是给出了解决这个稳妥的答案,那就是将 STM32的端口设置为 漏极开路模式,这样就可以关断三极管了。
实际是,这个问题真正的答案是在三极管的基极增加一个 4.7k欧姆左右的分压电阻,才能够实现对连接到5V的PNP三极管的开关控制。下面让我们通过实验来检查一下吧。
二、测试电路
为了测试IO的开关电压特性,将 F103单片机的四个端口引至外部实验面包板。设计单面电路板,适合一分钟制板。
ADTest2024OctoberTeSTSTMIO.PcbDoc
▲ 图1.2.1 测试PCB
一分钟之后得到测试电路板,焊接电路,将四个 IO端口连接到测试面包板上。设置四个IO口,分别是 漏极开路、推挽输出、带有上拉电阻的输入端口,带有下拉电阻的输入端口。端口的特性,在 CubeMX 中进行设置。下面就可以分别测试这四个端口的输出耐压了。
三、漏极输出
测试漏极开路输出端口。周期在该端口输出 0 和 1。可以看到该端口的信号波形呈现周期低电平以及浮动干扰信号。在OB输出1 的时候,该端口呈现高阻状态。下面,测试一下漏记开路的时候能够上拉到多高的电压。
d:NutdiskMicroVideoG4M1727837766_1920_1080.MP4
▲ 图1.3.1 OD输出端口的波形
使用一个 10k欧姆电阻,将 漏极开路的 IO 连接到 5V。此时,该端口的电压为 3.7V。通过内部结构可以看到,在端口有钳位二极管,将输入端口电压钳位的工作电压。只有某些5V容忍端口,钳位二极管上拉到 更高的 电压,此时输入电压才能够达到5V。不过现在 F103 单片机的这个端口只能上拉到 3.3V。
在F103数据手册中,关于GPIO的 5V 容忍性 说明中,只有输入端口才能够容忍5V输入。一旦端口设置为输出状态,该端口就不再允许电压达到5V了。下面我们测量一下输入端口是否允许电压超过5V。
四、输入端口
将10k欧姆的电阻修改在输入端口,仍然上拉到5V,该端口电压还是被钳位在 3.7V。由此可见,该输入端口也不是5V容忍的端口。下面查看一下 STM32的数据手册,确认该端口是否为 5V容忍的。
在STMF103数据手册中,现在实验所使用的PB12到PB15端口 都是5V容忍的。这就奇怪了,为什么上拉电阻达到 5V,该端口的电压无法上升的5V呢。无论是输入端口还是 漏极开路端口。
五、驱动LED
将一个红色 LED 串联330 欧姆电阻,上拉到 5V,连接到单片机的输出端口。可以发现 无论是 漏极开了 ,还是推挽输出,LED都可以正常闪烁。这有可能是因为 LED的 开启电压超过 1.3V,所以,3.3V工作的单片机可以关断这个连接到5V电压的LED。
▲ 图1.5.1 驱动上拉5V的LED
上面是测试了直接驱动上拉到5V的LED的情况。下面,再测试一下使用 PNP三极管驱动LED的情况。看是否能够对 PNP三极管进行关断。
使用 8550 这颗 PNP 三极管搭建电路,可以看到,LED 并没有闪烁。这说明,使用 3.3V 的单片机,驱动 PNP 三极管,是无法将三极管关断的。
下面给电路增加一个基极分压电阻。这个电阻为 4.7k欧姆,这样在剩余的电压中,分压到三极管基极只有 0.43V。就不足以将PNP三极管打开了。测试一下这种情况。可以看到,此时LED开始闪烁。这说明只要增加一个基极分压电阻,便可以控制PNP三极管的打开与关断了。
※ 总 结 ※
本文测试了 3.3V工作的单片机 控制5V负载的情况。单片机IO口可以直接控制连接到5V的LED的打开与关断,如果控制PNP三极管,通过增加基极分压电阻,也可以实现PNP三极管的打开与关断。