首先,本文以mircochip公司的dspic33f系列介绍定时器的计算方法。
该定时不同于其他单片机的定时算法,但是思想差不多,都是定时器先加载初始计数值,然后进行计数,最后定时器产生中断,然后重新加载初值,进行计数,这样反复进行就是定时器的工作原理。下面附一段代码以便于理解:
//采用内部时钟作为定时器时钟
void timer2()
{
//Timer 2 中断设置
IFS0bits.T2IF = 0; // Clear Timer1 Interrupt Flag
IEC0bits.T2IE = 1; // Enable Timer1 interrupt
IPC1bits.T2IP = 2; // Set Timer 2 Interrupt Priority Level 此程序可以不设定定时器2优先级,默认为自然优先级
//TMR2设置,延时400ms
TMR2 = 0;// Resetting TIMER
T2CONbits.TGATE = 0; //disable gated timer mode
T2CON = 0x0000; // reset timer configuration
PR2 = 624999; //load the period value
T2CONbits.TCS = 0; //内部时钟
T2CONbits.TCKPS = 3; //分频比选择为1:256(此处需要查看相应的数据手册,在文章后面贴出)
T2CONbits.TON = 1; // Enable Timer2 定时器开启了就一直在工作,除了休眠和空闲模式
}
代码中选取定时器2作为定时对象,先设定timer2的中断,然后进行定时。
定时公式如下:
定时时间(单位:微秒/us)= (PR2+1 )*Tcy(单位:微秒/us)*K
其中定时时间和Tcy单位都是统一的,Tcy是指令周期,指令周期等于系统时钟除以2,K是定时器分频比,PR2是定时器的计数值,PR2是16位寄存器,最大的计数值是65536。
假设系统时钟是80Mhz,那么指令周期Tcy是40Mhz,如果我要设定定时时间是400ms。那么进行以下公式计算:
400*1000 = 65536*1/40*K
K = 244.140625
也就是说,即使我计数值取到最大,K至少需要245(取整)的分频比,因为分频比只有1,8,64,256。所以选择256。
400*1000 = (PR2+1)*1/40*256
PR2 = 62499
此时就完成了定时400ms的需求。
下面是数据手册部分
如有缺漏或者错误之处,还望指出,我会及时更正修改!