打印

请教单片机用计数器计数高频脉冲的问题!!

[复制链接]
8600|12
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
samyoju|  楼主 | 2012-4-20 21:11 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
我用的单片机是STC12C5A60S2单片机晶振是12M

我用中断和计数器来数脉冲。
外部中断的频率是1Hz
计数器输入脉冲频率是500KHZ

要中断10秒数5000000个脉冲
但是现在我数到的脉冲总比5000000个脉冲少100到200多个脉冲!

如果排除硬件问题。软件上面在哪里可以改善呢???

我是计数完65536次才中断一次的。

5000000个脉冲大概有76次中断。

会不会每次中断漏掉了1到2个脉冲???

请教一下大家。有什么办法改善啊?

相关帖子

沙发
logokfu| | 2012-4-20 21:32 | 只看该作者
能把程序发出来看看嘛

使用特权

评论回复
板凳
lyjian| | 2012-4-20 21:36 | 只看该作者
本帖最后由 lyjian 于 2012-4-21 09:04 编辑

要计数脉冲你整个1Hz的外部中断干嘛?
如果计数器每次都是自由运行的话(软件不去写它,最后一次再写预置值),那每次中断它都是不会丢脉冲的(因为是硬件计数,中断程序跑的时候它还在计数)。
估计你的1Hz有问题
另外,没有软件,谁知道你的问题在哪

使用特权

评论回复
地板
samyoju|  楼主 | 2012-4-20 21:51 | 只看该作者
根据外部中断信号来计数。就是计数10个外部中断的信号中间的计数脉冲!

计数器中断程序:
void counter0_interrupt(void) interrupt 1 using 2
{
        TL0 = 0;
        TH0 = 0;

        std_pulse_count++;
}

外部中断程序:
void extint0_interrupt(void) interrupt 0
{
        idata uchar x,y;
        idata union
        {
                ulong tmp;
                uchar a[4];
        }union_tmp;

        meter_pulse_count0++;

        if((start_flag == false)||(calc_flag == true)) //找到脉冲起点
        {
           Enable_Counter0();
           meter_pulse_count0 = 0;
           start_flag = true;
           calc_flag = false;
           ok_flag = true;
        }

        if((meter_pulse_count0 >= yg_cycles)&&(ok_flag == true))  //到设定的圈数
        {
            Disable_Extint0();
            Disable_Counter0();
                               
           do{                               
                x = TH0;
                union_tmp.a[2] = TH0;
                union_tmp.a[3] = TL0;
                y = TH0;
           }while(x != y);

           union_tmp.a[1] = std_pulse_count%256;
           union_tmp.a[0] = std_pulse_count/256;

           counter0_cnt = union_tmp.tmp;       

           end_flag = true;
           ok_flag = false;       
        }               
}

使用特权

评论回复
5
lyjian| | 2012-4-20 22:08 | 只看该作者
你这样写T0中断程序,肯定丢脉冲啦

使用特权

评论回复
6
samyoju|  楼主 | 2012-4-20 22:29 | 只看该作者
5# lyjian
请教一下,我该怎么写啊??

使用特权

评论回复
7
lyjian| | 2012-4-20 23:08 | 只看该作者
不要重写T0=0,溢出后T0本来就是从0开始计算,你在中断里重写为0,不就把已经计数的脉冲丢了。

使用特权

评论回复
评分
参与人数 1威望 +1 收起 理由
samyoju + 1
8
samyoju|  楼主 | 2012-4-21 08:51 | 只看该作者
哦,就是不要重新装载计数值!!
等我改了试一下。。

使用特权

评论回复
9
samyoju|  楼主 | 2012-4-21 11:42 | 只看该作者
改了之后,变好了。。 变成多数了6个脉冲!!!
哪里还能改善呢??

使用特权

评论回复
10
lyjian| | 2012-4-21 12:20 | 只看该作者
你这样做从外部中断信号有效到中断程序再去读T0的数据本来就有延时(多6个脉冲那就有3uS)的延时,要改善的话减少中断响应延时时间或软件补补偿计数个数。

使用特权

评论回复
11
samyoju|  楼主 | 2012-4-21 13:40 | 只看该作者
我想也是这样了。多谢你了!学到东西了。。

使用特权

评论回复
12
engineertky| | 2012-8-4 11:09 | 只看该作者
有启示!

使用特权

评论回复
13
lianfutiana| | 2016-8-6 21:06 | 只看该作者
顶一个

使用特权

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

本版积分规则

8

主题

35

帖子

2

粉丝