找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 158|回复: 7
打印 上一主题 下一主题
收起左侧

有没有什么方法可以使用单片机测量某信号初次到达时的脉冲宽度?

[复制链接]
跳转到指定楼层
楼主
本帖最后由 ziqidong 于 2025-8-6 09:29 编辑

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


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

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



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

示意图

示意图
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:1109793 发表于 2025-8-6 10:47 | 只看该作者
不是定时器可以设定为计数器受某个引脚控制码?
回复

使用道具 举报

板凳
ID:1157301 发表于 2025-8-6 11:02 | 只看该作者
看不太懂,是有一个固定的方波A跟一个随机出现的信号B,然后要知道B出现时是在方波的什么相位跟宽度吗?如果是这样,用2根INT脚,一根量A一根量B,A出现时启动timer,直到B触发结束timer,应该比用while计时准确很多。
回复

使用道具 举报

地板
ID:1133081 发表于 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;                //开定时器
        }
}
回复

使用道具 举报

5#
ID:828160 发表于 2025-8-6 12:16 | 只看该作者
外部中断了解一下,你这种情况要使用双沿中断
回复

使用道具 举报

6#
ID:1121801 发表于 2025-8-6 13:39 | 只看该作者
这个相当于测量一个跳变信号的持续时间吧,用外部中断加定时器,时间会准确一点.测量出来的时间还要加上程序语句运行的时间,当然这个可以在程序中做较正.还有就是信号源的跳变是否在下降沿有坡度式下降,如果不是即时跳变,那么可能CPU没有那么快识别跳变过程,那样可能把跳变过程中的一段时间也加上了
回复

使用道具 举报

7#
ID:807591 发表于 2025-8-6 13:51 | 只看该作者
中断可以试试
回复

使用道具 举报

8#
ID:401564 发表于 2025-8-7 13:05 | 只看该作者
先声明一个全局变量用来记录时间,再声明一个标志,用来判定启动还是停止
1,信号端口要使用中断,中断被触发之后,根据端口电平判断是上升还是下降,用来确定是启动还是停止
如果是启动,那就清除时间变量,并标志为启动
如果是停止,那就标志停止,在主程序中读取时间变量
2,写一个定时器中断,可以是500uS或者1mS,在中间中根据标志来对时间变量进行累加
这就可以了呀
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表