【STC8H】PWM原理(呼吸灯、舵机实现)

六、PWM

(一)原理

什么是PWM

脉冲宽度调制(PWM),是英文“Pulse Width Modulation”的缩写,简称脉宽调制,是利用微处理器的数字输出来对模拟电路进行控制的一种非常有效的技术,广泛应用在从测量、通信到功率控制与变换的许多领域中。

1.pwm的频率

指1秒钟内信号从高电平到低电平再回到高电平的次数(一个周期);**

也就是说一秒钟PWM有多少个周期

单位: Hz

表示方式: 20Hz、50Hz 、100Hz

2.pwm的周期

T=1/f 周期=1/频率 50Hz = 20ms 一个周期

如果频率为50Hz ,也就是说一个周期是20ms 那么一秒钟就有 50次PWM周期

3.占空比

是一个脉冲周期内,高电平的时间与整个周期时间的比例

单位: % (0%-100%) 表示方式:20%

在这里插入图片描述周期: 一个脉冲信号的时间 1s内测周期次数等于频率 脉宽时间: 高电平时间

上图中 脉宽时间占总周期时间的比例,就是占空比

比如:周期的时间是10ms,脉宽时间是8ms 那么低电平时间就是2ms

总的占空比 8/(8+2)= 80%**

这就是占空比为80%的脉冲信号

而我们知道PWM就是脉冲宽度调制 通过调节占空比,就可以调节脉冲宽度(脉宽时间) 而频率 就是单位时间内脉冲信号的次数,频率越大

以20Hz 占空比为80% 举例 就是1秒钟之内输出了20次脉冲信号 每次的高电平时间为40ms

我们换更详细点的图

占空比

上图中,周期为T T1为高电平时间 T2 为低电平时间

假设周期T为 1s 那么频率就是 1Hz 那么高电平时间0.5s ,低电平时间0.5s 总的占空比就是 0.5 /1 =50%

4.输出模拟电压

我们知道,单片机的IO口输出的是数字信号,IO口只能输出高电平1和低电平0。

假设高电平为5V 低电平则为0V 那么我们要输出不同的模拟电压,就要用到PWM,通过改变IO口输出的方波的占空比从而获得使用数字信号模拟成的模拟电压信号

我们知道,电压是以一种连接1或断开0的重复脉冲序列被夹到模拟负载上去的(例如LED灯,直流电机等),连接即是直流供电输出,断开即是直流供电断开。通过对连接和断开时间的控制,理论上来讲,可以输出任意不大于最大电压值(即0~5V之间任意大小)的模拟电压

比方说,占空比为50% 那就是高电平时间一半,低电平时间一半,在一定的频率下,就可以得到模拟的2.5V输出电压 。同理,75%的占空比得到的电压就是3.75V。 在这里插入图片描述

所以,<u>在一定的频率下,通过不同的占空比 即可得到不同的输出模拟电压。</u>

(二)模拟呼吸灯

科学小知识:一般人眼睛对于80Hz 以上刷新频率则完全没有闪烁感。频率太小的话看起来就会闪烁。

那么我们平时见到的LED灯,当它的频率大于50Hz的时候,人眼就会产生视觉暂留效果,基本就看不到闪烁了,而是一个常亮的LED灯,

你在1秒内,高电平0.5秒,低电平0.5秒,(频率1Hz)如此反复,那么你看到的电灯就会闪烁,但是如果是10毫秒内,5毫秒打开,5毫秒关闭,(频率100Hz) 这时候灯光的亮灭速度赶不上开关速度(LED灯还没完全亮就又熄灭了),由于视觉暂留作用 人眼不感觉电灯在闪烁,而是感觉灯的亮度少了 因为高电平时间(占空比)为50% 亮度也就为之前的50% ,

频率很高时,看不到闪烁,占空比越大,LED越亮; ​ 频率很低时,可看到闪烁,占空比越大,LED越亮。

所以,在频率一定下,可以用不同占空比改变LED灯的亮度。 使其达到一个呼吸灯的效果

将P22置为0时:

此时P22端口现象如下:

那如果增加下面一行代码:把P22置1,会有什么现象?

我们会发现这次的P22端口灯光会亮,但是亮度比第一个要弱。这就是因为第一次的占空比为0(高电平占一个周期的比例)灯光最亮,第二次的占空比为百分之五十,灯光亮度为原来的百分之五十。

下面我们用延时函数来帮忙,比如我们可以将一个周期分成100份。将P22置0占其中的5份,其余95份给P22置1。此时会有什么现象?

此时P22端口的灯光微亮。(手机拍下来比实际的亮一些。。。。。)

那如果换一下,将P22置0占其中的95份,其余5份给P22置1。又如何?

明显亮了很多。这就是占空比不同,P22端口的电压也就不同,灯光的亮度也就不同。

我们可以用for循环帮我们表示一下

实验现象是P22端口灯光很快由低变高。(确实非常快)肉眼很难补捉到有暗到亮的那个细节,因此再嵌套一个for循环延缓亮度变化。

呼吸灯本质就是灯光一定的速度有暗到亮,又从亮到暗...循环往复。

这就是呼吸灯的完整代码啦

(三)模拟舵机

舵机控制的另一个专业名字叫伺服控制。

经过百度,伺服”—词源于希腊语“奴隶”的意思。人们想把“伺服机构”当个得心应手的驯服工具,服从控制信号的要求而动作。在讯号来到之前,转子静止不动;讯号来到之后,转子立即转动;当讯号消失,转子能即时自行停转。由于它的“伺服”性能,因此而得名——伺服系统。

我们这次就是要控制模拟舵机SG90转动任意角度。

img

接线方法: 红-------------------------VCC 棕色----------------------GND 橙色----------------------信号线

在这里插入图片描述

舵机的控制需要MCU产生一个周期为20ms的脉冲信号,以0.5ms到2.5ms的高电平来控制舵机转动的角度。

在这里插入图片描述

模拟舵机:需要不断的发送相应角度的PWM信号,才能旋转到指定位置。例如:我现在让它旋转90度,我就需要在一个时间内不断的发送90度的PWM信号,舵机转动到指定位置就会停止。

现在我们来用SG90输出90°。首先配置定时器0.5ms,设置一个计数变量cnt,每过0.5ms就进入中断一次并伴随着cnt++;当cnt=40时,就是模拟舵机的一个周期。在这个周期里,设置另一个计数变量(用于跟cnt作比较),调整占空比的,比如说这个变量为4,4x0.5ms等于2ms,当cnt<=4时端口设置为高电平,周期里其余时间设置为低电平,以及每个周期cnt复位为0,那就实现了舵机转动的效果。

配置0.5ms定时器部分:

定时器中断部分:

  • 23
    点赞
  • 23
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值