ba_wang_mao 发表于 2011-4-25 17:13:42

请教马老师:按照你教材上的捕获模式获取频率,关于量程切换方面遇到实际的问题(高频率信

1、你在教材中说
          当频率 < 4khz ,测量量程N=1(也就是说连续捕获2个脉冲上升沿,认为一次测量)
          当频率 > 4khz 同时 频率 < 128khz , 测量量程N=64(也就是说连续捕获65个脉冲上升沿,认为一次测量)

   问题如下:

         (A)、   当前频率=100khz时,量程N=64.如果当频率=100KHZ时刚刚进入第2次捕获时,突然频率信号降至0.1HZ
   由于还需要再进入63次捕获中断,才能认为一次测量完成,而现在由于频率信号为0.1HZ(10秒钟才会产生一次上升沿)
导致63*10秒=630秒内,测量结果无法刷新(因为在63*10秒内,不会置icp_ok=1标志了)。 如何合理的解决上述实际问题呢?

         (B)、 当前频率=100khz时,量程N=64.如果当频率=100KHZ时刚刚进入第2次捕获时,突然频率信号消失,此后
测量结果永远不会再刷新了(因为永远不会置icp_ok=1标志了),如何合理的解决上述实际问题呢?

ba_wang_mao 发表于 2011-4-25 17:24:25

不知道我的方法是否可行?

       根据当前频率计算一个合理的“时间*3”,如果在“时间*3”内,还没有产生icp_ok标志,就认为频率信号出现上述现象(突然消失或陡降到很低的频率0.1HZ)此时,清除捕获中断和溢出中断、置icp_v2=0,置icp_v1=0,置icp_2=0,强制测量值fv=0.

      然后重新将N设置=1,重新启动捕获中断和溢出中断。

ba_wang_mao 发表于 2011-5-28 09:06:19

我顶。

guxingganyue 发表于 2011-5-30 17:02:53

回复【2楼】ba_wang_mao
-----------------------------------------------------------------------

楼主弄出来了没,,,我也正在看马老师的书想做一个频率计

但书上的程序有的地方没看懂,请指点

我觉得下面的程序有问题,怎么都是icp_2呢,应该第一个为icp_1,不知我这样理解是否正确,
还有就是那个while(1)中的测频算法有点看不懂,,,请指点。。我的qq:383953468

if (icp_ok == 1)    // 完成一次测量
          {
                if (icp_v2 >= icp_v1)          // 计算N个上升沿的时钟脉冲个数,
                    icp_2 = icp_v2 - icp_v1;   
                else
                    icp_2 = 65536 - icp_v1 + icp_v2;


void main(void)
{
    unsigned int icp_1,icp_2;
    long fv;
   
        DDRA=0xFF;          // LED段码输出
        PORTC=0xFF;
        DDRC=0x3F;          // LED位控输出
        PORTD=0x40;         // PD6(icp)输入方式,上拉有效

    // T/C2 初始化
    TCCR2=0x0C;         // 内部时钟,64分频(4M/64=62.5KHz),CTC模式
    OCR2=0xf9;//7c;          // OCR2 = 0xf9(249),(249+1)/62.5=4ms
        // T/C1初始化
    TCCR1B = 0x41;      // T/C1正常计数方式,上升沿触发输入捕捉,4M/1计数时钟
        TIMSK = 0xA4;                // 允许T/C2比较匹配中断,允许T/C1输入捕捉、溢出中断

    icp_n = 0;
    max_icp =1;
        #asm("sei")                        // 开放全局中断

        while (1)
        {
          if (icp_ok == 1)    // 完成一次测量
          {
                if (icp_v2 >= icp_v1)          // 计算N个上升沿的时钟脉冲个数,
                    icp_2 = icp_v2 - icp_v1;   
                else
                    icp_2 = 65536 - icp_v1 + icp_v2;
                
                if (!(icp_v2 >= icp_v1 && full_ok)) // 有溢出,数据无效   
            {         
                if (icp_2 == icp_1)         // 两次个数相等,测量有效
                    {
                  fv = 4000000 * (long)max_icp / icp_2;   // 换算成频率值
                  f_2_d = 1;            // 允许新频率送显示
               
                  if (fv > 4000)
                        max_icp = 64;       // 如果频率大于4Khz,N=64
                  else
                        max_icp = 1;      // N=1
               }

machao 发表于 2011-5-30 22:07:27

后面还有啊,你应该全面的看。

接下去的第4行 “icp_1 = icp2”是什么意思?请仔细理解。

guxingganyue 发表于 2011-5-31 12:05:18

回复【4楼】machao
-----------------------------------------------------------------------

谢谢马老师指点,,我再仔细读一遍吧
页: [1]
查看完整版本: 请教马老师:按照你教材上的捕获模式获取频率,关于量程切换方面遇到实际的问题(高频率信