国产免费AV|泡泡玛特欧洲总部将设在伦敦|中文天堂网www新版资源在线|一本久道综合在线中文|国精产品一二三产区的使用方法|香蕉鱼在线观看|www.27eee

 找回密碼
 注冊(cè)
搜索

STM32用DAC播放WAV數(shù)據(jù)源程序 效果很好

[復(fù)制鏈接]
樓主
路漫漫 發(fā)表于 2020-5-15 00:16:37 | 只看該作者 |倒序?yàn)g覽 |閱讀模式
編譯運(yùn)行很好,接在擴(kuò)音機(jī)上,8000HZ的量化噪聲也沒(méi)有聽(tīng)到。
KEIL5下編譯,PA5口聲音輸出,可以用一根線連接在蜂鳴器口上。

源程序如下:
  1. #include "system.h"
  2. #include "SysTick.h"
  3. #include "led.h"
  4. #include "usart.h"
  5. #include "key.h"
  6. #include "dac.h"


  7. /*******************************************************************************
  8. * 函 數(shù) 名         : main
  9. * 函數(shù)功能                   : 主函數(shù)
  10. * 輸    入         : 無(wú)
  11. * 輸    出         : 無(wú)
  12. *******************************************************************************/
  13. int main()
  14. {
  15.         u8 i=0;
  16.         u8 key;
  17.         int dac_value=0;
  18.         u16 dacval;
  19.         float dac_vol;
  20.       
  21.         SysTick_Init(72);
  22.         NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);  //中斷優(yōu)先級(jí)分組 分2組
  23.         LED_Init();
  24.         USART1_Init(9600);
  25.         KEY_Init();
  26.         DAC1_Init();
  27.         TIM4_Init(257,35-1); //72000000/257/35=8000
  28.       
  29.         while(1)
  30.         {
  31.                 key=KEY_Scan(0);
  32.                 if(key==KEY_UP)
  33.                 {
  34.                         dac_value+=400;
  35.                         if(dac_value>=4000)
  36.                         {
  37.                                 dac_value=4095;
  38.                         }
  39.                         DAC_SetChannel2Data(DAC_Align_12b_R,dac_value);
  40.                 }
  41.                 else if(key==KEY_DOWN)
  42.                 {
  43.                         dac_value-=400;      
  44.                         if(dac_value<=0)
  45.                         {
  46.                                 dac_value=0;
  47.                         }
  48.                         DAC_SetChannel2Data(DAC_Align_12b_R,dac_value);                       
  49.                 }
  50.                
  51.                 i++;
  52.                 if(i%20==0)
  53.                 {
  54.                         led1=!led1;
  55.                 }
  56.                
  57.                 if(i%50==0)
  58.                 {
  59.                         dacval=DAC_GetDataOutputValue(DAC_Channel_2);
  60.                         dac_vol=(float)dacval*(3.3/4096);
  61.                         printf("輸出DAC電壓值為%.2fV\r\n",dac_vol);
  62.                 }
  63.                 delay_ms(10);      
  64.         }
  65. }
復(fù)制代碼
完整代碼見(jiàn)附件: stm32 DAC數(shù)模wav源碼.zip (461.67 KB, 售價(jià): 1 E幣)
用呼吸燈例程改的WAV音頻文件播放,音量大的時(shí)候有破音,原因何在?
8000HZ采樣率8位音頻。
我設(shè)置定時(shí)器用(計(jì)數(shù)器自動(dòng)重裝值=125,分頻=72),也就是72000000/72/125=8000。
查資料,原來(lái)PWM沒(méi)有自己?jiǎn)为?dú)的時(shí)鐘,而是共用定時(shí)器時(shí)鐘,也就是72000000/72=1000000
這樣在每一秒鐘8000次的中斷中,每一次中斷只能得到125個(gè)時(shí)鐘,就是說(shuō)脈寬只用125個(gè)等級(jí),我們8位音頻有250個(gè)等級(jí),這就造成了消頂失真。
解決辦法是,減少分頻,保證定時(shí)器計(jì)數(shù)器自動(dòng)重裝值為256*8000,即是每次計(jì)時(shí)中斷有256個(gè)計(jì)數(shù)。

您需要登錄后才可以回帖 登錄 | 注冊(cè)

本版積分規(guī)則

手機(jī)版|小黑屋|ELEOK |網(wǎng)站地圖

GMT+8, 2026-5-26 05:12

Powered by Discuz! X5.0

© 2001-2026 Discuz! Team.

快速回復(fù) 返回頂部 返回列表