STM32 | 外部检测0V 5V电平信号输入的故障检测及排查

本部分的电路设计如图所示,主要是通过3.96插座,接收检测外来的0V或者5V信号,然后做出相应的动作 。
原理图中200欧姆电阻,主要起限流保护作用,同时这里使用了一个器件BAV99,他的作用在这里再复习一下:
当正的静电发生时, D2 工作但D1不工作,因此这个钳位电压是5V加上D2的正向电压 。
当负的静电发生时,D1 工作但D2 不工作,因此这个钳位电压是D1的正向电压 。
如果放在接口电路部分,是为了抑制传导抗扰 。接口电路的共模干扰耦合进来后,会在信号线上产生双向的高电压,使用BAV99,电压幅度会在接口处被箝位 。但是,有了外来干扰后,正压箝位用的电源上将会产生较大的噪声 。同样,负压箝位在地上也会产生较大的噪声 。所以通常建议BAV99和接口阻容滤波一起使用 。
本质就是俩二极管,一个接地,一个接VDD,保护和限幅用的 。
因为输入进来的是5V的电压,所以MCU的输入IO口一定要选择可以兼容FT 5V的IO口 。
这个部分的使用,下拉输入,初始化,检测外来高电平就可以了,思路很简单,但是却出现了问题,下面细细道来 。
一开始,配置完成,然后在主程序中写好了Fan的判断(就是本次的风机故障检测端口PB15),结果当我输入5V到Fan时,程序始终无法正常的读取到我输入的高电平信号 。
起初我以为是程序中的逻辑错误,以及初始化过程中,上拉,下拉,或者初始化电平出现问题,或者读取IO口出现问题,但是改了一圈,发现依然无法正常读取到高电平 。
首先作为一个有前科搞坏掉一个MCU的人来说,我把Fan设置成了PBin(15),目的是让Fan可以在内部置高电平,然后通过KEIL进入到这个模式 。试试到底能不能进入我的程序逻辑中,判断一下主程序有没有错误 。
这里就是步进式的观察,观察程序时候能够识别Fan = 1的情况,能否进入相应的if判断中 。很高兴的是,主程序逻辑没有问题,达到了我的预期效果 。那么现在的主要问题就是IO口正常,但是就是不能正确的读取到正确的电平信号 。
这个时候就不能再从软件逻辑找问题了,需要上硬件检测——万用表 。
可惜家里条件受限,只有那种比较老式的电表 。,不过也就测个5V以内的电压 。首先,代码中将IO口上拉,外部悬空,测到P3电压0.6V大小,这是不正常的,然后在代码中编写程序,使得这个IO口循环置高和置低,然后测量,发现电表示数为0V 0.6V跳动 。也就说明P3的口和PB15之间的器件出现了问题 。

STM32 | 外部检测0V 5V电平信号输入的故障检测及排查

文章插图
根据原理图,中间只有一个保护IO口的BAV器件和一个限流电阻,然后开始侧重检测这两个部分的电压 。
【STM32 | 外部检测0V 5V电平信号输入的故障检测及排查】设置会下拉输入模式,输入进来5V高电平,测量这个位置,发现R19右侧电压可以达到5V,也就说这部分没问题,正常 。
接下来是R19的两侧电压,结果发现电压达到了4.4V,也就是输入进来的5V电压都被电阻R19分压了,被钳位住了 。
进一步的验证测量,D5和R19的连接处,确实被钳位住了0.6V电压,这也就是为什么IO口检测不到高电平,因为电压被钳位了 。
找到原因后,取下来BAV器件,测试通过,这时候可以正常读取到高电平 。
随后跟老师交流中,以及焊接那边的确认,大概率是因为D5器件焊接错误,不是设计中要求的BAV器件 。