今天我们来讲一下定时器的用法以及PWM的调速
我们最初接触的51单片机有两组定时器(计数器),因为既可以定时,又可以计数,因此叫做定时器(计数器).
定时器和单片机的CPU是相互独立的。
定时器的工作过程是自动完成的,不需要CPU的参与。
51单片机中的定时器是根据机器内部的时钟或者是外部的脉冲信号对寄存器中的数据加1。
有了定时器/计数器之后,可以增加单片机的效率,一些简单的重复加1的工作可以交给定时器/计数器处理。CPU转而处理一些复杂的事情。同时可以实现精确定时作用。
定时器的工作原理:
定时/计数器实质上是一个加1计数器。它随着计数器的输入脉冲进行自加1,也就是每来一个脉冲,计数器就自动加1,,当加到计数器为全1时,再输入一个脉冲就使计数器回零,且计数器的溢出使相应的中断标志位置1,向CPU发出中断请求(定时/计数器中断允许时)。如果定时/计数器工作于定时模式,则表示定时时间已到;如果工作于计数模式,则表示计数值已满。
可见,由溢出时计数器的值减去计数初值才是加1计数器的计数值。
51单片机的定时器的结构:
定时/计数器的实质是加1计数器(16位),由高8位和低8位两个寄存器THx和TLx组成。TMOD是定时/计数器的工作方式寄存器,确定工作方式和功能;TCON是控制寄存器,控制T0、T1的启动和停止及设置溢出标志。
定时器的工作方式
1、方式1的计数位数是16位,由TL0作为低8位,TH0
作为高8位,组成了16位加1计数器 。
计数个数与计数初值的关系为:X=216-N
2、方式2为自动重装初值的8位计数方式。
计数个数与计数初值的关系为:X=28-N
工作方式2特别适合于用作较精确的脉冲信号发生器。
3、方式3只适用于定时/计数器T0,定时器T1处于方式3时相当于TR1=0,停止计数。
工作方式3将T0分成为两个独立的8位计数器TL0和TH0 。
定时器的初始化程序应完成如下工作:
对TMOD赋值,以确定T0和T1的工作方式。
计算初值,并将其写入TH0、TL0或TH1、TL1。
中断方式时,则对EA赋值,开放定时器中断。
使TR0或TR1置位,启动定时/计数器定时或计数。
下边我放一下我们所用的代码
void Timer0Init() //定时器的配置
{
TMOD|=0x11;
TL0=0XFF;
TH0=0XFE;
EA=1;
ET0=1;
TR0=1;
}
而调速非常的简单,只要配置好定时器之后就可以用了。
void ConcrolSpeed() interrupt 1 //定时器的使用,pwm
{
static unsigned int i=0;
TL0=0XFF;
TH0=0XFE;
i++;
if(i==ZKB_L1)
ENA_1=0;
if(i==ZKB_L2)
ENA_2=0;
if(i==ZKB_R1)
ENB_1=0;
if(i==ZKB_R1)
ENB_2=0;
if(i==55)
{
i=0;
ENA_1=1;
ENB_1=1;
ENA_2=1;
ENB_2=1;
}
}
完了在运动的函数里边加上速度控制就好了。
void leftrun1()
{
ZKB_L1 = 40;
ZKB_R1 = 40;
ZKB_L2 = 40;
ZKB_R2 = 40;
IN0 = 0;
IN1 = 1;
IN4 = 0;
IN5 = 1;
IN2 = 1;
IN3 = 0;
IN6 = 1;
IN7 = 0;
}