STM32CubeIDE Audio播放音频,PWM + TIM

论坛 期权论坛 编程之家     
选择匿名的用户   2021-5-21 13:05   102   0

随言:

STM32CubeIDE Audio播放音频,DAC + TIM + DMA https://blog.csdn.net/sudaroot/article/details/106337717
STM32CubeIDE Audio播放音频,PWM + TIM https://blog.csdn.net/sudaroot/article/details/106373388
STM32CbueIDE Audio播放音频 WM8978 + I2S https://blog.csdn.net/sudaroot/article/details/106528371
STM32CubeIDE Audio播放音频 WM8978 + I2S + DMA双缓存模式 https://blog.csdn.net/sudaroot/article/details/106660351
STM32CubeIDE USB Audio声卡 WM8978 + I2S https://blog.csdn.net/sudaroot/article/details/106834893

先去看《STM32CubeIDE Audio播放音频,DAC + TIM + DMA》这文章,有些内部重复的将跳过,毕竟我懒。

参考官方文档:《AN2394 Application note STR7/STR9 audio generation with PWM》

链接:https://download.csdn.net/download/sudaroot/12465885

https://download.csdn.net/download/sudaroot/12465889

框架图:

在选择低通滤波器的截止频率时涉及多个设计注意事项。

首先,滤波器的截止频率必须比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

源码:https://download.csdn.net/download/sudaroot/12466240

效果演示B站链接:https://www.bilibili.com/video/BV1cT4y1g7uj/

本人是一个嵌入式未入门小白,博客仅仅代表我个人主观见解方便记录成长笔记。 若有与大神大大见解有冲突,我坚信大神大大见解是对的,我的是错的。 感谢~!

分享到 :
0 人收藏
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

积分:3875789
帖子:775174
精华:0
期权论坛 期权论坛
发布
内容

下载期权论坛手机APP