矿石收音机论坛

 找回密码
 加入会员

QQ登录

只需一步,快速开始

搜索
查看: 2549|回复: 7

STC10F的小遗憾

[复制链接]
     
发表于 2020-3-6 22:56:21 | 显示全部楼层 |阅读模式
前些天在用89C52做收发信机的多用途频率计。因为本身计数器工作频率低,所以外接分频器,但这样一来计数精度就成了100Hz了。虽然对收发信机已经足够,但总感到有些美中不足。所以改用比较新的STC10F芯片。
从理论上来说10F是1T的,如果用30MHz的外部时钟,其最高直接计数能力可达15MHz(30000000/2),即使放点余量,到14MHz应该是没有问题的。实际做下来结果也正是如此,在对原先程序稍作修改后(主要是计时由T2改为T0,)在不分频不整形的情况下,最大计数精度确实可达1Hz(在14.5MHz)。但发现了个新问题,即频率计的最后三位(百十个)显示数不断跳动。查了很久,才发现原来是计数器的问题。
与89C52相比,10F系例取消了16位的T2,计时不得不交给T0。但如果开16位模式(TMOD=0x66),则无自动重载,而软件重载需要CPU参与,造成计数不精确。如果用8位模式(TMOD=0x62),则每256个机器周期就要进位,会对精度完全相同的影响。
在万般无奈情况下,我不得不又改回到89C52,不得不再次启用外部分频器,再去忍受那100Hz的精度。

如果10F也能拥有带自动重载的16位定时器该多好呀。
     
发表于 2020-3-6 23:10:21 | 显示全部楼层
用C8051F系列啊,功能多。
回复 支持 反对

使用道具 举报

     
发表于 2020-3-6 23:21:22 | 显示全部楼层
提示: 作者被禁止或删除 内容自动屏蔽
回复 支持 反对

使用道具 举报

     
发表于 2020-3-6 23:51:58 | 显示全部楼层
本帖最后由 iffi123 于 2020-3-6 23:54 编辑

8位单片机真的不够用,至少也要16位吧, 32位最好, float运算(如果有需要)正好4字节

前2天测试了一下st提供的F103 FFT库函数(汇编写的),  试验了1024点变换,还不错,以后又多一个玩法
回复 支持 反对

使用道具 举报

     
发表于 2020-3-7 00:02:24 | 显示全部楼层
精度不是这么算的……首先你的外部晶振往往是标称20ppm的,加上负载电容、分布电容,可能50ppm都难保证
买几十块钱的温补有源晶振,也不过能达到1-2ppm

假设你的算法没有额外误差,测14MHz的误差:14MHz*20ppm=280Hz(还没算温漂)
回复 支持 反对

使用道具 举报

     
发表于 2020-3-7 07:32:29 | 显示全部楼层
总感觉应该可以在软件上动点脑筋解决的
你是统计1秒内脉冲个数,这样分辨率可以达到1hz?
回复 支持 反对

使用道具 举报

     
发表于 2020-3-7 08:15:53 | 显示全部楼层
分频会使步进(分辨率)下降也是正常, 要么时钟频率高点可以弥补
回复 支持 反对

使用道具 举报

     
 楼主| 发表于 2020-3-7 08:24:42 | 显示全部楼层
谢谢各位关注。
因为只是个业余爱好者,所以看中了其2.54间距的封装(可以用洞洞板)。
我说有几百Hz的误差是指1602屏上最后三位频率数不断跳动,每秒一次(因为是每秒更新一次),不是频漂。我曾改成每秒二次或四次,但除了跳动更频繁以外,并无改善。
我也试过关总中断或不关总中断,但结果一样。我也试过把此程序用到89C52上(即用T0计时),结果也相同。这就是为什么我猜想是定时数长度的关系。
但总觉得STC不会如此蠢,应该是自已软件上没做好。
再次谢谢各位。
回复 支持 反对

使用道具 举报

     
 楼主| 发表于 2020-3-7 08:45:02 | 显示全部楼层
iffi123 发表于 2020-3-7 08:15
分频会使步进(分辨率)下降也是正常, 要么时钟频率高点可以弥补

你好。
原来我用12MHz晶振,用100分频(后来改为50分频,因为频率上限不太高)。后来改成18.432,用25分频。再改成30MHz时钟,可用10分频。
我也试过改成6T模式,只需5分频就可以了。但归根结蒂还是省不了外部分频。
另外,不单是频率计,我还在上面集成了功率计,电压表,驻波表等功能(用外部AD),所以速度太快了会有点副作用。
谢谢关注。
回复 支持 反对

使用道具 举报

     
发表于 2020-3-7 21:25:11 来自手机 | 显示全部楼层
记得以往的教材上有软件补偿定时精度的方法,定时误差是因为中断响应延迟的时钟周期数不等所产生的,传统51的中断响应时间为定时器溢出后3到10来个机器周期,具体多少个周期要看当时执行的程序情况。软件补偿的方法就是执行中断服务程序后读取计数器的值,因为计数器在溢出中断后还会继续计数,在中断服务程序中读取这个计数值就知道中断响应被延迟了多少时间,然后计算出新的定时器初值写入,开始下一个定时周期,这样就可达到纯硬件定时的精度。
回复 支持 反对

使用道具 举报

     
发表于 2020-3-7 21:43:46 | 显示全部楼层
另外一种比较好的处理方法就是设计纯硬件的定时和计数,每次定时时间到就把计数值打入三态输出的锁存器,之后在时钟的后半沿清零计数器并产生中断信号,之后单片机可以从容不迫的读取锁存器上的计数值。这些用74系列逻辑电路很容易做到。
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 加入会员

本版积分规则

小黑屋|手机版|矿石收音机 ( 蒙ICP备05000029号-1 )

蒙公网安备 15040402000005号

GMT+8, 2025-4-28 13:20

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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