c - 使用 for 循环的微 Controller p18f4520 的音频

标签 c audio for-loop delay microcontroller

我正在使用 C 语言编程为微 Controller P18F4520 编写音频。 我正在使用 for 循环和延迟来执行此操作。我还没有学到任何其他方法,而且我必须使用 for 循环和延迟来为目标板生成音频音调。扬声器端口位于 RA4。这是我到目前为止所做的。

#include <p18f4520.h>
#include <delays.h>
void tone (float, int);
void main()
{
ADCON1 = 0x0F;
TRISA = 0b11101111;

/*tone(38.17, 262); //C (1)
tone(34.01, 294); //D (2)
tone(30.3, 330); //E (3)
tone(28.57, 350); //F (4)
tone(25.51, 392); //G (5)
tone(24.04, 416); //G^(6)
tone(20.41, 490); //B (7)
tone(11.36, 880); //A (8)*/

tone(11.36, 880); //A (8)

}
void tone(float n, int cycles)
{
unsigned int i;
for(i=0; i<cycles; i++)
        {
            PORTAbits.RA4 = 0;
            Delay10TCYx(n);
            PORTAbits.RA4 = 1;
            Delay10TCYx(n);
        }
}

如您所见,我创建了一个音调函数,其中 n 代表延迟,cycles 代表 for 循环中的周期数。我不确定我的计算是否正确,但到目前为止这是我所做的并且它确实产生了音调。我只是不确定它是否真的是 A 音或 G 音等。我如何计算是首先我会找出频率音,例如 A 音的频率为 440Hz。然后我会找到它的周期,它将是 1/440Hz。然后对于占空比,我希望音调只发出一半的蜂鸣声,即 50%,所以我将周期除以 2,即 (1/440Hz)/2 = 0.001136s 或 1.136ms。然后我将计算微 Controller 4*(1/2MHz) 的 1 个周期的延迟,即 2µs。所以这意味着对于 1 个周期,它将延迟 2µs,比率为 2µs:1cyc。因此,为了获得 1.136ms 的周期数,它将是 1.136ms:1.136ms/2µs,即 568 个周期。目前在这部分,我询问了 n 中应该有什么,其中 n 在 Delay10TCYx(n) 中。我得到的是,只需将 10 乘以 11.36,对于音调 A,它将是 Delay10TCYx(11.36)。至于周期,我想延迟 1 秒,即 1/1.136 毫秒,即 880。这就是为什么在我的方法中,音调 A 是音调 (11.36, 880)。它会产生一种音调,我已经找到了音调的范围,但我不确定它们是否真的是音调 C D E F G G^ B A。

所以我的问题是 1. 我如何真正计算音调 A 的延迟和频率? 2. 对于“周期”的 for 循环状态是周期数,但根据问题 1 的答案,我应该使用多少个周期来改变音调 A 的时间段?循环次数越多,音调 A 的周期越长?如果是这样,我怎么知道多长时间? 3. 当我使用函数播放音调时,与我直接在 main 方法中使用 for 循环时相比,它以某种方式产生了不同的音调。为什么会这样? 4. 最后,如果我想停止代码,我该怎么做?我试过使用 for 循环,但它不起作用。

一个简单的解释会很好,因为我只是一个学生,正在研究一个使用 for 循环和延迟产生音调的项目。我在其他地方搜索过人们使用不同的东西,如 WAV 或类似的东西,但我只是想知道如何使用 for 循环和延迟音频。

非常感谢您的帮助。

最佳答案

首先,您需要了解如何在任意时间间隔生成中断的一般方法。这让您知道您可以每隔 x 执行一次特定操作微秒,[1-2]。

已经有项目在 PIC 上播放特定音调(以赫兹为单位),就像您正在尝试做的那样,[3-4]。

接下来,您需要采用另一种方法来生成音调。对于您的 delay功能,当它可以做其他事情时,你实际上是在白白耗尽 CPU。你最好直接使用定时器中断,这样你就不会“通过空闲来燃烧 CPU”。

一旦你实现了这个,你只需要知道你试图生成的音符的相应频率,通过使用公式从特定音符 [5] 生成频率,或者使用查找表[6].

  1. PIC 定时器 0 生成 1 毫秒或 1 秒中断的过程是什么?,2014 年 7 月 5 日访问, <http://www.edaboard.com/thread52636.html>
  2. PIC18 定时器简介 - PIC 微 Controller 教程,访问时间 2014-07-05, <http://extremeelectronics.co.in/microchip-pic-tutorials/introduction-to-pic18s-timers-pic-microcontroller-tutorial/>
  3. 在您的 PIC16F87x 微 Controller 上生成铃声,2014 年 7 月 5 日访问,<http://retired.beyondlogic.org/pic/ringtones.htm> http://retired.beyondlogic.org/pic/ringtones.htm
  4. AN655 - 使用 PWM 和 R-2R 梯形图生成正弦和 DTMF 波形的 D/A 转换,2014 年 7 月 5 日访问, <http://www.microchip.com/stellent/idcplg?IdcService=SS_GET_PAGE&nodeId=1824&appnote=en011071>
  5. 频率表方程式,2014-07-05 访问, <http://www.phy.mtu.edu/~suits/NoteFreqCalcs.html>
  6. 等温标度的频率,A4 = 440 Hz,2014 年 7 月 5 日访问, <http://www.phy.mtu.edu/~suits/notefreqs.html>

关于c - 使用 for 循环的微 Controller p18f4520 的音频,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25142134/

相关文章:

c - C 中的结构函数

c - 内存管理c

JavaScript 点击事件即使在解除绑定(bind)后仍运行 3 次

每个循环的 Java 都被 PMD 标记为 UR 异常

ajax - 在AJAX聊天中播放声音

ios - 如何使用for循环在页面控件中打印数组(swift4)

java - C语言中字母的区别?

c - 如何释放分配给 C 中指针的内存?

IOS:4秒后启动wma

bash - 如何检测当前正在 Linux 中播放的声音?