找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 4988|回复: 28
收起左侧

STC15W408单片机频率计能做到多高频率?

  [复制链接]
ID:72088 发表于 2021-12-22 09:08 | 显示全部楼层 |阅读模式
自己搞维修,经常用到测频率的,也是多年想制作的,这次有时间了,
想用STC15W408AS单片机制作频率计,用外接基频和与非门,单片机只做计数器用
用内部35M频率(不用产生基频,不用担心频率不稳),且不分频,尽量提高计数分辨率,
频率计能做到多高呢?
51hei图片20211222085930.png

回复

使用道具 举报

ID:94031 发表于 2021-12-22 09:58 | 显示全部楼层
如果是学习值得自己制作,搞维修还是买一个划算。
回复

使用道具 举报

ID:401564 发表于 2021-12-22 10:09 | 显示全部楼层
不管是什么维修,搞台二手的示波器,比频率计实用很多
回复

使用道具 举报

ID:624769 发表于 2021-12-22 11:35 | 显示全部楼层
我很疑惑,你不用定时,只计数,如何得出频率??

有现成的CCP不用,非要用外部中断, 那这计频能力不见得比89C52来得高。
回复

使用道具 举报

ID:883242 发表于 2021-12-22 12:05 | 显示全部楼层
频率不够可以外挂预分频器。
回复

使用道具 举报

ID:57657 发表于 2021-12-22 14:16 | 显示全部楼层
用FPGA可以测几百Mhz没有问题
回复

使用道具 举报

ID:401564 发表于 2021-12-22 15:23 | 显示全部楼层
npn 发表于 2021-12-22 14:16
用FPGA可以测几百Mhz没有问题

FPGA在速度上确实要强大很多,关键是:FPGA有多少人会呢?楼主会不会呢?在论坛的这个板块,大多是新手,关于用FPGA来进行设计的建议,基本等于白说
回复

使用道具 举报

ID:155507 发表于 2021-12-22 19:25 | 显示全部楼层
你用16位的计时器,频率计能做到最高可测频率 65,535Hz

回复

使用道具 举报

ID:213173 发表于 2021-12-22 20:55 | 显示全部楼层
给你提供一个思路,理论上能达10M以上,电路能够仿真成功,未经实物验证。
无标题.jpg

  1. //适用于STC15W408AS-20PIN系列
  2. #include <STC15F2K60S2.H>

  3. unsigned char code dispcode[]={//共阳数码管段码"0~f"
  4.                 0xc0,0xf9,0xa4,0xb0,
  5.                 0x99,0x92,0x82,0xf8,
  6.                 0x80,0x90,0x88,0x83,
  7.                 0xc6,0xa1,0x86,0x8e};
  8. unsigned char data temp[6];     //显示缓存
  9. unsigned char T0count;     //T0的计数器值
  10. bit flag,sign;             //标志位
  11. unsigned long num;         //频率值
  12. //初始化定时器0
  13. void Timer0Init()        //@24.000MHz
  14. {
  15.         TMOD= 0x05;                //设置外部计数模式
  16.         TL0 = 0x00;                //设置定时初始值
  17.         TH0 = 0x00;                //设置定时初始值
  18.         TF0 = 0;                //清除TF0标志
  19.         TR0 = 1;                //定时器0开始计时
  20.         EA  = 1;                //开总中断
  21.         ET0 = 1;                //开T0中断
  22. }
  23. //初始化定时器2,没有定时器1
  24. void Timer2Init()        //2毫秒@24.000MHz
  25. {
  26.         AUXR |= 0x04;        //定时器时钟1T模式
  27.         T2L = 0x80;                //设置定时初始值
  28.         T2H = 0x44;                //设置定时初始值
  29.         AUXR |= 0x10;        //定时器2开始计时
  30.         IE2 |=0x04;    //开T2中断
  31. }
  32. //主函数
  33. void main(void)
  34. {  
  35.         unsigned char i;
  36.         P1M1 = 0x00;                                         //设置P1准双向
  37.         P1M0 = 0x00;                                         //设置P1准双向
  38.         P3M1 = 0x00;                                         //设置P3.4准双向 其余IO口推挽
  39.         P3M0 = 0x10;                                         //设置P3.4准双向 其余IO口推挽
  40.         P5M1 = 0x00;                                         //设置P5准双向
  41.         P5M0 = 0x00;                                         //设置P5准双向
  42.         Timer0Init();
  43.         Timer2Init();
  44.         sign=1;
  45.         while(1)
  46.         {
  47.                 if(flag==1)
  48.                 {
  49.                         flag=0;
  50.                         num=((unsigned long)T0count<<16)|(TH0<<8|TL0);
  51.                         for(i=6;i>0;i--)
  52.                         {
  53.                                 temp[i-1]=num%10;//由低位到高位保存
  54.                                 num/=10;
  55.                         }
  56.                         TH0=0x00;
  57.                         TL0=0x00;
  58.                         T0count=0;
  59.                         TR0=1;        //定时器0开始计数
  60.                         sign=1;        //定时器2开始计时
  61.                 }
  62.         }
  63. }
  64. //定时器T0中断服务子函数
  65. void t0(void) interrupt 1
  66. {
  67.         T0count++;
  68. }
  69. //定时器T2中断服务子函数  
  70. void t2(void) interrupt 12
  71. {
  72.         static unsigned char i;   //显示计数器值
  73.         static unsigned int count;   //计时计数器值
  74.         TL1 = 0x60;                //设置定时初始值
  75.         TH1 = 0xF0;                //设置定时初始值
  76.         if(sign)
  77.         {
  78.                 if(++count>=500)             //秒定时
  79.                 {
  80.                         TR0=0;
  81.                         count=0;
  82.                         sign=0;                                                       
  83.                         flag=1;
  84.                 }
  85.         }
  86.         P3&=0x10;                              //消隐
  87.         if(i==2)P1=dispcode[temp[i]]&0x7f;//加小数点表示KHz
  88.         else P1=P1=dispcode[temp[i]];                 //段码
  89.         switch(i)                                                            //位码
  90.         {
  91.                 case 0: P3|=0x01; break;
  92.                 case 1: P3|=0x02; break;
  93.                 case 2: P3|=0x04; break;
  94.                 case 3: P3|=0x08; break;
  95.                 case 4: P3|=0x20; break;
  96.                 case 5: P3|=0x40; break;
  97.         }               
  98.         i=++i%6;
  99. }
复制代码






回复

使用道具 举报

ID:883698 发表于 2021-12-22 22:31 | 显示全部楼层
用普通的89C52RC,晶振11.0592,做过能测出15M左右的频率
回复

使用道具 举报

ID:72088 发表于 2021-12-23 12:36 | 显示全部楼层
188610329 发表于 2021-12-22 11:35
我很疑惑,你不用定时,只计数,如何得出频率??

有现成的CCP不用,非要用外部中断, 那这计频能力不见 ...

我准备用恒温晶振10M,分频到0.5HZ,比单片机定时器准确很高。用35M主频,理论分辨率能做到17M,
又需要用多时间闸门,比如1HZ闸门,100ms闸门,10ms闸门,前级准备用MB506,测到2.4G频率
回复

使用道具 举报

ID:72088 发表于 2021-12-23 12:37 | 显示全部楼层
Y_G_G 发表于 2021-12-22 10:09
不管是什么维修,搞台二手的示波器,比频率计实用很多

准备前级用BM506做到2.4G频率一下测量
回复

使用道具 举报

ID:72088 发表于 2021-12-23 12:39 | 显示全部楼层
angmall 发表于 2021-12-22 19:25
你用16位的计时器,频率计能做到最高可测频率 65,535Hz

溢出进位啊,溢出一次加1,可以做到3字节,理论256*256*256
回复

使用道具 举报

ID:955673 发表于 2021-12-23 17:57 | 显示全部楼层
STC15 IO速度 12.几,STC8 系列强推拉模式 28 左右,要不要留点余量
回复

使用道具 举报

ID:401564 发表于 2021-12-23 18:23 | 显示全部楼层
新乡家电维修 发表于 2021-12-23 12:37
准备前级用BM506做到2.4G频率一下测量

好像感觉还不错的样子,但好像有点不对
你做好一个频率计.那不是得找个仪器来校正,如果有校正的仪器,我要频率计干嘛
如果做好不校正,你怎么知道准不准
我也做过几年的产线编修,示波器就用得多,频率计基本用不到
回复

使用道具 举报

ID:994053 发表于 2021-12-24 13:59 | 显示全部楼层
找个示波器看一看
回复

使用道具 举报

ID:72088 发表于 2022-2-10 17:57 | 显示全部楼层
188610329 发表于 2021-12-22 11:35
我很疑惑,你不用定时,只计数,如何得出频率??

有现成的CCP不用,非要用外部中断, 那这计频能力不见 ...

0.5HZ基准
回复

使用道具 举报

ID:879809 发表于 2022-2-10 23:43 | 显示全部楼层
这个问题的答案取决于预分频器最高工作频率。
回复

使用道具 举报

ID:884042 发表于 2022-7-25 00:40 | 显示全部楼层
我做过一个袖珍的频率计,只有巴掌大,因此功能也很少,我是直接用单片机连接倍频分频电路的,完事后面在用定时器几时。只能测100khz左右,精确度还不高,后来就丢在角落吃灰了。
回复

使用道具 举报

ID:879348 发表于 2022-7-25 08:26 | 显示全部楼层
使用定时器门控测量。可以达到非常高的频率
回复

使用道具 举报

ID:883242 发表于 2022-7-25 19:54 | 显示全部楼层
npn 发表于 2021-12-22 14:16
用FPGA可以测几百Mhz没有问题

最高能测到多高的频率不需要FPGA来解决。某一个宝上面一百出头的8位计数值频率计就是用普通单片机,加个MB506预分频器轻松做到2.4GHz最大频率。

频率计中,用FPGA做主控,比单片机优秀之处在于解决门控时间和分辨率的矛盾关系。比如单片机要100s门控时间填满8位数字,用FPGA可能1s就能完成。单纯的用FPGA,想做到单片机频率计2.4GHz的最高频率那是绝对不可能的。

你还是了解一下频率计的原理,或者自己思考下做频率计需要用什么方法来解决,再来发言为好。
回复

使用道具 举报

ID:688692 发表于 2022-7-26 09:18 | 显示全部楼层
小猫电子 发表于 2021-12-22 22:31
用普通的89C52RC,晶振11.0592,做过能测出15M左右的频率

仅靠单片机本身能做到?
回复

使用道具 举报

ID:151348 发表于 2022-7-26 16:18 | 显示全部楼层
单靠单片机自身的话最高测到几百K吧,12M晶振,12T模式还要12分频,那实际频率为1M,处理一条语句要一个机器周期,所以1M的频率还要缩水。即便是1T模式貌似也不会提高多少
回复

使用道具 举报

ID:1042872 发表于 2022-8-25 08:37 | 显示全部楼层
用分频可以20m
回复

使用道具 举报

ID:491577 发表于 2022-8-25 09:59 | 显示全部楼层
35M/4=8.75M以下精度还是有保证的,8.75——17M就算能够测量误差也很大,2.4G就不要想了,直接购买成品比较好。
回复

使用道具 举报

ID:1034262 发表于 2022-8-25 16:26 | 显示全部楼层
STC15W408单片机频率计,最高计数为主频的一半,比如我常用32.768MHz做主频,则最高计数频率为16MHz。
回复

使用道具 举报

ID:78901 发表于 2022-9-16 23:09 | 显示全部楼层
FPGA在速度上确实要强大很多,关键是:FPGA有多少人会呢?楼主会不会呢?在论坛的这个板块,大多是新手,关于用FPGA来进行设计的建议,基本等于白说,我用89C52加8154无需分频就做到可以测量100MHz的频率,还是等精度测量http://www.51hei.com/bbs/dpj-181928-1.html
回复

使用道具 举报

ID:1034262 发表于 2022-9-17 21:07 | 显示全部楼层
STC15W408AS用定时器0能测量的频率是主频的一半,我的方法是用一个精确的1秒高电平来做门控,10ms低电平来处理,则可以测量很高精度的频率,比如我用32MHz做主频,直接测频最高16MHz,可以用过NB506分频则可以测2.4GHz。秒信号使用恒温晶振和GPS校准(驯服时钟)。
回复

使用道具 举报

ID:78901 发表于 2022-9-17 22:34 | 显示全部楼层
业余条件我是用GPS秒信号来校准频率计
回复

使用道具 举报

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

本版积分规则

小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

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