找回密码
 注册

QQ登录

只需一步,快速开始

搜索

STM32用DAC播放WAV数据源程序 效果很好

[复制链接]
路漫漫 发表于 2020-5-15 00:16:37 | 显示全部楼层 |阅读模式
编译运行很好,接在扩音机上,8000HZ的量化噪声也没有听到。
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. * 函 数 名         : main
  9. * 函数功能                   : 主函数
  10. * 输    入         : 无
  11. * 输    出         : 无
  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);  //中断优先级分组 分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. }
复制代码
完整代码见附件: stm32 DAC数模wav源码.zip (461.67 KB, 售价: 1 E币)
用呼吸灯例程改的WAV音频文件播放,音量大的时候有破音,原因何在?
8000HZ采样率8位音频。
我设置定时器用(计数器自动重装值=125,分频=72),也就是72000000/72/125=8000。
查资料,原来PWM没有自己单独的时钟,而是共用定时器时钟,也就是72000000/72=1000000
这样在每一秒钟8000次的中断中,每一次中断只能得到125个时钟,就是说脉宽只用125个等级,我们8位音频有250个等级,这就造成了消顶失真。
解决办法是,减少分频,保证定时器计数器自动重装值为256*8000,即是每次计时中断有256个计数。

您需要登录后才可以回帖 登录 | 注册

本版积分规则

QQ|手机版|小黑屋|ELEOK |网站地图

GMT+8, 2024-11-21 22:30

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

快速回复 返回顶部 返回列表