随言:
STM32CubeIDE Audio播放音频,DAC + TIM + DMA STM32CubeIDE Audio播放音频,DAC + TIM + DMA_sudaroot的博客-CSDN博客
STM32CubeIDE Audio播放音频,PWM + TIM STM32CubeIDE Audio播放音频,PWM + TIM_sudaroot的博客-CSDN博客
STM32CbueIDE Audio播放音频 WM8978 + I2S STM32CbueIDE Audio播放音频 WM8978 + I2S_sudaroot的博客-CSDN博客_wm8978全双工
STM32CubeIDE Audio播放音频 WM8978 + I2S + DMA双缓存模式 STM32CubeIDE Audio播放音频 WM8978 + I2S + DMA双缓存模式_sudaroot的博客-CSDN博客
STM32CubeIDE USB Audio声卡 WM8978 + I2S STM32CubeIDE USB Audio声卡 WM8978 + I2S_sudaroot的博客-CSDN博客
先去看《STM32CubeIDE Audio播放音频,DAC + TIM + DMA》这文章,有些内部重复的将跳过,毕竟我懒。
参考官方文档:《AN2394 Application note STR7/STR9 audio generation with PWM》
链接:STR7STR9audiogenerationwithPWM.pdf_stm32pwm语音-其它文档类资源-CSDN下载
VoiceBandAudioPlaybackUsingaPWMDACDesign.pdf-其它文档类资源-CSDN下载
框架图:
在选择低通滤波器的截止频率时涉及多个设计注意事项。
首先,滤波器的截止频率必须比PWM频率低得多,以减少PWM开关产生的噪声。
通常,截止频率为10倍的PWM频率就足够了。但是,滤波器的截止频率对于输出音频的带宽至关重要。
另外,将使用的任何滤波器的截止频率设置为采样回放频率的一半。由于在此应用中支持不同的采样率(8000/11025/22050/44100 Hz),因此我们必须考虑较低采样率带来的带宽限制。从硬件的角度来看,较高的PWM频率更容易过滤,但它对应较小的重载值,因此会导致较低的分辨率。
相比之下,较小的PWM频率很难滤波。此外,下限由数据输入速率决定。结合该准则,滤波器截止频率设置为4 kHz。这样可确保几乎所有音频频谱都通过,但PWM载波被去除了。 R和C的值通过以下公式计算:
其中f是滤波器的截止频率。
它将配置TIM0和TIM3定时器。TIM3被编程为产生125.5kHz PWM信号,而TIM0被编程为产生频率等于.WAV文件采样率值的中断。
注意:由于TIM3 OCBR值固定为255,因此可以达到的最大PWM频率为125.5kHz。
随言:
首先看看采样频率和位深需要计时器频率的关系如下表格
将用2个定时器,一个用于产生方波,另一个用于匹配音频的采样率改变PWM。我用的还是8bit 16KHz的音频。
硬件:STM32F407ZG + RC低通滤波 + 功放模块 + 喇叭
STM32CubeIDE:
首先配置TIM6。使用TIM6为产生频率等于.WAV文件采样率值的中断。由于我使用的音频为16KHz,
计算 1s / 16K = 0.0000625s = 62.5us。即每62.5us中断改变TIM2_CHANNEL1 PWM。
TIM6的时钟是84MHz,分频系数42,故当前时钟为2MHz,向上计数一次为0.5us,计数值设为125,即可满足62.5us触发中断。
由于低通RC滤波截止频率是4KHz,PWM频率在截止频率的10倍以上就行了,
我设置PWM的频率为164KHz,84MHz / 2 / 256 = 164.06KHz.
代码:其中data是音频数据。
uint32_t DataLength = 0;
uint8_t* DataAddress = NULL;
void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim)
{
if(htim->Instance == TIM6)
{
TIM2->CCR1 = *DataAddress;
DataLength--;
DataAddress++;
if(DataLength == 0)
{
HAL_TIM_Base_Stop_IT(&htim6);
HAL_TIM_PWM_Stop(&htim2, TIM_CHANNEL_1);
}
}
}
int main(void)
{
HAL_Init();
SystemClock_Config();
MX_GPIO_Init();
MX_TIM2_Init();
MX_TIM6_Init();
MX_USART1_UART_Init();
DataLength = sizeof(data) - 0x2c;
DataAddress = (uint8_t*)(data + 0x2c);
HAL_TIM_Base_Start_IT(&htim6);
HAL_TIM_PWM_Start(&htim2, TIM_CHANNEL_1);
while (1)
{
}
}
STM32CubeIDE Audio播放音频,PWM + TIM
源码:PWMAudio3.rar_stm32pwm语音-其它文档类资源-CSDN下载
效果演示B站链接:STM32CubeIDE Audio播放音频,PWM + TIM_哔哩哔哩_bilibili
全篇完。
本人是一个嵌入式未入门小白,博客仅仅代表我个人主观见解,记录成长笔记。
笔记是以最简单的方式,只展示最核心的原理。
若有与 大神大大 见解有歧义,我绝对坚信 大神大大 见解是对的,我的是错的。
若无积分等无法下载源码,可加入QQ群657407920下载交流经验。感谢~!