标题: 有没有什么方法可以使用单片机测量某信号初次到达时的脉冲宽度? [打印本页]

作者: ziqidong    时间: 2025-8-6 09:28
标题: 有没有什么方法可以使用单片机测量某信号初次到达时的脉冲宽度?
本帖最后由 ziqidong 于 2025-8-6 09:29 编辑

场景如下:              
      目标信号是一个近似的方波信号,周期为20ms,出现时间未知,出现相位未知,可以通过测量信号出现时的初始脉冲宽度,获取信号到达时的相位信息。


      我尝试在while循环中不断轮询信号引脚的电平,高电平开启计时至下降沿停止计时,以此来获取信号的初始脉冲宽度。但发现测量出的脉冲结果异常,出现个别大于10ms的情况(13ms,15ms、18ms等),而方波信号的周期只有20ms,由于信号刚到达时波形不完全,理论上测量到的脉冲宽度应该小于10ms,出现大于10ms的结果,说明测量方法有误。

       想问问各位大佬有没有什么方法可以使用单片机测量信号初始波形的脉冲宽度?



51hei图片_20250806091038.jpg (2.47 MB, 下载次数: 0)

示意图

示意图

作者: xiaobendan001    时间: 2025-8-6 10:47
不是定时器可以设定为计数器受某个引脚控制码?
作者: skilldog    时间: 2025-8-6 11:02
看不太懂,是有一个固定的方波A跟一个随机出现的信号B,然后要知道B出现时是在方波的什么相位跟宽度吗?如果是这样,用2根INT脚,一根量A一根量B,A出现时启动timer,直到B触发结束timer,应该比用while计时准确很多。
作者: WL0123    时间: 2025-8-6 11:18
试试外部中断(上升沿和下降沿)加定时器计数。
void INT0_Isr() interrupt 0
{
        if (P32)                    //判断上升沿和下降沿
        {
                TR0 = 0;                //关定时器
                tempL=TH0<<8|TL0;       //读取脉冲低电平持续时间
                TL0 = 0x00;                                //设置定时初始值
                TH0 = 0x00;                                //设置定时初始值
                TR0 = 1;                //开定时器
        }
        else
        {
                TR0 = 0;                //关定时器
                tempH=TH0<<8|TL0;       //读取脉冲高电平持续时间
                TL0 = 0x00;                                //设置定时初始值
                TH0 = 0x00;                                //设置定时初始值
                TR0 = 1;                //开定时器
        }
}
作者: 单片机研究协会    时间: 2025-8-6 12:16
外部中断了解一下,你这种情况要使用双沿中断
作者: cyi8    时间: 2025-8-6 13:39
这个相当于测量一个跳变信号的持续时间吧,用外部中断加定时器,时间会准确一点.测量出来的时间还要加上程序语句运行的时间,当然这个可以在程序中做较正.还有就是信号源的跳变是否在下降沿有坡度式下降,如果不是即时跳变,那么可能CPU没有那么快识别跳变过程,那样可能把跳变过程中的一段时间也加上了
作者: szb314    时间: 2025-8-6 13:51
中断可以试试
作者: Y_G_G    时间: 2025-8-7 13:05
先声明一个全局变量用来记录时间,再声明一个标志,用来判定启动还是停止
1,信号端口要使用中断,中断被触发之后,根据端口电平判断是上升还是下降,用来确定是启动还是停止
如果是启动,那就清除时间变量,并标志为启动
如果是停止,那就标志停止,在主程序中读取时间变量
2,写一个定时器中断,可以是500uS或者1mS,在中间中根据标志来对时间变量进行累加
这就可以了呀
作者: weisc6955    时间: 2025-8-8 16:40
有一个极其简单的办法,52单片机,T0, T1计数器都有一个门控状态,将被测信号加到比如说 T0的控制门INT0 端上,TO设定为对内部时钟计数。于是一个周期过后T0的计数值就对应着输入脉冲的“正宽度时间”。如果想测量输入负脉冲宽度,将输入倒向后脉冲加到T1的控制门INT1 上,T1对内部时钟计数,于是就可以得到负脉冲宽度时间。 由于是单片机确定的硬件特性,基本没有软件的附加误差。




欢迎光临 (http://www.51hei.com/bbs/) Powered by Discuz! X3.1