怎样才能在20ms的时间内精确测量出的计算出一个大约100khz信号的频率,允许误差大概在5hz以内

2019-07-21 00:27发布

我尝试了使用输入捕获,PWM输入模式,和外部时钟 1模式,其中发外部时钟1 的准确度最高,但是也有1赫兹的误差,不知道是我的算法问题还是 本来就有这种问题,而且当我缩短测量时间至20ms时,误差就会被放大至约20HZ,我想问一下,还有什么比较好的方法没有,或者是能不能对我说的三个方法优化一下使达到要求?   



友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
9条回答
edmund1234
1楼-- · 2019-07-21 04:21
本帖最后由 edmund1234 于 2019-6-1 17:23 编辑

如果说你用的是一般输捕捉的方法, 从数学上就不可能的事, 20ms最大误差值是50Hz
weiweiheihei
2楼-- · 2019-07-21 07:07
edmund1234 发表于 2019-6-1 17:21
如果说你用的是一般输捕捉的方法, 从数学上就不可能的事, 20ms最大误差值是50Hz

用外部时钟计数的方法也不可以吗?
edmund1234
3楼-- · 2019-07-21 12:50
假定你测量脉冲的时间为T, 问题是这个T的开始及结束, 是没办法保证它跟被测的信号同步的, 就算你搞一大堆事情, 弄到开始可以同步, 但结束是没有办法的

比如T你设定在20ms, 从t=0时开始输入时钟, 但t=0的时候被测量信跟就一定在上升沿或下降沿吗?这就是不同步, 其实这都可以解决
没法解决的是结束的时候, 长如在20ms内应该有2000个数, 那2000.99个的时候你还是只能测到2000个, 是不?
所以最大误差就是一个计数, 你把它反推就能算出来20ms测量时最大误差是50Hz。
明白?
edmund1234
4楼-- · 2019-07-21 13:44
本帖最后由 edmund1234 于 2019-6-1 20:21 编辑

那是不是没有办法做到呢, 不是的, 只不过用输入时钟的方法基本上是办不到

用外部中断做

void 外部中断函数(void){
    static u8 Mode=0;
    static u16 Count=0;

    //------ 判断中断标志位, 及清除中断标志位, 自已加上去

    if(!Mode){
           TIMx->CR1 |= TIM_CR1_CEN;
           Mode=1;
    }
    else {
           Count++;
           if (TIMx->CNT > t_20ms){
              TIMx->CR1 &= ~(u32)TIM_CR1_CEN;
                                                                    <<--------------- 答案在此时此处 频率= Count/(TIMx->CNT)
              Mode=Count=0;                            <<--------------- 继续下一个20ms
           }
       }
   }

}
nashui_sx
5楼-- · 2019-07-21 16:18
 精彩回答 2  元偷偷看……
edmund1234
6楼-- · 2019-07-21 20:40
本帖最后由 edmund1234 于 2019-6-2 18:42 编辑
nashui_sx 发表于 2019-6-2 12:15
你还没解决呀,给你试了下   输入捕获20ms,外部计数+定时器20ms  测量10us的pwm 计数都是2000,最大1个脉 ...

谁让你把20ms固定了? 这个方法就要要微调这20ms, 所以要除以TIMx_CNT的内容
不知道你是怎样试的, 这个方法的误差就只在中断响应时间, 及系统时钟晶振的误差, 不存在什么误差

一周热门 更多>