编译运行很好,接在扩音机上,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币)
用呼吸灯例程改的WAV音频文件播放,音量大的时候有破音,原因何在?
8000HZ采样率8位音频。
我设置定时器用(计数器自动重装值=125,分频=72),也就是72000000/72/125=8000。
查资料,原来PWM没有自己单独的时钟,而是共用定时器时钟,也就是72000000/72=1000000
这样在每一秒钟8000次的中断中,每一次中断只能得到125个时钟,就是说脉宽只用125个等级,我们8位音频有250个等级,这就造成了消顶失真。
解决办法是,减少分频,保证定时器计数器自动重装值为256*8000,即是每次计时中断有256个计数。
【必读】版权免责声明
1、本主题所有言论和内容纯属会员个人意见,与本论坛立场无关。2、本站对所发内容真实性、客观性、可用性不做任何保证也不负任何责任,网友之间仅出于学习目的进行交流。3、对提供的数字内容不拥有任何权利,其版权归原著者拥有。请勿将该数字内容进行商业交易、转载等行为,该内容只为学习所提供,使用后发生的一切问题与本站无关。 4、本网站不保证本站提供的下载资源的准确性、安全性和完整性;同时本网站也不承担用户因使用这些下载资源对自己和他人造成任何形式的损失或伤害。 5、本网站所有软件和资料均为网友推荐收集整理而来,仅供学习用途使用,请务必下载后两小时内删除,禁止商用。6、如有侵犯你版权的,请及时联系我们(电子邮箱1370723259@qq.com)指出,本站将立即改正。
|