PWM(Pulse Width Modulation,脉冲宽度调制)是按一定规律改变脉冲序列的脉冲宽度,以调节输出量和波形的一种调制方式。
在控制系统中最常用的是矩形波 PWM 信号,在控制时需要调节 PWM 波占空比。如下图所示,占空比是指高电平持续时间在一个周期时间内的百分比。控制电机的转速时,占空比越大,速度越快,如果全为高电平,占空比为 100% 时,速度达到最快。
当用单片机 I/O 输出 PWM 信号时,可采用以下三种方法:
- 利用软件延时。当高电平延时时间到时,对 I/O 口电平取反变成低电平,再延时;当低电平延时时间到时,对该 I/O 口电平取反;如此循环,就可得到 PWM 信号。
- 利用定时器。控制方法同上,只是利用单片机的定时器来定时进行高、低电平的翻转,而不用软件延时。
- 利用单片机自带的 PWM 控制器。
单片机的周期
- 时钟周期,也成为振荡周期,定义为时钟频率的倒数(单片机外接晶振的倒数,如 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
舵机的原理
舵机的控制信号,一般是脉宽调制(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开始计时 }
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)