利用 51 定时器生成 PWM

利用 51 定时器生成 PWM,第1张

利用 51 定时器生成 PWM
利用 51 定时器生成 PWM
1 PWM 简介

PWM(Pulse Width Modulation,脉冲宽度调制)是按一定规律改变脉冲序列的脉冲宽度,以调节输出量和波形的一种调制方式。

在控制系统中最常用的是矩形波 PWM 信号,在控制时需要调节 PWM 波占空比。如下图所示,占空比是指高电平持续时间在一个周期时间内的百分比。控制电机的转速时,占空比越大,速度越快,如果全为高电平,占空比为 100% 时,速度达到最快。

当用单片机 I/O 输出 PWM 信号时,可采用以下三种方法:

  • 利用软件延时。当高电平延时时间到时,对 I/O 口电平取反变成低电平,再延时;当低电平延时时间到时,对该 I/O 口电平取反;如此循环,就可得到 PWM 信号。
  • 利用定时器。控制方法同上,只是利用单片机的定时器来定时进行高、低电平的翻转,而不用软件延时。
  • 利用单片机自带的 PWM 控制器。
2 定时器的应用

单片机的周期

  • 时钟周期,也成为振荡周期,定义为时钟频率的倒数(单片机外接晶振的倒数,如 12MHz 晶振的时钟周期就是 1/2 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 位初值自动重载)。

  • 计算定时器初值
    1. 机器周期 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
    2. 定时时间 t = 0.1 m s t = 0.1ms t=0.1ms
    3. 计数值 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
    4. 装入 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开始计时
}

欢迎分享,转载请注明来源:内存溢出

原文地址: https://www.outofmemory.cn/zaji/5670352.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-12-17
下一篇 2022-12-16

发表评论

登录后才能评论

评论列表(0条)

保存