OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 2495|回复: 5

如何提升迷你f1做的频率计精度

[复制链接]

1

主题

2

帖子

0

精华

新手入门

积分
9
金钱
9
注册时间
2016-12-9
在线时间
2 小时
发表于 2016-12-11 15:20:19 | 显示全部楼层 |阅读模式
8金钱
我用迷你f1做了个频率计,要求是能测任何波形,
0.1-3v,
能测1-1Mhz,
但是实际只能测到165-1Mhz,如何才能改进精度测到1-165hz?
程序:
#include "delay.h"
#include "sys.h"
#include "usart.h"
#include "timer.h"
#include "lcd.h"

extern u32        TIM2CH1_CAPTURE_VAL;//êäèë2¶»ñÖμ
extern u32  a,b;       
extern u32 OverValve;
extern u16 period;
extern u16 duty;
extern u8 CollectFlag ;
int main(void)
{

        uart_init(9600);
        delay_init();       
        LCD_Init();

        TIM5_PWMINPUT_INIT(0xffff,72-1);   //pwmêäèë3õê¼»ˉòÔ1MμÄÆμÂê2¶×½         
        TIM3_Int_Init(9999,7199);//10KhzμļÆêyÆμÂ꣬¼Æêyμ½5000Îa500ms  
        TIM2_Cap_Init();
        NVIC_Configuration();          //éèÖÃNVICÖD¶Ï·Ö×é2:2λÇàÕ¼óÅÏè¼¶£¬2λÏìó|óÅÏè¼¶
                POINT_COLOR=BLUE;//éèÖÃ×ÖìåÎaà¶é«
        LCD_ShowString(10,60,200,24,24,"Frequency  Unit ");             
//        LCD_ShowString(35,90,200,24,24," to practice");
                POINT_COLOR=RED;
           while(1)
        {
                delay_ms(10);
//                 if(!CollectFlag)
//                {

////                LCD_ShowString(10,180,200,24,24,"Duty cycle:");
////                 LCD_ShowxNum(140,180,(period+1)*100/(duty+1),5,24,0);//ÏÔê¾Õ¼¿Õ±è
//               
////            LCD_ShowString(10,240,200,24,24,"Period:");
////                 LCD_ShowxNum(140,240,(duty)+1,5,24,0);//ÏÔê¾ÖüÆú
//                CollectFlag = 1;
//                }       
                               
       if(a<1000)
                {
                        LCD_ShowxNum(10,150,a,10,24,0);
                        LCD_ShowString(130,150,200,24,24,"   HZ");
                }
           else if(a>1000)
                {
                        LCD_ShowxNum(10,150,a,10,24,0);//
                        LCD_ShowString(130,150,200,24,24,"   HZ");
                }
        }         
}         

正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165524
金钱
165524
注册时间
2010-12-1
在线时间
2116 小时
发表于 2016-12-12 21:00:42 | 显示全部楼层
用外部脉冲计数模式,可以提高精度
回复

使用道具 举报

1

主题

2

帖子

0

精华

新手入门

积分
9
金钱
9
注册时间
2016-12-9
在线时间
2 小时
 楼主| 发表于 2016-12-18 00:07:03 来自手机 | 显示全部楼层
我试试^_^
回复

使用道具 举报

6

主题

33

帖子

0

精华

初级会员

Rank: 2

积分
162
金钱
162
注册时间
2015-12-12
在线时间
20 小时
发表于 2016-12-18 10:57:14 | 显示全部楼层
输入信号0.1到3V就需要提前做预处理了,可以把信号转换成3.3V的方波信号再经过单片机处理即可。其实传统的测频率基本就是两种方法,测周期时间和测脉冲个数,这两种方法都打不到等精度的测量要求。比如测量周期时间的时候,待测信号如果是高频信号就非常难处理,单片机如果能分辨最小1us的信号,那么你无法测量出500k~1M之间的信号频率,任何这两个频率之间的信号你只可能得到一个在500k、1M之间跳跃的值。而用测量脉冲个数的方法其实也不靠谱,测量低频的时候如果你的测量时间为1s那么对于1Hz~2Hz的信号单片机记录的脉冲个数很可能只有1个甚至0个,对于1.5Hz的信号一点办法也没有。

你的程序没有贴中断处理的内容,所以不知道楼主是用什么方式实现的
use IEEE.STD_LOGIC_1164.ALL;
回复

使用道具 举报

6

主题

33

帖子

0

精华

初级会员

Rank: 2

积分
162
金钱
162
注册时间
2015-12-12
在线时间
20 小时
发表于 2016-12-18 11:04:22 | 显示全部楼层
当然还是有办法实现等精度的测量,去年电赛的时候我们用FPGA做的测量,但是学校好几台高频信号源都学渣们给烧坏了,剩下的老师不让用了所以我们没测太高的频率,最高的时候是45MHz能达到精度10^-5。基于相同原理单片机用定时器是可以实现的,但是测不了太高的频率,精度可能也会差一点。
use IEEE.STD_LOGIC_1164.ALL;
回复

使用道具 举报

6

主题

33

帖子

0

精华

初级会员

Rank: 2

积分
162
金钱
162
注册时间
2015-12-12
在线时间
20 小时
发表于 2016-12-18 11:12:54 | 显示全部楼层
首先,一个基准的高频时钟,比如说10MHz吧,可以用定时器生成,另外一个测量闸门时间,这个取决于你要求的最低频率,比如你最低频率0.9Hz,那闸门时间就可以是1.1s,这个闸门时间不需要太准,但是高频基准时钟必须准,同时时钟的频率也是测量到的最高频率。
在闸门时间内两个计数器同时记录待测频率信号的时钟脉冲个数Na和高频时钟的脉冲个数Nb,待测信号的频率用Fa表示,参考时钟的频率用Fb表示(也就是10M),那么Fa = Fb / Nb * Na;这种方法无论是在低频或者高频的情况下都好使,因为最少有一种信号(低频闸门时间,高频参考时钟)能保证测量到的信号有效。
use IEEE.STD_LOGIC_1164.ALL;
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-5-26 05:51

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

快速回复 返回顶部 返回列表