利用 51 定时器生成 PWM
1 PWM 简介
PWM(Pulse Width Modulation,脉冲宽度调制)
是按一定规律改变脉冲序列的脉冲宽度,以调节输出量和波形的一种调制方式。
在控制系统中最常用的是矩形波 PWM
信号,在控制时需要调节 PWM
波占空比。如下图所示,占空比是指高电平持续时间在一个周期时间内的百分比。控制电机的转速时,占空比越大,速度越快,如果全为高电平,占空比为 100%
时,速度达到最快。
当用单片机 I/O
输出 PWM
信号时,可采用以下三种方法:
- 利用软件延时。当高电平延时时间到时,对
I/O
口电平取反变成低电平,再延时;当低电平延时时间到时,对该I/O
口电平取反;如此循环,就可得到PWM
信号。 - 利用定时器。控制方法同上,只是利用单片机的定时器来定时进行高、低电平的翻转,而不用软件延时。
- 利用单片机自带的
PWM
控制器。
2 定时器的应用
单片机的周期
- 时钟周期,也成为振荡周期,定义为时钟频率的倒数(单片机外接晶振的倒数,如
12MHz
晶振的时钟周期就是1/12 us
)。它是单片机中最基本、最小的时间单位。在一个时钟周期内,CPU
仅完成一个最基本的动作。 - 状态周期:时钟周期的
2
倍。 - 机器周期
T
c
y
T_{cy}
Tcy:单片机的基本操作周期,在一个操作周期内,单片机完成一项基本操作。如取指令、存储器读/写等。机器周期由
12
个时钟周期(6
个状态周期)组成。 - 指令周期:指
CPU
执行一条指令所需的时间。指令周期一般包含1 ~ 4
个机器周期。
定时器/计数器本质
定时器/计数器的本质是加 1
计数器(16
位),有高 8
位和低 8
位 2
个寄存器组成。TMOD
是定时器/计数器的工作模式寄存器,确定工作方式和功能,TCON
是控制寄存器,控制 T0
、T1
的启动和停止及设置溢出标志。
加 1
计数器输入的计数脉冲的来源:
- 一个由系统的时钟振荡器输出脉冲经
12
分频后送来 - 一个由
T0
或T1
引脚输入的外部脉冲源,每来一个脉冲计数器加1
。
当加到计数器全为 1
时,在输入一个脉冲就使计数器回零,且计数器的溢出使 TCON
寄存器中 TF0
或 TF1
置 1
,向 CPU
发出中断请求。如果定时器/计数器工作于定时模式,则表示定时时间已到;如果工作于计数模式,则表示计数值已满。
定时器定时时间:计数值 N N N × 机器周期 T c y T_{cy} Tcy。
定时器初值
溢出时计数器的值减去计数初值才是加 1
计数器的计数值。
定时器一旦启动,它便在原来的数值上开始加 1
计数,若在程序开始时,没有设置 TH0
和 TL0
,则默认是 0
,假设时钟频率为 12MHz
,12
个时钟周期为一个机器周期,那么此时机器周期就是 1 us
,计满 TH0
和 TL0
就需要
2
16
−
1
2^{16} - 1
216−1 个数,再来一个脉冲计数器溢出,随即向 CPU
申请中断,因此溢出一次共需 65536us
,约 65.5ms
。
如果想要定时 50 ms
,那么就需先给 TH0
和 TL0
装入一个初值,在这个初值的基础上计 5000
个数后,定时器溢出,此时刚好就是 50ms
中断一次。当需要定时 1s
时,我们可以产生 20
次 50ms
的定时器中断后,便认为是 1s
。
定时器初值计算方法
当用定时器的方式 1
时,设机器周期为
T
c
y
T_{cy}
Tcy,定时器产生一次中断的时间为
t
t
t,那么需要计数的个数为
N
=
t
/
T
c
y
N = t / T_{cy}
N=t/Tcy,装入 THX 和 TLX 中的数分别为:
T
H
X
=
(
65536
−
N
)
/
256
THX = (65536 - N) / 256
THX=(65536−N)/256
T
L
X
=
(
65536
−
N
)
%
256
TLX = (65536 - N) \% 256
TLX=(65536−N)%256
3 示例-舵机的驱动
舵机的原理
舵机的控制信号,一般是脉宽调制(PWM)信号,如下图,反映了 PWM 信号和舵机转动角度的关系,可以简单的理解为,通过给舵机通电的时间控制,结合角度传感器的反馈信号检测和控制,实现了舵机的精确角度控制。
舵机的控制信号周期为 20ms 的脉宽调制信号(PWM),其中脉宽从 0.5ms ~ 2.5ms,相应的舵盘位置从 0 ~ 180度,呈线型变化。也就是说,给舵机提供一定的脉宽,输出轴就会保持一定的对应角度,无论外接转矩怎么改变,直到提供另外一个脉冲信号,才会改变输出角度到新的对应的位置上。
舵机内部有一个基准电路,产生周期为 20ms,宽度为 1.5ms 的脉冲信号,有一个比较器,将外加信号与基准信号相比较,判断出方向和大小,从而产生电机的转动信号。
伺服电动机的周期通常为 20ms,希望以 50Hz 的频率产生脉冲。
180 度电机与 360 度电机
360 度舵机与一般舵机的区别是:给一般舵机一个 PWM 信号,舵机会转到一个特定角度,而给 360 度舵机一个 PWM 信号,舵机会以一个特定的速度转动,类似与电机。但与电机不同的是,360 舵机是闭环控制,速度控制稳定。
PWM 信号与 360° 舵机转速的关系:
- 0.5ms ———— 正向最大转速
- 1.5ms ———— 速度为 0
- 2.5ms ———— 反向最大转速
利用 51 单片机驱动舵机
通过上述分析,可以得出 1ms
对应 90°
,那么 0.1ms
对应 9°
。由于驱动舵机的控制信号周期为 20ms,可以将 20ms 的周期信号分为 200 份,那么 1 份代表 0.1ms,相对应舵机的转角为 9°。
因此,将定时器中断一次的时间设定为 0.1 ms,即定时时间为 0.1ms。采用定时器 1 工作方式 2(8 位初值自动重载)。
- 计算定时器初值
- 机器周期 T c y = 12 × 1 / ( 11.0592 × 1 0 6 ) s T_{cy} = 12 × 1 / (11.0592 × 10^6) s Tcy=12×1/(11.0592×106)s 约等于 1.0851 u s 1.0851 us 1.0851us
- 定时时间 t = 0.1 m s t = 0.1ms t=0.1ms
- 计数值 N = t / T c y = 0.1 m s / 1.0851 u s = 92 N = t / T_{cy} = 0.1ms / 1.0851 us = 92 N=t/Tcy=0.1ms/1.0851us=92
- 装入 THX 和 TLX 的数为: T H X = T L X = 256 − 92 = 164 THX = TLX = 256-92 = 164 THX=TLX=256−92=164
- 代码
void T1_Init(void)
{
TMOD &= 0x0F; //设置定时器模式
TMOD |= 0x20; //设置定时器模式
TH1 = 164; //设置定时初始值
TL1 = 164; //设置定时重载值
TF1 = 0; //清除TF1标志
TR1 = 1; //定时器1开始计时
}