标题:
STC12C5A60S2 定时器可调频率
[打印本页]
作者:
qiang275129042
时间:
2017-2-8 13:07
标题:
STC12C5A60S2 定时器可调频率
void timer0_int()interrupt 1 using 0
{
TH0 = (65536-1000)/256;//1ms产生一次中断
TL0 = (65536-1000)%256;
counter++;
if(tm==counter)
{
P1=0xff;
for(p=0;p<150;p++);
TF0=0;
P1=0x00;
counter=0;
}
这个是定时器0的中断程序!现在要求频率可调变化为1.00HZ到100.00HZ
现在初始值为1MS产生一次中断!
如果:TM等于1对应频率为1000,
TM等于1000对应频率等于1
如何将tm变量经过换算成频率?
求换算公式! 这个是51单片机!
作者:
utzuzu
时间:
2017-2-8 16:29
计数器工作在16位计数模式,计数初始值=65535-Fx/(f*2)。 Fx为计时器频率(51是晶振频率除以12),f是你要的频率范围(1-100),f频率越高精度越低,非线性的。每次进中断,只要把IO口反置一下即可在这个IO口上得到f频率的方波。
作者:
utzuzu
时间:
2017-2-8 16:46
你这个1ms的刻度太粗了,在单片机上不能这样做,举一个最简单的例子:如果想要是100Hz,那么TM=1000/100=10;这个没问题;如果频率是99hz呢?TM=1000/99=10.1 这个10.1次在单片机里是很难算出来的,最后约等于10,输出还是100Hz,99是出不来的。。 反过来算,TM=10时输出100Hz,当TM=11时(最小刻度),输出频率是1000/11=90.9Hz。也就是说100Hz的下一个跨度是90.9Hz,90.9到100之间的频率是调不出来的。 归根到底,就是精度不够。
作者:
qiang275129042
时间:
2017-2-8 18:07
能说一说具体的公式吗?
感谢上面的回复!具体怎么搞?
作者:
qiang275129042
时间:
2017-2-9 15:07
求助!那个大侠给个方法???
作者:
utzuzu
时间:
2017-2-10 08:24
建议直接计数器计时输出方波: 就是在定时器中断里面,计数值=65535-Fx/(f*2), IO口输出非一下(反一下)。在主程序里面设置你的f就可以啦。不需要很复杂的,几行代码就够了。
计数器工作在16位计数模式,计数初始值=65535-Fx/(f*2)。 Fx为计时器频率(51是晶振频率除以12),f是你要的频率范围(1-100),f频率越高精度越低,非线性的。每次进中断,只要把IO口反置一下即可在这个IO口上得到f频率的方波。
欢迎光临 (http://www.51hei.com/bbs/)
Powered by Discuz! X3.1