gpt4 book ai didi

c - avr 如何定义 440Hz 的声音?

转载 作者:太空宇宙 更新时间:2023-11-04 03:22:35 25 4
gpt4 key购买 nike

这段代码会发出一声短促的声音。我怎样才能发出 440hz 的声音?

编辑:或类似这样的东西:?我想我不想使用快速 PWM。

#include <avr/io.h>
#include <avr/interrupt.h>

ISR(TIMER1_COMPA_vect) {
PORTB = 0;
}

ISR(TIMER1_OVF_vect) {
PORTB ^= 8;
}

int main(void) {

DDRB = 8;
PORTB = 0;
TCCR1B=(1 << CS10); // Prescaler: 1, Mode: 0
OCR1A = 9089.91; // (F_CPU / 2 / 1 / 440) - 1;

TIMSK1 |= (1 << OCIE1A) | (1 << TOIE1); //Interrupt an
PCICR = 0x01;
sei(); // Interrupts global aktivieren

while(1) {
};
}

最佳答案

您可以使用快速 PWM 模式来实现。我以前做过。这个想法是使用 PWM 和低通滤波器来创建纯 440Hz 正弦波的量化版本。这可以通过使用定时器来改变 PWM 的占空比和使用低通滤波器来隔离 PWM 的直流分量来实现。用软件实现其实并不难。第一步是获取 440Hz 正弦波并将其转换为无符号 8 位值数组。我已经为你做了这个,所以你可以定义一个 8 位无符号整数数组,如下所示:

uint8_t wave[] = { 
0x13, 0x00, 0x00, 0x00,
0x80, 0xab, 0xd1, 0xee,
0xfd, 0xfe, 0xf0, 0xd4,
0xaf, 0x84, 0x58, 0x31,
0x13, 0x03, 0x01, 0x0d,
0x28, 0x4d, 0x77
};

正弦波以 8000Hz 的频率采样,因此为了使用 PWM 重新创建正弦波,您需要设置一个每秒触发 8000 次中断的计时器。该中断负责将 PWM 的占空比更改为正弦波阵列中的下一个索引,看起来像这样:

ISR(...) {
OCR1A = wave[index++];
if (index == wave_array_length) {
index = 0;
}
}

如果您想要一个使用 PWM 播放音频的真实工作示例。我会发布一个链接(如果我没记错的话,我使用的是 AT90USB647)。

关于c - avr 如何定义 440Hz 的声音?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44137976/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com