‘壹’ 我用单片机产生一个50赫兹的信号但是用逻辑分析仪测显示是48赫兹,这个属于正常误差吗
50Hz频率误差应该没那么大才对的,检查一下是不是程序上面有不完善的地方。有没有其他程序过多占用单片机性能,或者一些中断设置的是不是不太好之类的
‘贰’ 单片机能产生最大频率方波是多少
我用STC11F02E-SOP20做的模拟DDS的波形发生器(正弦或方波),跑32.768MHZ,正弦表采样速度为1310720HZ,输出波形步进为1HZ,最高输出300KHZ。
‘叁’ 使用单片机芯片内部时钟发觉很不准用万用表测量其频率在32k到34k跳变 正常吗
出现这个问题,主要的毛病在晶振上,而不是单片机上,几乎所有的晶振,都有一定的硬误差和软误差,硬误差,是指有固定数值的误差,比如说,都比标的快-0.5K---+1KHz,通常是比标注的高。
软误差,是与晶振的标频率有关,说白了,就是有一定的百分比误差,比如有正负0.5%的误差。
软误差和硬误差,都主要是与温度有关系。
从上面我们就可以看出来,由于硬误差的存在,使得频率越低的晶振,误差就越大,同样是晶振,12M的,几乎可以忽略硬误差的影响,而32.768K的则不可以。
所以,对于低频率的晶振,通常是业界比较头疼的,因为不是很好控制其稳定性,所以,对于一般要求不严格的,都只买普通的晶振,对于要求稍微严格的,都买精度高一些的晶振。而军工产品,则通常用的是有源时钟,这钟低频的有源时钟,可以通过高频的晶振分频而得到,这样,就可以忽略掉硬误差的影响。
比如说,要得到32.768K的时钟,可以把32.768M的晶振进行1000分频,这样,即使原晶振的硬误差为1KHz,被分频后,也成了1Hz.
综上所述,你需要做的是换晶振,要么,你换10PPM的无源晶振,用NPO或者X5R的负载电容,要么,你换成有源的时钟来驱动。
‘肆’ 基于51单片机的频率测量及测量误差
可以用对单位时间内 脉冲个计数的方法来实现,用2个 定时/计数器 ,一个作为定时器,定时50 ms,累积10次或20次,即0.5S或1S
另外一个作为计数器,对外部脉冲计数
误差与晶振频率准确度有关,测量与时间有关的量,你本身的时间当然要准确。如果所测信号频率高,可以测0.2s或0.5S内的脉冲数,可以防止溢出,如果频率低,可以测1S或2S内的脉冲数,以减小误差,但响应速度慢一些。
程序比较简单,以下供参考
void init()//初始化设置
{
TMOD=0x15;//定时器0作为计数器,定时器1作为定时器用
TH0=0;//计数器清0
TL0=0;
EA=1;//开总中断
ET1=1;//允许定时器1中断
TH1=(65536-50000)/256;
TL1=(65536-50000)%256;
TR0=1;//启动计数器
TR1=1;//启动定时器
aa=0;
}
void main()//主程序
{
init();//初始化
while(1)//循环程序
{
dd=bb*256+cc;//0.5S的计数值
ee=2*dd;//换算为1秒钟的计数值
if(aa==1)
{
if(TH0>12)//预判断,50ms内TH0>12,1s内计数值将超过可计数的最大值65535
fm=1;//报警
}
display4(ee);//显示
fm=0;//报警停止
}
}
void timer1()interrupt 3//注意:定时器1的中断序号为3
{
aa++;
TH1=(65536-50000)/256;
TL1=(65536-50000)%256;
if(aa==10)//中断10次,共0.5S
{
TR0=0;//暂停计数
aa=0;
bb=TH0;//读出计数器数据
cc=TL0;
TL0=0;//计数器清0
TH0=0;
TR0=1;//重新启动计数器
}
}
‘伍’ 设MCS-51单片机的晶振频率为12MHZ,试编写10ms的延时程序(要求误差不超过0.003ms)。
C语言程序:
#include
void main (void)
{
TMOD = 0x10;
TH1 = (-50000>>8);
TL1 = -50000;
TCON = 0x40;
IE = 0x88;
while(1);
}
void T1_int (void) interrupt 3
{
TH1 = (-50000>>8);
TL1 = -50000;
}
汇编程序如下:
ORG 0000H
AJMP MAIN
ORG 001BH
AJMP T1INT
ORG 0100H
MAIN:
MOV TMOD, #10H
MOV TH1, #HIGH(-50000)
MOV TL1, #LOW(-50000)
MOV TCON, #40H
MOV IE, #88H
AJMP $
T1INT:
PUSH ACC
MOV TH1, #HIGH(-50000)
MOV TL1, #LOW(-50000)
POP ACC
RETI
Keil C51程序设计中几种精确延时方法
延时通常有两种方法:一种是硬件延时,要用到定时器/计数器,这种方法可以提高CPU的工作效率,也能做到精确延时;另一种是软件延时,这种方法主要采用循环体进行。
使用定时器/计数器实现精确延时
单片机系统一般常选用11.059 2 MHz、12 MHz或6 MHz晶振。第一种更容易产生各种标准的波特率,后两种的一个机器周期分别为1 μs和2 μs,便于精确延时。
本程序中假设使用频率为12 MHz的晶振。最长的延时时间可达216=65 536 μs。若定时器工作在方式2,则可实现极短时间的精确延时;如使用其他定时方式,则要考虑重装定时初值的时间(重装定时器初值占用2个机器周期)。
在实际应用中,定时常采用中断方式,如进行适当的循环可实现几秒甚至更长时间的延时。使用定时器/计数器延时从程序的执行效率和稳定性两方面考虑都是最佳的方案。但应该注意,C51编写的中断服务程序编译后会自动加上PUSH ACC、PUSH PSW、POP PSW和POP ACC语句。
执行时占用了4个机器周期;如程序中还有计数值加1语句,则又会占用1个机器周期。这些语句所消耗的时间在计算定时初值时要考虑进去,从初值中减去以达到最小误差的目的。
‘陆’ 用51单片机做频率计测量范围1到1Mhz 误差不超过1hz 这个怎么控制误差啊
肯定达不到!我做过500HZ的高精度时钟!用在特种产品上的!这个误差主要出现在晶振上!其实晶振是最大的误差源!我们采用的是恒温晶振,不知道你有什么更好的方法没有!恒温晶振很贵,我也在找一个更便宜的方法,现在,我的产品的误差是ns级,远远小于1hz.
楼下的:你这点怎么算的,没有搞明白.你这样算我的精度是1Khz级别的!这样看我500HZ的频率精度在K级,要是出现误差是不是容易变成1500HZ,...是不是这么理解,小弟不才,请赐教
那么是周期的1 ns/ 1 us = 1/1000. 所以你的频率精度是 1M / 1000 = 1000 Hz.
3楼正解,采用输入信号为外部时钟计数器,51单片机太慢,可以考虑换个其他单片机,比如DSPIC33F,30F等单片机.
‘柒’ at89c52单片机的时钟频率是多少
时钟频率和晶振的频率相同。
单片机datasheet写的0-24MHz。
如果仿真选12MHz,这是理想状态时钟。一个机器周期等于12个时钟周期,就是1uS。但是实际应用中选择11.0592MHz,因为
其一:因为它能够准确地划分成时钟频率,与UART(通用异步接收器/发送器)量常见的波特率相关。特别是较高的波特率(19600,19200),不管多么古怪的值,这些晶振都是准确,常被使用的。
其二:用11.0592晶振的原因是51单片机的定时器导致的。用51单片机的定时器做波特率发生器时,如果用11.0592Mhz的晶振,根据公式算下来需要定时器设置的值都是整数;
如果用12Mhz晶振,则波特率都是有偏差的,比如9600,用定时器取0XFD,实际波特率10000,一般波特率偏差在4%左右都是可以的,所以也还能用STC90C516 晶振12M 波特率9600 ,倍数时误差率6.99%,不倍数时误差率8.51%,数据肯定会出错。
这也就是串口通信时大家喜欢用11.0592MHz晶振的原因,在波特率倍速时,最高可达到57600,误差率0.00%。 用12MHz,最高也就4800,而且有0.16%误差率,但在允许范围,所以没多大影响。
另外不建议使用内部时钟,单片机内部时钟都是有误差的。
‘捌’ 单片机到底能检测到多大的频率,检测误差是否是随频率增大而变大
12m晶振的单片机的周期是2微秒,1个指令要2个周期左右,不同指令不一样,加上指令间的时间和硬件误差什么的,当10微秒来说。频率就是1/10微秒 赫兹 自己算 频率越高 误差越大
‘玖’ 数显频率计的误差范围是多大
用单片机制作的数显频率计,测试频率直接加到单片的计数引脚。误差很小,万分之一。如测试频率经分频后到单片的计数引脚,如经100分频,误差+ - 100HZ
‘拾’ 单片机频率精度计算
精确到50KHZ到0.001Hz用12M晶振足够了.
12M晶振在C51系列单片机中的机器周期是1us,机器执行指令的时间也就几us,在测量时考虑的是频率上限50KHZ即20us周期,用测单位时间里脉冲个数的方法可行,测频率下限时用测周期的方法可行.自己写程序时设计一个转换点就行了,能达到较高的精度.所以用12M晶振绝对能达到你的要求.
不过你的0.001HZ是1000秒的周期,这个数字转换用来测量人都要等老了(16分钟多).要求的频率其实也用不了那么低的.