0

我目前正在努力在 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

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

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

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

4

2 回答 2

0

要通过 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 频率,您可以播放简单的音乐。占空比影响音量,但不是线性的。高占空比非常接近纯直流,并且会被电容器切断,低占空比可能听不见。一些实验是有序的。

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

于 2015-11-22T13:45:32.423 回答
0

如果您使用 PWM 来模拟 DAC 并输出任意音频(对于给定频率的简单而肮脏的音调,您不需要这种复杂性),您需要获取音频样本 (PCM) 并将它们各自转换为相应的占空比。

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

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

请注意,如果采样率高于音频文件的采样率,则需要适当的上采样器/采样率转换器。还要记住,提高采样率会提高 CPU 利用率(每秒调用更多次 ISR,加上采样率转换,除非您的音频是预先转换的)和功耗。

[我以前在我的 PC 的扬声器上做过这个,但现在它被毁了,这要归功于 BIOS 和芯片组使用的 SMM/SMI。]

于 2015-11-22T12:13:00.847 回答