在前面章节里主要跟大家讲述了通过定时器来控制板子的输出,这一讲主要跟大家介绍如果使用定时器输出特定频率的脉冲。其实对于高手来将,这个东西应该就太简单了,根据频率计算出脉冲周期,然后根据周期设定定时器的定时时间不就好了么?没错,确实就是这样的!STC官方手册上也给出了一种计算输出频率的方式:
输出时钟频率=T0溢出率/2
T0如果工作在1T模式,那么输出时钟频率=(SYSclk)/(65536-)/2
T0如果工作在12T模式,那么输出时钟频率=(SYSclk)/12/(65536-)/2
可知,T0工作在1T模式的时候,定时器的重装值为:
=65536 -(SYSclk/输出时钟频率/2)
T0工作在12T模式的时候,定时器的重装值为:
=65536 -(SYSclk/12/输出时钟频率/2)
那么,根据以上计算方式,我们就可以来配置定时器了:
#define Fre_Mhz 1000 //1kHz
/**************** 定时器配置 ******************/
void Timer_config(void)
{
TIM_InitTypeDef TIM_InitStructure; //结构定义
TIM_InitStructure.TIM_Mode = TIM_16BitAutoReload; //指定工作模式, TIM_16BitAutoReload,TIM_16Bit,TIM_8BitAutoReload,TIM_16BitAutoReloadNoMask
TIM_InitStructure.TIM_Polity = PolityLow; //指定中断优先级, PolityHigh,PolityLow
TIM_InitStructure.TIM_Interrupt = ENABLE; //中断是否允许, ENABLE或DISABLE
TIM_InitStructure.TIM_ClkSource = TIM_CLOCK_1T; //指定时钟源, TIM_CLOCK_1T,TIM_CLOCK_12T,TIM_CLOCK_Ext
TIM_InitStructure.TIM_ClkOut = DISABLE; //是否输出高速脉冲, ENABLE或DISABLE
TIM_InitStructure.TIM_Value = 65536UL - (MAIN_Fosc / Fre_Mhz/2); //初值
TIM_InitStructure.TIM_Run = ENABLE; //是否初始化后启动定时器, ENABLE或DISABLE
Timer_Inilize(Timer0,&TIM_InitStructure); //初始化Timer0 Timer0,Timer1,Timer2,Timer3,Timer44
}
本例以OUT00输出脉冲为例,在定时器中断函数里面每中断一次便将OUT00取反,便可实现我们想要的功能:
/********************* Timer0中断函数************************/
void timer0_int (void) interrupt TIMER0_VECTOR //1ms
{
OUT00 = !OUT00; //OUT00输出特定频率波形
}
笔者测试了三种频率的脉冲输出:1K、2K、10K,用示波器测得三种频率下的波形分别如下:
由于MOS管的缘故,在脉冲频率比较高的时候,波形就开始有点失真了,实际单片机本身输出的脉冲频率可以高达十几兆赫兹,但是实际应用当中,我们也未必用的上,一般控制步进电机,几K的脉冲基本够用了。
源代码: