常见的PWM设备:蜂鸣器与舵机详解
常见的PWM设备:蜂鸣器与舵机详解
本篇文章详细介绍了PWM控制的两种常见设备:蜂鸣器和舵机。文章从基础知识、硬件配置到具体编程实现,全面解析了这两种设备的工作原理和使用方法,适合对电子工程和机器人技术感兴趣的读者深入学习。
蜂鸣器
蜂鸣器是一种能够通过电子信号控制的发声器件。在生活中,几乎所有能够发出哔哔响声的电子器件中都装有蜂鸣器。蜂鸣器能够为使用者提供直观的声音信息,是一种常见的人机交互模式。在RoboMaster比赛中,常常用于提醒队员完成某项检查或者用于某个模块出问题时的报错。常见的蜂鸣器分为插针型和贴片型,在开发板C型使用到蜂鸣器为贴片型,如下图所示。
根据是否内置震荡电路可分为有源蜂鸣器和无源蜂鸣器。有源蜂鸣器只需要提供直流电压就可以通过内部的震荡电路产生震荡电流进而发出声音,而无源蜂鸣器需要输入特定频率的方波才能发出声音。两者比较起来,有源蜂鸣器的控制更加简单,但是只能发出单一频率的声音,而无源蜂鸣器虽然控制起来比较麻烦,但是可以通过改变输入方波的频率发出不同音调的声音,甚至可以用来演奏乐曲。两者的对比可见下表:
特征 | 有源蜂鸣器 | 无源蜂鸣器 |
---|---|---|
控制方式 | 直接提供直流电压 | 需要特定频率的方波 |
声音特性 | 单一频率 | 可变频率 |
应用场景 | 简单报警 | 音乐播放 |
舵机的控制
舵机是机器人中的常见执行部件,通常使用特定频率的PWM进行控制。舵机的主要组成部位由一个小型的电机和传动机构(齿轮组)构成,多被用于操控飞行器上的舵面,故而得名舵机。由于控制简单,价格便宜,在RoboMaster比赛中,用于简单的动作控制,例如使用舵机控制弹仓盖的开合。下图为市场上常见的舵机。
通常舵机的三根线按照颜色分别为:黑色-GND,红色-VCC,黄色-PWM信号。在使用舵机时,只需要使用杜邦线或者其他连接线接入开发板C型对应的PWM接口。
舵机使用的PWM信号一般为频率50Hz,高电平时间0.5ms-2.5ms的PWM信号,不同占空比的PWM信号对应舵机转动的角度,以180度舵机为例,对应角度图如下图所示。
程序学习
蜂鸣器的PWM在cubeMX中配置
查看开发板的原理图,如图所示。
蜂鸣器使用的引脚为PD14,为定时器4的通道3。打开cubeMX,使能定时器4,预分配设置为0,重载值设置为20999,设置通道3为PWM输出,其余设置保持默认即可,此时开发板的PD14引脚变为绿色。
时钟树配置如图。
点击Generate Code,生成工程。根据在定时器章节的进阶学习部分的知识,可以通过查看源代码或者数据手册的方式知道定时器4挂载在APB1总线上,对应的总线频率为84MHz,分频值为0,重载值为20999,并通过公式计算得到PWM波的输出频率为4000Hz。
蜂鸣器的程序流程
在之前的原理介绍中,改变PWM的频率就可以改变无源蜂鸣器的音调。故而改变定时器的分频系数和重载值,改变PWM的频率,就能够控制无源蜂鸣器发出的响声频率。在主程序中,声明了psc和pwm两个变量,分别控制定时器4的分频系数和重载值,每一次循环中这两个变量进行一次自加。通过宏定义的方式,设置pwm的值在MIN_BUZZER_PWM(10000)和MAX_BUZZER_PWM(20000)之间变动,psc的值在0和MAX_PSC(1000)之间变动,程序主流程如图所示。
主函数代码如下:
while (1)
{
/* USER CODE END WHILE */
/* USER CODE BEGIN 3 */
pwm++;
psc++;
if(pwm > MAX_BUZZER_PWM)
{
pwm = MIN_BUZZER_PWM;
}
if(psc > MAX_PSC)
{
psc = 0;
}
buzzer_on(psc, pwm);
HAL_Delay(1);
}
在buzzer_on函数中,将psc和pwm两个值赋值给定时器4的预分频计数器和3号通道的比较寄存器,从而调整PWM信号的周期,进而控制蜂鸣器发出不同声调,不同响度的声音。
void buzzer_on(uint16_t psc, uint16_t pwm)
{
// ...
}
效果展示
使用示波器可以观察PWM输出波形,得到4kHz的PWM波形图,同时蜂鸣器会发生响声。
舵机的PWM在cubeMX中配置
在开发板上具有7个PWM的输出接口,原理图如图所示,实物图如图所示
首先开启定时器1,预分频值设置为167,重载值设置为19999。打开1-4的PWM输出通道,在PWM通道的设置中,将Pulse值设置为2000,比较寄存器的初始值就会被设成2000
接着开启定时器8,将预分频值设置为167,重载值设置为19999。打开1-3的PWM输出通道,在PWM通道的设置中,将Pulse值设置为2000。
最后将时钟树如下进行配置
可以通过查看源代码或者数据手册的方式我们知道定时器1和8挂载在APB2总线上,对应的总线频率为168MHz,定时器分频值为167,重载值19999,并通过公式计算得到PWM波的输出频率为50Hz,对应的周期为20ms。
通过PWM章节部分学习的知识,计算出PWM占空比最小为500/20000即2.5%,对应高电平时间为20ms乘以2.5%等于0.5ms,最大为2000/20000即10%,对应高电平时间为20ms乘以10%等于2ms。
舵机主程序讲解
在初始化时,通过HAL_TIM_Base_Start函数启动定时器1和定时器8,再通过HAL_TIM_PWM_Start函数将定时器1的1,2,3,4号通道的PWM输出和定时器8的1,2,3通道的PWM输出开启。
在主循环中,通过__HAL_TIM_SetCompare来设置PWM的占空比,需要注意的是__HAL_TIM_SetCompare并非是一个函数,查看定义后会发现这其实是一个宏,最后其功能的依然是依靠将数值赋值给定时器某一通道比较寄存器来实现的。
#define __HAL_TIM_SetCompare __HAL_TIM_SET_COMPARE
#define __HAL_TIM_SET_COMPARE(__HANDLE__, __CHANNEL__, __COMPARE__) \
(((__CHANNEL__) == TIM_CHANNEL_1) ? ((__HANDLE__)->Instance->CCR1 = (__COMPARE__)) :\
((__CHANNEL__) == TIM_CHANNEL_2) ? ((__HANDLE__)->Instance->CCR2 = (__COMPARE__)) :\
((__CHANNEL__) == TIM_CHANNEL_3) ? ((__HANDLE__)->Instance->CCR3 = (__COMPARE__)) :\
((__HANDLE__)->Instance->CCR4 = (__COMPARE__))
使用__HAL_TIM_SetCompare进行占空比设置时,依次对应的输入为:
随着主循环中各个PWM输出的占空比的变化,舵机的转动角度也随之变化。
舵机效果演示
使用示波器观察PWM在0.5ms高电平和2.5ms高电平的输出波形,如下图所示。
课程总结
蜂鸣器是一种常见的人机交互模式,可以用于提醒队员完成某项检查,或者用于报警,提醒某个模块离线情况。舵机是一种简单易用的动力装置,可以用于机器人弹仓盖的开合,简单的机械爪控制等。