【问题标题】:Generating a tone with PWM signal to a speaker on a PIC32 microcontroller使用 PWM 信号向 PIC32 微控制器上的扬声器生成音调
【发布时间】:2015-11-22 10:20:11
【问题描述】:

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

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

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

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

【问题讨论】:

    标签: c audio interrupt-handling pwm digital-analog-converter


    【解决方案1】:

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

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

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

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

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

    【讨论】:

    • 谢谢!我试图从一开始就产生尽可能简单的音调。那么如果不需要 PWM,那么最简单的方法是什么?
    • 生成方波。这很容易,因为输出是 0 或 1,1 将由固定的 PWM 密度定义,0 由另一个定义。频率仅由您在两个 PWM 速率之间切换的速率决定。这将产生一个绝对肮脏的信号,但却是一个起点。
    【解决方案2】:

    要通过 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 样本(采样率)。

    【讨论】:

    • 我已经能够通过使用 Arduino 库的 MPLAB 中提供的示例程序通过设备播放音调。它有效。你的意思是我这样做可能会破坏组件吗?我使用的硬件是 ChipKIT Uno32 开发板和一个 ChipKIT Basic I/O shield,然后将一个小型扬声器直接插入 I/O 引脚。扬声器来自旧电池供电的 iPod 扬声器。我觉得听起来不错。
    • 通常情况下,PIC 每个输出引脚只能吸收/提供大约 20mA 的电流 + 整个端口的总最大电流(无论您先达到什么)。一个典型的 8 欧姆扬声器 @ 3.3V 会产生略高于 400mA 的电流,这确实会损坏 PIC。您的开发板可能已经包含一些电流放大器,或者 ipod 扬声器的阻抗非常高。如果不是,请先修改电路,然后再损坏 PIC。
    猜你喜欢
    • 2012-11-12
    • 2017-08-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-04-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多