STM32CubeIDE Audio播放音频,PWM + TIM

随言:

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下载交流经验。感谢~!

 

 

  • 6
    点赞
  • 50
    收藏
    觉得还不错? 一键收藏
  • 7
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 7
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值