RVMCU课堂「16」: 手把手教你玩转RVSTAR—PWM使用篇
扫描二维码
随时随地手机看文章
系统环境
软件平台
硬件需求
脉冲宽度调制
脉冲宽度调制(Pulse Width Modulation,PWM)是利用微控制器的数字输出来对模拟电路进行控制的一种非常有效的技术。
无源蜂鸣器是很常见的一个电子元件,相信读者朋友们都见过可以播放生日歌的电子蜡烛,那个就是靠无源蜂鸣器来播放的。无源蜂鸣器的内部不带振荡源,通过使用50%占空比、频率500Hz~4.5kHz的PWM驱动,就可以播放出不同音调的声音。
GD32VF103的定时器分为三种类型,分别是基本定时器、通用定时器和高级定时器,其中普通定时器和高级定时器都支持PWM输出功能,在本次的实验中使用TIMER2(普通定时器)来进行PWM输出实验。
实验部分
#define NTD1 293
#define NTD2 329
#define NTD3 368
#define NTD4 390
#define NTD5 438
#define NTD6 492
#define NTD7 554
#define NTDL1 147
#define NTDL2 166
#define NTDL3 185
#define NTDL4 196
#define NTDL5 221
#define NTDL6 248
#define NTDL7 278
#define NTDH1 585
#define NTDH2 657
#define NTDH3 700
#define NTDH4 781
#define NTDH5 882
#define NTDH6 990
#define NTDH7 1112
然后,在“main.c”中,我们要实现三个函数:
- buzzer_init() -- 初始化蜂鸣器
- buzzer_on(int freq) -- 蜂鸣器根据频率发声
- buzzer_off() -- 关闭蜂鸣器
void buzzer_init()
{
rcu_periph_clock_enable(RCU_GPIOB);
rcu_periph_clock_enable(RCU_AF);
rcu_periph_clock_enable(RCU_TIMER2);
gpio_init(GPIOB, GPIO_MODE_AF_PP, GPIO_OSPEED_50MHZ, GPIO_PIN_1);
}
然后是buzzer_on(int freq),它接收不同的频率参数,对定时器进行配置,输出50%占空比的不同频率的PWM波,进而控制蜂鸣器发声。实现方法参考下方代码,其中要注意的是预分频系数、周期以及PWM输出的占空比等几个参数的配置。
{
timer_oc_parameter_struct timer_ocinitpara;
timer_parameter_struct timer_initpara;
timer_deinit(TIMER2);
/* initialize TIMER init parameter struct */
timer_struct_para_init(