如何使用RT-Spark开发板上的被动蜂鸣器产生简单的蜂鸣声
本项目使用RT-Spark开发板和STM32F407ZGT6微控制器构建,主要通过代码延时来产生频率,实现引脚的开关控制、读取按钮输入、保存状态,并通过被动蜂鸣器发出提示音。
系统使用三个按钮进行控制。其中一个按钮用于播放声音,另外两个按钮则用于增加或减小音调频率。通过微秒级延迟函数切换GPIO引脚来生成音调,而非使用硬件定时器。这种方式使学生能够理解时间控制对嵌入式系统中信号生成的影响。
注意:软件生成的频率总是低于硬件(如定时器)生成的频率,因为代码总会引入函数开销。虽然通常延迟可能只有纳秒级微秒,但在精度方面,尤其是在时间受限的应用中,不建议使用此类方式,而应优先选择对CPU负担较小的硬件,以节省CPU资源用于其他任务。
硬件配置
软件配置
音色生成
下图展示了频率生成的核心部分,该函数通过反复改变输出引脚(PA2)的状态,并在状态转换之间添加延迟,来生成或模拟方波。持续时间是可选的,仅用于设置周期重复的次数。
“update_buttons”函数仅检查按钮状态,以防止在按住按钮时逻辑持续执行,简而言之,这是通过软件而非硬件实现的去抖动。
频率——软件与现实
由于方波完全由软件生成,因此容易出现精度误差,通常会因函数开销而产生纳秒级或微秒级的延迟,甚至更严重的情况。特别是当延迟功能本身也主要依赖软件而非硬件实现时,问题更为明显,具体如下所示。
此处显示,由于功能开销,上升沿和下降沿均出现轻微的斜坡变化,预期的100微秒周期变为约115微秒,并且电压状态在两者之间存在轻微不一致。
结论——我们学到了什么,以及本可以做什么
该项目成功展示了软件延迟、按钮输入和GPIO切换如何协同工作以控制一个无源蜂鸣器。虽然使用软件循环是理解信号时序的有效教学工具,但测试表明,软件驱动的频率在实际应用中存在明显不足。由于CPU必须依次处理每一微秒的延迟和按钮检测,函数开销会额外增加15微秒,使目标100微秒周期增加,从而导致波形失真。
为了实现近乎完美的精度,系统应从软件循环切换至STM32F407ZGT6内置的硬件定时器。通过在PWM模式下使用定时器,微控制器利用其内部硬件时钟生成方波,完全消除软件指令延迟,从而精确输出目标频率。更棒的是,一旦初始化完成,硬件定时器便会独立在后台运行,这意味着CPU几乎无需处理信号生成任务。这使处理器免于浪费周期进行倒计时或引脚切换,从而将所有资源完全用于其他任务。
同样地,将按钮去抖功能从软件程序转移到RC电路等硬件滤波器中,可以立即清理输入信号,而无需让CPU暂停等待接触反弹。最终而言,虽然软件延迟有助于演示基本概念,但要确保信号的精确性并完全减轻CPU负担,唯一的方法就是利用专用的硬件外设。
本文编译自hackster.io





