STM32F103C8如何将8kHz音频采样率提升至11kHz或16kHz
采样率调整方法
你的音频采样率完全由TIM3的计数间隔决定,当前8kHz的配置逻辑是TIM3每125μs触发一次ADC采样,修改对应参数即可实现更高采样率:
1. 核心计算公式
STM32F103C8默认TIM3挂载在APB1总线,若你使用默认72MHz系统时钟,TIM3的工作时钟为72MHz,采样率计算公式为:采样率Fs = 72000000 / ( (预分频值PSC + 1) * (自动重装值ARR + 1) )
2. 具体修改步骤
- 修改采样长度宏定义:要存储1秒的音频数据,11kHz采样将
#define SAMP 8000改为#define SAMP 11025,16kHz采样改为#define SAMP 16000 - 调整TIM3配置参数:
- 16kHz采样参考配置:
htim3.Init.Prescaler = 9-1,htim3.Init.Period = 500-1,代入公式计算得72M/(9*500)=16000Hz,无误差 - 11.025kHz采样参考配置:
htim3.Init.Prescaler = 2-1,htim3.Init.Period = 3265-1,计算得72M/(2*3265)≈11025Hz,误差小于0.01%,完全满足普通音频需求
- 16kHz采样参考配置:
- 修改采样触发判断阈值:把代码里
while((__HAL_TIM_GET_COUNTER(&htim3))<124)的124改为你设置的ARR值(比如16kHz就改成499,11kHz就改成3264)
3. 注意事项
- 不要把大容量采样数组定义在main函数的栈空间里:STM32F103C8只有20KB RAM,16kHz采样的uint16数组占32KB,超出栈容量会跑飞,建议把
uint16_t dat[SAMP]改成全局变量,或者缩短采样时长(比如采0.5秒就把SAMP设为8000) - 现有串口输出逻辑要调整:你当前每发一个采样值加1ms延迟,16000个点发完需要16秒,建议去掉
HAL_Delay(1),同时把串口波特率调高到115200以上,避免输出速度跟不上采样速度 - ADC转换速度足够支撑16kHz采样:STM32F1的ADC单次转换最长仅需1.17μs,远小于16kHz对应的62.5μs采样间隔,无需调整ADC配置
// 16kHz采样修改后的核心代码示例 #define SAMP 16000 // 采样长度修改为16000对应1秒16kHz采样 // TIM3配置修改 htim3.Instance = TIM3; htim3.Init.Prescaler = 9-1; // 预分频改为9 htim3.Init.CounterMode = TIM_COUNTERMODE_UP; htim3.Init.Period = 500-1; // 自动重装值改为500 htim3.Init.ClockDivision = TIM_CLOCKDIVISION_DIV1; htim3.Init.AutoReloadPreload = TIM_AUTORELOAD_PRELOAD_DISABLE; if (HAL_TIM_Base_Init(&htim3) != HAL_OK) { Error_Handler(); } // 采样触发判断修改 for(k=0;k<SAMP;k++) { while((__HAL_TIM_GET_COUNTER(&htim3))<499); // 阈值改为ARR-1即499 HAL_ADC_Start(&hadc1); HAL_ADC_PollForConversion(&hadc1, HAL_MAX_DELAY); dat[k] = HAL_ADC_GetValue(&hadc1); }
内容的提问来源于stack exchange,提问作者Jason
相关产品推荐
相关产品推荐

