Holtek随笔-上拉/下拉电阻虚焊或忘记焊接时的解决办法
上拉/下拉电阻虚焊或忘记焊接时的解决办法

要求低电平信号在1.5V以下,内部上拉电阻约10~30K,按此要求R35,R37需要贴100K电阻比较稳妥,量产时BOM出错导致没贴。
发现以上问题后有了一个想法,通过软件设置引脚充放电来检测是否有低电平输入,在此做个记录。
点击查看代码
static u8 Test_Sig_Status; /*检查引脚电平状态机参数 */
static u8 test_Point1_Cnt; /*引脚电平1计数器,用来做消抖 */
static u8 test_Point2_Cnt; /*引脚电平2计数器,用来做消抖 */
/*连续3次低电平认为是有效,连续3次高电平认为是无效*/
void Test_Sig_Rev(void)
{
if(USER_TASK_CNT_RUN_MODE_FLAG)
{
return;
}
switch(Test_Sig_Status)
{
case 0:
_pbpu1 = 1;/*开启对应引脚上拉,给悬空引脚充电*/
_pbpu2 = 1;
Test_Sig_Status = 1;
break;
case 1:/*关闭对饮引脚上拉*/
_pbpu1 = 0;
_pbpu2 = 0;
Test_Sig_Status = 2;
break;
case 2:/*检测引脚电平状态*/
if(INPUT_LAST_1 == _pb1) /*检查引脚电平和上次记录的电平是否相同 */
{
test_Point1_Cnt++; /*计数消抖 */
if(test_Point1_Cnt > 3)
{
test_Point1_Cnt = test_Point1_Cnt;
INPUT_Pin_1 = INPUT_LAST_1; /*设置输入状态标志位 */
}
}
else
{
INPUT_LAST_1 = _pb1; /*将上次记录的电平重置 */
test_Point1_Cnt = 0; /*重置消抖计数器 */
}
if(INPUT_LAST_2 == _pb2)
{
test_Point2_Cnt++;
if(test_Point2_Cnt > 3)
{
test_Point2_Cnt = test_Point2_Cnt;
INPUT_Pin_2 = INPUT_LAST_2;
}
}
else
{
INPUT_LAST_2 = _pb2;
test_Point2_Cnt = 0;
}
Test_Sig_Status = 0;
break;
default:
Test_Sig_Status = 0;
break;
}
return;
}
使用时以上代码3.5ms调用一次,测量实际引脚状态

输入低电平时引脚电平
上升沿为开启内部上拉的引脚充电过程,下降沿为关闭内部上拉后引脚放电过程,周期过程为
1、Time_0ms,开启内部上拉,开始引脚充电;
2、Time_3.5ms,关闭内部上拉,引脚开始放电;
3、Time_7ms,读取引脚电平状态(数字IO);
4、Time_10.5ms,开启内部上拉,等同于Time_0ms。
P.S.设计调用间隔3.5ms,实际来看是7ms调用一次,程序上还是有问题= =!。

输入高电平时引脚电平
因为没有外部输入的低电平了,步骤3时的放电很缓慢,能够采集到高电平。
实际效果符合预期。暂未实际应用测试。
再说一点这里遇到的坑,该项目原设计是这样的

结果量产时发现了问题,后分析问题原因如下:
主控的GND和外部的GND之间不能保证连接OK,当产品内部GND和外部负控开关连接的GND压差超过1V时,导致MCU的检测1/2口电压低于MCU Vss电压0.3V以上,然后可能是触发了低压的IO损坏,或者是该IO损坏导致了整个芯片损坏。
损坏表现是,该IO和芯片VSS或VDD直通,或者芯片VDD和VSS直通,然后产品报废 = =!;
20250715
浙公网安备 33010602011771号