国产免费AV|泡泡玛特欧洲总部将设在伦敦|中文天堂网www新版资源在线|一本久道综合在线中文|国精产品一二三产区的使用方法|香蕉鱼在线观看|www.27eee
ELEOK
標題:
STM32用DAC播放WAV數據源程序 效果很好
[打印本頁]
作者:
路漫漫
時間:
2020-5-15 00:16
標題:
STM32用DAC播放WAV數據源程序 效果很好
編譯運行很好,接在擴音機上,8000HZ的量化噪聲也沒有聽到。
KEIL5下編譯,PA5口聲音輸出,可以用一根線連接在蜂鳴器口上。
源程序如下:
#include "system.h"
#include "SysTick.h"
#include "led.h"
#include "usart.h"
#include "key.h"
#include "dac.h"
/*******************************************************************************
* 函 數 名 : main
* 函數功能 : 主函數
* 輸 入 : 無
* 輸 出 : 無
*******************************************************************************/
int main()
{
u8 i=0;
u8 key;
int dac_value=0;
u16 dacval;
float dac_vol;
SysTick_Init(72);
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2); //中斷優先級分組 分2組
LED_Init();
USART1_Init(9600);
KEY_Init();
DAC1_Init();
TIM4_Init(257,35-1); //72000000/257/35=8000
while(1)
{
key=KEY_Scan(0);
if(key==KEY_UP)
{
dac_value+=400;
if(dac_value>=4000)
{
dac_value=4095;
}
DAC_SetChannel2Data(DAC_Align_12b_R,dac_value);
}
else if(key==KEY_DOWN)
{
dac_value-=400;
if(dac_value<=0)
{
dac_value=0;
}
DAC_SetChannel2Data(DAC_Align_12b_R,dac_value);
}
i++;
if(i%20==0)
{
led1=!led1;
}
if(i%50==0)
{
dacval=DAC_GetDataOutputValue(DAC_Channel_2);
dac_vol=(float)dacval*(3.3/4096);
printf("輸出DAC電壓值為%.2fV\r\n",dac_vol);
}
delay_ms(10);
}
}
復制代碼
完整代碼見附件:
stm32 DAC數模wav源碼.zip
(461.67 KB, 售價: 1 E幣)
2020-5-15 00:16 上傳
點擊文件名下載附件
售價: 1 E幣
[記錄]
[
購買
]
用呼吸燈例程改的WAV音頻文件播放,音量大的時候有破音,原因何在?
8000HZ采樣率8位音頻。
我設置定時器用(計數器自動重裝值=125,分頻=72),也就是72000000/72/125=8000。
查資料,原來PWM沒有自己單獨的時鐘,而是共用定時器時鐘,也就是72000000/72=1000000
這樣在每一秒鐘8000次的中斷中,每一次中斷只能得到125個時鐘,就是說脈寬只用125個等級,我們8位音頻有250個等級,這就造成了消頂失真。
解決辦法是,減少分頻,保證定時器計數器自動重裝值為256*8000,即是每次計時中斷有256個計數。
歡迎光臨 ELEOK (http://m.afoofa.cn/)
Powered by Discuz! X5.0