说明
上一期我们完成了定时器的相关实验,更深层的理解了中断的原理机制,这一期我们来做一个呼吸灯实验,这里我们将以定时器1为例,第一步,我们需要配置pwm的引脚初始化函数,对相应的GPIO配置模式、输出和复用功能,第二步,我们需要配置定时器1的PWM配置,包括定时器1初始化、定时器输出通道配置以及使能定时器,第三步编写呼吸灯函数,第四步,在主函数初始化定时器配置,死循环里调用呼吸灯函数,第五步,看现象,在此之前,我们需要理解PWM的基础知识,才能更好的理解其中的原理。
提示:以下部分参考于梁山派开发板学习指南,代码如有更有解可在评论区一起沟通交流哈。
一、PWM基础知识
1.什么是 PWM
PWM(
Pulse Width Modulation
脉宽调制)是利用微处理器的数字输出来对模拟电路进行控制的一种非常有效的技术。PWM
是一种对模拟信号电平进行数字编码的方法。通过高分辨率计数器的使用,方波占空比被调制用来对一个具体模拟信号的电平进行编码。PWM
信号任然是数字的,因为在给定的任何时刻,满幅值的直流供电要么完全有,要么完全无。比如我们的电压输出是 5v
的,那么经过改变 PWM
的占空比,可以达到在一定时间内输出
3.3V
或者
1.3V
的效果。
2.GD32 PWM 介绍
前面我们介绍了 GD32F450ZGT6
一共有
14
个定时器,可以分为五种类型,高级定时器
0/7
、通用定时器(L0)1-4
、通用定时器
(L1)8/11
、通用定时器
(L2)9/10/12/13
和基本定时器
5/6
。而
PWM
功能就是在定时器的基础上实现的,但不是所有的定时器都支持 PWM
输出功能。从用户手册上可以了解到,高级定时器拥有 4
个
PWM
通道,通用定时器
L0
拥有
4
个
PWM
通道,通用定时器
L1
拥有
2个 PWM
通道,通用定时器
L2
拥有
1
个
PWM
通道,而基本定时器没有
PWM
通道。每一个
PWM
通道都对应单片机的一个管脚,这个引脚不是唯一固定的,可能有一个或者两个管脚都对应同一个通道。比如说 TIMER1_CH2
对应
PA2
和
PB10
,就是说
PA2
和
PB10
管脚都可以配置为定时器的通道
2
,我们在使用的时候可以任选其一进行配置。
3.PWM 基本参数
PWM 是脉冲宽度调制,具有两个非常重要的参数:频率和占空比。
***频率:PWM
的频率是整个周期的倒数。
***占空比:占空比是指一个周期内高电平所占的比例。
4.控制方法
采样控制理论中有一个重要结论:冲量相等而形状不同的窄脉冲加在具有惯性的环节上时,其效果基本相同。PWM
控制技术就是以该结论为理论基础,对半导体开关器件的导通和关断进行控制,使输出端得到一系列幅值相等而宽度不相等的脉冲,用这些脉冲来代替正弦波或其他所需要的波形。按一定的规则对各脉冲的宽度进行调制,即可改变逆变电路输出电压的大小,也可改变输出频率。
5.基本原理
控制方式就是对逆变电路开关器件的通断进行控制,使输出端得到一系列幅值相等但宽度不一致的脉冲,用这些脉冲来代替正弦波或所需要的波形。也就是在输出波形的半个周期中产生多个脉冲,使个脉冲的等值电压为正弦波形,所获得的输出平滑且低次谐波少。按一定的规则对各脉冲的宽度进行调制,即可改变逆变电路输出电压的大小,也可改变输出频率。
二、PWM引脚配置
第一步,打开端口时钟,第二步配置GPIO,配置GPIO模式、输出和GPIO的复用功能:
这里我们需要到数据手册查看复用功能的引脚分配:
三、定时器1PWM配置配置
首先是定时器的常规配置:
其次是输出通道的配置:这里我们要配置两个结构体变量:
***ocpolarity
:通道输出的极性,也就是配置为低电平有效还是高电平有效,这里配置为高电平有
效
TIMER_OC_POLARITY_HIGH
。
***outputstate
:通道输出状态,一般是使能
TIMER_CCX_ENABLE
,使能
PWM
输出到端口。
其它的参数都是高级定时器使用的,可以不用配置。
void timer_channel_output_pulse_value_config(uint32_t timer_periph, uint16_t channel, uint32_t pulse);第一个参数是要配置的定时器,第二个参数是要配置的定时器通道,第三个参数是要设置的脉冲值。脉冲值的取值范围为(0-65535 )。一般我们调节占空比也是调用这个函数,通过设置这个通道的输出脉冲值,改变不同的占空比。
void timer_channel_output_mode_config(uint32_t timer_periph, uint16_t channel,uint16_t ocmode);第一个参数是要配置的定时器外设;第二个参数是要配置的定时器通道;第三个参数是要配置的比较模式。
void timer_channel_output_shadow_config(uint32_t timer_periph, uint16_t channel, uint16_t ocshadow);第一个参数是要配置的定时器外设;第二个参数是要配置的定时器通道;第三个参数是输出比较影子寄存器功能的状态。我们禁止输出比较影子寄存器,
四、呼吸灯
最后别忘了在主函数调用我们写的初始化函数和呼吸灯函数:
注:时钟分频值修改为 119
,那PSC_CLK = 200MHZ / 200 = 1MHZ,周期值设置为
10000 -1
,那对应的
PWM
输出的频率就是
1MHZ /10000 = 100HZ。需要注意的是
LED
灯刷新率在
50HZ
以下会有明显的闪烁,顾
PWM
的频率设置不能低于 50HZ
。
五、现象
这里为了效果明显,呼吸灯delay_1ms(10);
PWM呼吸灯实验
总结
通过这一期呼吸灯实验,我们简单的理解了PWM的原理,以及配置过程,PWM在实际项目开发用的还是比较多的,因此,弄懂其中的原理是十分重要的。