OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 4009|回复: 7

STM32F103RE PWM 播放WAV音频 出现噪音及音色改变

[复制链接]

8

主题

39

帖子

0

精华

初级会员

Rank: 2

积分
190
金钱
190
注册时间
2019-3-17
在线时间
43 小时
发表于 2023-4-3 16:07:53 | 显示全部楼层 |阅读模式
1金钱
PWM初始化
//播放语音时,产生PWM
       
        TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;
        TIM_OCInitTypeDef  TIM_OCInitStructure;
        //
        //TIM_ICInitTypeDef TIM_ICInitStructure;
        //NVIC_InitTypeDef NVIC_InitStructure;
        //
        TIM_DeInit(TIM3);
        RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3,ENABLE);
        //
        /* time3的时钟:72mhz*/
        TIM_TimeBaseStructure.TIM_Prescaler = 0;                           /*预分频值*/
        //
        TIM_TimeBaseStructure.TIM_Period = (PLAY_PWM_CYCLE - 1);           /*重装载值*/
        TIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV1;            /*时钟分频*/
        TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;        /*向上计数*/
        TIM_TimeBaseInit(TIM3,&TIM_TimeBaseStructure);
        TIM_SetCounter(TIM3,0x0000);
        TIM_ARRPreloadConfig(TIM3,ENABLE);
        //
        /* tim3->ch4 */
        TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM2;                   /*PWM2*/   
        TIM_OCInitStructure.TIM_Pulse = PLAY_PWM_CYCLE/2;                                                                /* 50% */
        TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;     /* 指定TIM输出比较状态使能*/
        TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_Low;        /* 指定TIM输出极性低*/
        TIM_OC4Init(TIM3,&TIM_OCInitStructure);
        TIM_OC4PreloadConfig(TIM3,TIM_OCPreload_Enable);
        //
        TIM_ITConfig(TIM3,TIM_IT_CC2,DISABLE);
        //
        DEBUG_STRING("timer3 init ok\r\n");



更新PWm数据TIM初始化
//定时器,PWM,AD采样
        //
        TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;
        TIM_OCInitTypeDef  TIM_OCInitStructure;
        NVIC_InitTypeDef NVIC_InitStructure;
        //
        TIM_DeInit(TIM1);//Deinitializes the TIM1 peripheral registers to their default reset values
        RCC_APB2PeriphClockCmd(RCC_APB2Periph_TIM1,ENABLE);                /* tim1挂在APB2上,最高时钟72mhz */
        //
        /* time1的时钟:8mhz,0.125us */
        TIM_TimeBaseStructure.TIM_Prescaler = TICK_PRESCALER_USE_PLL_12MHZ;//设置用来作为TIMx时钟频率除数的预分频值
        TIM_TimeBaseStructure.TIM_Period = 999;        /* 0-1000:125us *///设置在下一个更新事件装入活动的自动重装载寄存器周期的值
        TIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV1;//设置时钟分割:TDTS = Tck_tim
        TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;//TIM向上计数模式
        TIM_TimeBaseStructure.TIM_RepetitionCounter = 0x00;//指定重复计数器值。 每次RCR递减计数器达到零时,都会产生一个更新事件并从RCR值(N)重新开始计数。
        TIM_TimeBaseInit(TIM1,&TIM_TimeBaseStructure);//根据指定的参数初始化TIMx的时间基数单位
        TIM_SetCounter(TIM1,0x0000);//设置TIMx计数器寄存器值
        TIM_ARRPreloadConfig(TIM1,ENABLE);//启用或禁用ARR上的TIMx外设预加载寄存器。
        //

        // ch4,播放语音时更新数据
        TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_Timing;
        TIM_OCInitStructure.TIM_Pulse = 750;                                                                                /* 62.5us中断一次 */
        TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;
        TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_Low;
        TIM_OC4Init(TIM1,&TIM_OCInitStructure);
        TIM_ClearFlag(TIM1, TIM_FLAG_CC4);
        TIM_ITConfig(TIM1,TIM_IT_CC4,ENABLE);
        //
        NVIC_InitStructure.NVIC_IRQChannel = TIM1_CC_IRQn;
        NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 3;
        NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1; //0-3
        NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
        NVIC_Init(&NVIC_InitStructure);
        //
        DEBUG_STRING("timer1 init ok\r\n");




然后在中断里更新音频数据

正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

8

主题

39

帖子

0

精华

初级会员

Rank: 2

积分
190
金钱
190
注册时间
2019-3-17
在线时间
43 小时
 楼主| 发表于 2023-4-3 16:09:58 | 显示全部楼层
补充说明一下,声音文件为16K 16位PCm音频,声音从女声变成男声
回复

使用道具 举报

10

主题

3281

帖子

1

精华

论坛元老

Rank: 8Rank: 8

积分
8207
金钱
8207
注册时间
2020-5-11
在线时间
3702 小时
发表于 2023-4-3 16:23:43 | 显示全部楼层
本帖最后由 LcwSwust 于 2023-4-3 16:28 编辑

有示波器的话很简单,测一下PWM频率及更新数据频率.
女变男那就是播放慢了,更新数据频率低了."time1的时钟:8mhz",Period = 999,算下来频率是8K才对呀,不是16K.
专治疑难杂症
回复

使用道具 举报

8

主题

39

帖子

0

精华

初级会员

Rank: 2

积分
190
金钱
190
注册时间
2019-3-17
在线时间
43 小时
 楼主| 发表于 2023-4-3 16:56:10 | 显示全部楼层
LcwSwust 发表于 2023-4-3 16:23
有示波器的话很简单,测一下PWM频率及更新数据频率.
女变男那就是播放慢了,更新数据频率低了."time1的时钟: ...

// ch4,播放语音时更新数据
        TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_Timing;
        TIM_OCInitStructure.TIM_Pulse = 749;                                                                                /* 62.5us中断一次 */
        TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;
        TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_Low;
        TIM_OC4Init(TIM1,&TIM_OCInitStructure);
        TIM_ClearFlag(TIM1, TIM_FLAG_CC4);
        TIM_ITConfig(TIM1,TIM_IT_CC4,ENABLE);

非常感谢您,这个通道才是播放音频的计数器,62,.5us,16K的更新频率,我用示波器测量过,频率正常的,感觉是在哪耦合了其他频率进去,还加上了噪音。
回复

使用道具 举报

10

主题

3281

帖子

1

精华

论坛元老

Rank: 8Rank: 8

积分
8207
金钱
8207
注册时间
2020-5-11
在线时间
3702 小时
发表于 2023-4-3 17:06:48 | 显示全部楼层
伴伊云端共舞 发表于 2023-4-3 16:56
// ch4,播放语音时更新数据
        TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_Timing;
         ...

我记得period是表示周期,pulse表示占空比或相位,你再确认一下.
还有个办法是造一段波形让它播放,比如正弦波或锯齿波或方波,看频率对不对.
专治疑难杂症
回复

使用道具 举报

8

主题

39

帖子

0

精华

初级会员

Rank: 2

积分
190
金钱
190
注册时间
2019-3-17
在线时间
43 小时
 楼主| 发表于 2023-4-3 17:16:07 | 显示全部楼层
LcwSwust 发表于 2023-4-3 17:06
我记得period是表示周期,pulse表示占空比或相位,你再确认一下.
还有个办法是造一段波形让它播放,比如正 ...

TIM_OCInitStructure.TIM_Pulse  是载入捕获寄存器,在载入值为设定值时触发载入捕获中断。
回复

使用道具 举报

10

主题

3281

帖子

1

精华

论坛元老

Rank: 8Rank: 8

积分
8207
金钱
8207
注册时间
2020-5-11
在线时间
3702 小时
发表于 2023-4-4 09:28:30 | 显示全部楼层
伴伊云端共舞 发表于 2023-4-3 17:16
TIM_OCInitStructure.TIM_Pulse  是载入捕获寄存器,在载入值为设定值时触发载入捕获中断。

你就让它循环播放这个buf,看看输出波形。
  1. U8 buf[100];
  2. U8 i;
  3. for(i=0;i<100;i++)
  4. buf[i]=i;
复制代码

专治疑难杂症
回复

使用道具 举报

2

主题

474

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
6084
金钱
6084
注册时间
2018-6-27
在线时间
524 小时
发表于 2024-7-2 08:21:33 | 显示全部楼层
谢谢分享,学习学习。
回复

使用道具 举报

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

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2024-11-25 12:01

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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