89c51用于比较高的精度测速

zhangbochao5   2008-10-24 09:08 楼主
这个程序是很好,但是对于测试要转速在3--10000转每分钟来说,精确度低了,范围小了,
我想通过计数器的值来测出一个转速脉冲的所用的指令条数,然后用1s(或者一分钟) CPU可以执行的条数,来求出转速。
这个方法可行吗?如何测出这个转速脉冲的计数器的值呢?谢谢各位支援
引用 2 楼 guetcw 的回复:
乱七八糟的,试试这个

C/C++ code
volatile unsigned int Tick;
volatile unsigned char IrqTimes;
bit Falg_TimeOut;

void Time0_IRQ() interrupt 1 using 1
{
    TH0 = 0x3C;
    TL0 = 0xB0;//50mS
    if(++IrqTimes >= 10)
    {
        IrqTimes = 0;
        Flag_TimeOut = 1;
    }
}

void INT0_IRQ() interrupt 0
{
    if(! Flag_TimeOut)
    {
        Tick++;
    }
}

void Regi…

回复评论 (4)

引用: 引用楼主 longhaluo 的帖子:
我想通过计数器的值来测出一个转速脉冲的所用的指令条数,然后用1s(或者一分钟) CPU可以执行的条数,来求出转速。

你这个方法精度更低,除非你用FPGA。你可以算算10000转的时候,每转周期是100uS,以12M晶振来算,一个机器周期是1uS,中断响应大概10uS左右,你算算这个误差是多大。正确方法是,高频段用定时一定的时间(51的定时器最长只能定时60多ms,12M晶振,可以重复多次从而获得更长的定时时间),在这个时间里去对中断脉冲计数。这种方法误差一般不会超过2Hz,但在频率很低的时候误差就大了,这时候可以加大定时时间,只要处理好定时精度和益出处理,误差基本为0,我在学校的时候做1Hz-100KHz的误差不会超过1Hz,当然实际处理要复杂些。
点赞  2008-10-24 10:08
如果你想要高频低频都测得比较准,建议你用AVR单片机做,用它的定时器捕获功能,测占空比都可以达到比较高的精度。
我曾经用AVR的单片机测1-1MHz误差都不会超出1Hz。
点赞  2008-10-24 10:19
是10000/分钟哈,频率在160HZ低频就低了,在0.05HZ左右,如何把中断设置成上升沿触发呢,看到的都是下降沿触发
点赞  2008-10-24 13:59
转速在3--10000转每分钟

如果换成脉冲的话那就是:

10000Hz哈

也就10K

用快点的单片机

26M

26 000 000 / 10 000 == 2 600

如果单片机够快,是完全没有问题的

这个容量大

呵呵
点赞  2008-10-24 14:02
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 京公网安备 11010802033920号
    写回复