打印
[51单片机]

如何用单片机对脉冲信号进行测量

[复制链接]
9138|25
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
沙发
排山倒海| | 2014-7-27 09:34 | 只看该作者
贴错图了吧?没看到脉冲信号图,也没看到具体要求,只要检测是否有信号还是要求测时间或频率?

使用特权

评论回复
板凳
排山倒海| | 2014-7-27 10:28 | 只看该作者
这种测量稍微复杂一些,需要用多个变量和步骤测量。关键是时间范围是多少,测量1uS和1mS的算法差别较大,甚至影响到硬件设计。

使用特权

评论回复
地板
ningling_21| | 2014-7-27 10:42 | 只看该作者
一般用定时器对高低电平分别计时,再计算其它数据...

使用特权

评论回复
5
nightingale2003| | 2014-7-27 10:47 | 只看该作者
脉冲周期检测,用P34 P35的定时器检测电平功能应该能容易些吧,具体的没试过

使用特权

评论回复
6
ZG11211| | 2014-7-27 10:48 | 只看该作者
简单啊,全程记录每一个翻转的时间,也就才8个变量

使用特权

评论回复
7
笑红尘|  楼主 | 2014-7-27 11:41 | 只看该作者
排山倒海 发表于 2014-7-27 10:28
这种测量稍微复杂一些,需要用多个变量和步骤测量。关键是时间范围是多少,测量1uS和1mS的算法差别较大,甚 ...

我用示波器测得的脉冲频率为48HZ左右

使用特权

评论回复
8
排山倒海| | 2014-7-27 11:51 | 只看该作者
本帖最后由 排山倒海 于 2014-7-27 11:53 编辑

频率为48kHz对应周期约20uS,脉冲宽度约10uS,需要单片机硬件模块或特殊外围硬件才能解决。定时中断或其它中断如果要10uS响应并处理完相关程序功能很困难。

使用特权

评论回复
9
笑红尘|  楼主 | 2014-7-27 12:08 | 只看该作者
排山倒海 发表于 2014-7-27 11:51
频率为48kHz对应周期约20uS,脉冲宽度约10uS,需要单片机硬件模块或特殊外围硬件才能解决。定时中断或其它 ...

          这是用示波器测得的波形和参数

使用特权

评论回复
10
排山倒海| | 2014-7-27 12:48 | 只看该作者
本帖最后由 排山倒海 于 2014-7-27 12:52 编辑
笑红尘 发表于 2014-7-27 12:08
这是用示波器测得的波形和参数


看走眼了,只有48Hz用定时中断就可以检测了。
频率为48Hz对应周期约20mS,脉冲宽度约10mS,定时中断100-200uS可以处理。

使用特权

评论回复
11
笑红尘|  楼主 | 2014-7-27 13:16 | 只看该作者
排山倒海 发表于 2014-7-27 12:48
看走眼了,只有48Hz用定时中断就可以检测了。
频率为48Hz对应周期约20mS,脉冲宽度约10mS,定时中断100-2 ...

请问一下有具体的类似的测试程序吗

使用特权

评论回复
12
排山倒海| | 2014-7-27 13:38 | 只看该作者
没有测试程序,没有做过一样的项目,可以搜索红外遥控接收解码参考,如果不是通用应用就需要自己设计程序。
TAB有点奇怪,可以分为两个时间吧,这样可以用4个变量分别记录Tab1、Tab2、Tac、Tad脉宽,再增加一个变量协助指示步骤。
如果只是测每个小步骤(方波)的周期记录两次上升沿间隔时间,如果测高电平脉宽测上升沿和下降沿之间时间。

使用特权

评论回复
13
笑红尘|  楼主 | 2014-7-27 13:52 | 只看该作者
排山倒海 发表于 2014-7-27 13:38
没有测试程序,没有做过一样的项目,可以搜索红外遥控接收解码参考,如果不是通用应用就需要自己设计程序。 ...

你的回答让我有点思路,谢谢

使用特权

评论回复
14
鸟鸟| | 2014-7-27 20:09 | 只看该作者

使用特权

评论回复
15
笑红尘|  楼主 | 2014-7-27 22:02 | 只看该作者
排山倒海 发表于 2014-7-27 12:48
看走眼了,只有48Hz用定时中断就可以检测了。
频率为48Hz对应周期约20mS,脉冲宽度约10mS,定时中断100-2 ...

这个定时中断为100 us是和为200 us时有什么区别,检测到的脉冲宽度有什么差别。如果我设成1 s的中断会怎么样??

使用特权

评论回复
16
排山倒海| | 2014-7-28 00:16 | 只看该作者
要检测10mS脉宽,为了保证一定程度的检测精度,单片机检测时间间隔一般要快两个数量级,如果你用同时有上升沿和下降沿外中断的单片机,可以不用定时中断开得时间间隔较短,否则需要在定时中断中检测吧!

使用特权

评论回复
17
笑红尘|  楼主 | 2014-7-28 07:30 | 只看该作者
排山倒海 发表于 2014-7-28 00:16
要检测10mS脉宽,为了保证一定程度的检测精度,单片机检测时间间隔一般要快两个数量级,如果你用同时有上升 ...

用脉冲接到INT0中,让后让T0计数时把GATE为置1进行计数,计数得到的值即为脉冲宽度

使用特权

评论回复
18
lu50211| | 2014-7-28 08:47 | 只看该作者
用外部中断加定时器会比较准确。。。。

使用特权

评论回复
19
笑红尘|  楼主 | 2014-7-28 09:08 | 只看该作者
lu50211 发表于 2014-7-28 08:47
用外部中断加定时器会比较准确。。。。

#include<reg52.h>
#define uint unsigned int
#define uchar unsigned char
sbit dula=P2^6;
sbit wela=P2^7;
sbit P30=P3^0;
/*共阴数码管段码表*/
uchar code smgd[]={0x3f,0x06,0x5b,0x4f,
                                   0x66,0x6d,0x7d,0x07,
                                   0x7f,0x6f};
/***数码管位选表***/
uchar code smgw[]=
{0xfe,0xfd,0xfb,0xf7,0xef,0xdf};

uint count=0,n=0,prd=0;

uint read()
{
        uchar tl1,th1;
        uint t1;
        tl1=TL1;
        TL1=0;
        th1=TH1;
        TH1=0;
        t1=th1*256+tl1;
        return t1;
}

void delayms(uint t)
{
        uint x,y;
        for(x=t;x>0;x--)
        {
                for(y=114;y>1;y--);
        }
}

void T0timer() interrupt 1
{
        n=n+1;
        if(n==10000)
        {
                n=0;
                count=read();
                prd=2000000/count;
               
        }
}


void smgdisplay(uint smgdata)
{                                                          
        uchar s0,s1,s2,s3,s4;
        s4=smgdata/10000;
        if(s3>15)
        {
                s3=15;
        }
        s3=smgdata%10000/1000;
        s2=smgdata%10000%1000/100;
        s1=smgdata%10000%1000%100/10;
        s0=smgdata/10;
    P0=smgw[0];
        wela=1;
        wela=0;
        P0=smgd[s0];
        dula=1;
        dula=0;
        delayms(5);
        P0=smgw[1];
        wela=1;
        wela=0;
        P0=smgd[s1];
        dula=1;
        dula=0;
        delayms(5);
        P0=smgw[2];
        wela=1;
        wela=0;
        P0=smgd[s2];
        dula=1;
        dula=0;
        delayms(5);
        P0=smgw[3];
        wela=1;
        wela=0;
        P0=smgd[s3];
        dula=1;
        dula=0;
        delayms(5);
        P0=smgw[4];
        wela=1;
        wela=0;
        P0=smgd[s4];
        dula=1;
        dula=0;
        delayms(5);
}

void EXint0() interrupt 0                //外部中断0
{
        ET0=1;
}
void EXint1() interrupt 2                //外部中断1
{
        ET0=0;
        prd=0;       
}
void main()
{
        P30=0;
        EA=1;
        EX0=1;
        IT0=1;
        EX1=1;
        IT1=1;
        ET0=1;
        ET1=1;
        TMOD=0x52;
        TH0=56;
        TL0=56;
        TH1=0;
        TL1=0;
        TR0=1;
        TR1=1;
        while(1)
        {
                smgdisplay(prd);
               
        }
}
能帮我看一下这段程序吗,我用这段程序来测量时只有一个值总是没有什么变化。

使用特权

评论回复
20
排山倒海| | 2014-7-28 12:29 | 只看该作者
笑红尘 发表于 2014-7-28 07:30
用脉冲接到INT0中,让后让T0计数时把GATE为置1进行计数,计数得到的值即为脉冲宽度 ...

脉冲宽度的意思不同的人有不同理解,我比较倾向用脉宽来表示高电平时间,用周期来表示方波高电平和低电平的时间。如果只有上升沿或下降沿外中断只能测周期再换算脉宽,占空比不是0.5时就不能测脉宽。

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

3

主题

15

帖子

0

粉丝