使用 PWM 信号为 PIC32 微控制器上的扬声器生成音调

Generating a tone with PWM signal to a speaker on a PIC32 microcontroller

我目前正致力于在 PIC32 设备上生成音调。我发现的信息不足以让我完全了解如何实现这一目标。据我了解,PWM 信号发送具有指定占空比和频率的 1 和 0,这样就可以使某物以特定速度旋转。但这还不足以产生音调。我主要关注以下两个链接来创建代码:

http://umassamherstm5.org/tech-tutorials/pic32-tutorials/pic32mx220-tutorials/pwm http://www.mikroe.com/chapters/view/54/chapter-6-output-compare-module/#ch6.4

以及参考手册中的相关部分。

其中一个链接指出要播放音频,必须使用定时器中断。这些应该如何使用?是否有必要使用例如正弦函数计算波的值,然后将其与定时器中断结合以定义每个中断标志后的占空比?

最终结果将是一个响应按钮按下并播放声音的程序。如果需要低通滤波器,也将实施。

如果您使用 PWM 来模拟 DAC 并输出任意音频(对于给定频率的简单而肮脏的音调,您不需要这种复杂性),您想要获取音频样本 (PCM) 并转换他们各自进入各自的工作周期。

合理的音频以 8KHz (POTS) 的采样率开始。因此,对于每个(每 1/8000 秒)样本,您都需要更改占空比。你希望这些变化是有规律的,因为不规则会导致听觉失真。因此,您可以对定时器进行编程,以 8KHz 的速率生成中断,并在 ISR 中根据新的音频样本值更改占空比(此 ISR 必须从内存中读取样本,除非它们形成一个简单的模式并且可以在飞)。

当您以 8KHz 的速率更改占空比时,您会生成频率为 4KHz 的周期波。这很好听。在模拟电路中很好地过滤它而不影响你想听到的声音可能不是一件容易的事(尖锐的 LPF 滤波器是 tricky/expensive,便宜的滤波器很差)。相反,您可以将采样率提高到扬声器可以产生(或人耳可以听到)的两倍以上,或者至少远高于您想要产生的最大频率(在后一种情况下,便宜的模拟滤波器可以帮助消除不需要的周期波对你想听到的声音没有太大影响,你在这里不需要那么多的锐度。

请注意,如果采样率高于您的音频文件的采样率,您将需要一个合适的 upsampler/sample-rate 转换器。另请记住,提高采样率会提高 CPU 利用率(ISR 每秒调用更多次,加上采样率转换,除非您的音频已预先转换)和功耗。

[我以前在 PC 的扬声器上做过这个,但现在它坏了,多亏了 BIOS 和芯片组使用的 SMM/SMIs。]

要通过 PWM 播放简单的音调,您首先需要一个驱动电路,因为 PIC 不能直接驱动扬声器。通常使用推挽作为主动驱动高电平和低电平的结果以获得更好的扬声器响应。它还允许使用一个串联电容器,作为一个简单的高通滤波器来保护扬声器免受长直流周期的影响。

例如,这应该有效:http://3.bp.blogspot.com/-FFBftqQ0o8c/Tb3x2ouLV1I/AAAAAAAABIA/FFmW9Xdwzec/s400/sound.png

(来源:http://electro-mcu-stuff.blogspot.be/

PIC32 具有硬件 PWM,您可以对其进行编程以在特定频率和占空比下生成 PWM。 PWM 频率控制音调,因此通过每隔一段时间更改 PWM 频率,您可以播放简单的音乐。占空比影响音量,但不是线性的。高占空比非常接近纯直流电,会被电容器切断,低占空比可能听不见。一些实验是有序的。

link 提到定时器中断,因为他们不是在谈论播放简单的音符,而是使用 PWM + 低通滤波器作为简单的 DAC 来播放真正的音频。在这种情况下,定时器中断将用于更新占空比,以定期播放下一个 PCM 样本(采样率)。