51单片机定时器2的最短定时时间怎么有限制?
晶振是12MHZ的,12分频,按道理计数器应该是每1微秒自加一次,那么理论上最小定时时长也应该是1微秒,考虑中断等等CPU干别的事要花些时间,我想那么定时定个20微秒也应...
晶振是12MHZ的,12分频,按道理计数器应该是每1微秒自加一次,那么理论上最小定时时长也应该是1微秒,考虑中断等等CPU干别的事要花些时间,我想那么定时定个20微秒也应该不是问题吧。
我写了程序发现定时时长在250微秒(65536UL-250)以上,烧到板子上观察都是准的(我的观察方法是:定时每250微秒中断,中断4000次的时候数码管加一,看数码管是不是每隔一秒加一,结果的确是的)。
但是再想把定时时长改短,不管怎么改短(比如65536UL-200)时长都不会再变短,这不科学啊!
如果中断频率最高只能到4KHz(即最短定时时长只能在250微秒),那么这个性能是没法达到我的要求的,我要用它产生方波信号,驱动开关电源的。急求各位大侠解决方案!
uint Reload_16;
uchar Reload_08H, Reload_08L;
T2CON = 0x04; //start timer2 as a 16 bit timer and reload automaticly
Reload_16 = 65536UL - 250; //就是这个地方,大于250都是准的,改小就不准了!
Reload_08H = Reload_16 /256;
Reload_08L = Reload_16 %256;
TH2 = Reload_08H;
RCAP2H = Reload_08H;
TL2 = Reload_08L;
RCAP2L = Reload_08L;
ET2 = 1; // activate timer2 interrupt
TR2 = 1; // activate timer2
EA = 1;
单片机是STC90C516RD+ 展开
我写了程序发现定时时长在250微秒(65536UL-250)以上,烧到板子上观察都是准的(我的观察方法是:定时每250微秒中断,中断4000次的时候数码管加一,看数码管是不是每隔一秒加一,结果的确是的)。
但是再想把定时时长改短,不管怎么改短(比如65536UL-200)时长都不会再变短,这不科学啊!
如果中断频率最高只能到4KHz(即最短定时时长只能在250微秒),那么这个性能是没法达到我的要求的,我要用它产生方波信号,驱动开关电源的。急求各位大侠解决方案!
uint Reload_16;
uchar Reload_08H, Reload_08L;
T2CON = 0x04; //start timer2 as a 16 bit timer and reload automaticly
Reload_16 = 65536UL - 250; //就是这个地方,大于250都是准的,改小就不准了!
Reload_08H = Reload_16 /256;
Reload_08L = Reload_16 %256;
TH2 = Reload_08H;
RCAP2H = Reload_08H;
TL2 = Reload_08L;
RCAP2L = Reload_08L;
ET2 = 1; // activate timer2 interrupt
TR2 = 1; // activate timer2
EA = 1;
单片机是STC90C516RD+ 展开
5个回答
展开全部
51单片机定时器,晶振是12MHZ、12分频,理论上最短定时时间1微秒,
但是,CPU 运行指令 需要时间,只要中断服务程序 的运行时间 不超过定时器 定时时间,
并且 有些余量,则就不成问题,如果没有余量,则中断结束 又进入 中断,
如果 超过定时器 定时时间,则来不及 处理 定时也就不准确了。
用 C 语言编程,有可能 定时时间 过短 会有问题,有不好 计算中断用去多少时间。
如果用 汇编语言 编程,晶振是12MHZ、12分频,只是产生一个方波信号,30KHz 频率没有问题。
当然你要检测 准确性 加入计数程序后 会占用时间,
一般编程时, 在中断 服务程序中 尽量少占用时间,能不在中断服务程序中处理的 事尽量 不在
中断服务程序中 处理。
但是,CPU 运行指令 需要时间,只要中断服务程序 的运行时间 不超过定时器 定时时间,
并且 有些余量,则就不成问题,如果没有余量,则中断结束 又进入 中断,
如果 超过定时器 定时时间,则来不及 处理 定时也就不准确了。
用 C 语言编程,有可能 定时时间 过短 会有问题,有不好 计算中断用去多少时间。
如果用 汇编语言 编程,晶振是12MHZ、12分频,只是产生一个方波信号,30KHz 频率没有问题。
当然你要检测 准确性 加入计数程序后 会占用时间,
一般编程时, 在中断 服务程序中 尽量少占用时间,能不在中断服务程序中处理的 事尽量 不在
中断服务程序中 处理。
追问
单纯的数码管动态显示又没有software delay.还没干正事呢,只是用数码管检测一下定时器就出问题了
追答
其实 数码管动态显示,也可以用定时器 来完成,如 8 个 数码管,定时 2 - 2.5 mS,
每次定时器中断 扫描显示 一 位数码管,8 次中断 16 - 20 mS 完成 8 个数码管的显示。
展开全部
1微秒是每条汇编指令需要的时间,定时器中断涉及到了压栈寻址出栈等操作,天知道用了多少条汇编指令,你定个20微妙当然有问题,程序还有别的事情干,比如数码管显示(这玩意儿也很耗时),不能光响应你的中断去了。。。
如果用中断还想有一定的精度的话一般单片机的话10~20k就到顶了。
不过如果你只是想输出高频方波信号的话,我建议你不要用定时器,直接在主程序里面加循环,除去必须的代码后,根据需要的频率增加不同数量的_nop_指令,这个应该能达到更高的频率。
如果用中断还想有一定的精度的话一般单片机的话10~20k就到顶了。
不过如果你只是想输出高频方波信号的话,我建议你不要用定时器,直接在主程序里面加循环,除去必须的代码后,根据需要的频率增加不同数量的_nop_指令,这个应该能达到更高的频率。
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
应该是你的中断服务程序有问题,占用时间可能太多,超过定时时间了,因此可能造成不准的情况,贴上你的定时中断程序看看,还有最好在定时程序里赋值时先作如下处理:
TR2=0;
赋值
TR2=1;
TR2=0;
赋值
TR2=1;
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
如果你要提高定时精度,你可以增加晶振频率如:24MHZ,是不是能够解决你的问题
追问
如何提高?百度过,没谁说的清楚,买个快的?
追答
增加晶振频率如:24MHZ,买个快的
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
这个单片机不是传统的51单片机,时钟比传统51的时钟要快12倍,仔细看芯片资料...
追问
要是快的话,定时时长应该可以更短
追答
你说的对
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询