首页 | 新闻 | 新品 | 文库 | 方案 | 视频 | 下载 | 商城 | 开发板 | 数据中心 | 座谈新版 | 培训 | 工具 | 博客 | 论坛 | 百科 | GEC | 活动 | 主题月 | 电子展
返回列表 回复 发帖

NucleoF429 基础应用2:PWM语音播放-1

NucleoF429 基础应用2:PWM语音播放-1

标题中点赞拿Nucleo开发板的事放到最后的广告时间,现在先来看看NucleoF429 怎么播放语音?(事实上大部分MCU都可以实现语音播放)


下面是一段音频数据的波形
局部放大图:
以一定的速度采样(ADC)这些波形进行存储,就是音频数据了,所以播放就是按原来采样的速率再用DAC输出对应的数据即可。
这里的音频有两个主要的参数,采样速率和采样位数。
采样速率:指1s中采样多少个数据点,比如1s种采集16000个点,那么采样率就是16KHz。采样速率越高,越能抓到频率较高的声音,比如CD的采样率就是44.1KHz,确保人耳能听到的声音都会被抓到。
采样位数:指音频幅度最大值与最小值分为了多少阶,比如满幅度是3.3V,如果是8Bit位数,那么每一阶就是3.3V/256 = 12.89mv,采样位数越高,声音细节越好。所以采样速率和位数越高,声音还原越逼真,但存储的数据量也越大,一首三四分钟的歌曲,如果不采用编码按原始波形数据存储,数据量有好几十兆大小,这涉及到音频编码的问题,这里不展开讲了,有兴趣的同学可以找相关资料。
接下来看怎么播放,最简单的当然是把采样(ADC)的数据按原样输出(DAC)了。但我们有些芯片本身不带有DAC,所以只能用PWM代替DACPWM即脉冲宽度调制。这里只需要把DAC的幅度值转换成PWM的占空比即可,例如16KHz 8Bit的声音转换成16Khz 256阶占空比的PWM。但有一个问题,如果用16KHzPWM播放语音,声音是可以播放,但有一个16Khz的谐波存在,这个声音会被人耳听到,所以需要更高频率的PWM,数据还是按照16Khz更新。
我这里使用32KHzPWM,用16KHz 8Bit PCM格式的音频数据,8Bit的数据对应一个Byte16KHz采样,1秒种占用存储空间就是16K ByteF4292M ByteFlash存储空间,理论上可以存储2048K/16K = 128秒的音频。下面是用NucleoF429实现音频播放的具体过程:
一、配置PWM
1、用STM32CubeMx建立工程,配置两个定时器TIM1TIM2TIM用于PWM产生,TIM2用于16KHz数据更新。
TIM1选择PWM互补输出(单通道也可以),将PE8PE9复用为PWMNPWMP
TIM1在APB2总线上,TIM2APB1总线上

所以TIM1TIM2的时钟频率分别为180M90M,系统时钟用HSE输入的8MHz
TIM1设置为32KHz,即31.25us8Bit占空比,一个LSB31.25us / 256 = 0.1220703125us = 8.192MHzTIM1 180M / 8.192M = 21.97265625,这里取整数22。所以实际的PWM频率为1/180 / 22*256 =  31.289us = 31.96KHz

TIM2 为90MHz45分频后为2MHz0.5us,周期12562.5us = 16KHz
NVIC开启TIM2中断。生成工程名和目录后生成Keil工程。
返回列表