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

上拉/下拉电阻虚焊或忘记焊接时的解决办法
微信图片_20250715181045
要求低电平信号在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调用一次,测量实际引脚状态
didianping
输入低电平时引脚电平
上升沿为开启内部上拉的引脚充电过程,下降沿为关闭内部上拉后引脚放电过程,周期过程为
1、Time_0ms,开启内部上拉,开始引脚充电;
2、Time_3.5ms,关闭内部上拉,引脚开始放电;
3、Time_7ms,读取引脚电平状态(数字IO);
4、Time_10.5ms,开启内部上拉,等同于Time_0ms。
P.S.设计调用间隔3.5ms,实际来看是7ms调用一次,程序上还是有问题= =!。

高电平
输入高电平时引脚电平
因为没有外部输入的低电平了,步骤3时的放电很缓慢,能够采集到高电平。

实际效果符合预期。暂未实际应用测试

再说一点这里遇到的坑,该项目原设计是这样的
微信截图_20250715184721
结果量产时发现了问题,后分析问题原因如下:
主控的GND和外部的GND之间不能保证连接OK,当产品内部GND和外部负控开关连接的GND压差超过1V时,导致MCU的检测1/2口电压低于MCU Vss电压0.3V以上,然后可能是触发了低压的IO损坏,或者是该IO损坏导致了整个芯片损坏。
损坏表现是,该IO和芯片VSS或VDD直通,或者芯片VDD和VSS直通,然后产品报废 = =!;
20250715

posted @ 2025-07-15 18:27  超级小浣熊  阅读(17)  评论(0)    收藏  举报