当前位置:   article > 正文

STM32 无源蜂鸣器播放音乐(PWM+标准库)_stm32音频 pwm

stm32音频 pwm

1、STM32通过定时器输出PWM的基本原理

注:本图来自江科大

1.1、图中蓝色线---->CNT计数器的计数值,CNT的值通过定时器一直自增,当达到ARR中装载值时清零。

1.2、图中黄色线----->ARR寄存器中的装载值,这个值可以通过TIM_SetAutoreload()函数进行配置

1.3、途中红色线------>CCR寄存器中的装载值,这个值可以通过TIM_SetCompare1()函数进行配置(四个比较通道,不同通道用不同的比较函数)

1.4、通过比较CNT的值和CCR寄存器的值输出高低电平。

2、无源蜂鸣器

无源蜂鸣器:内部不带振荡源,需要控制器提供振荡脉冲才可发声,调整提供振荡脉冲的频率,可发出不同频率的声音。我们可以通过配置ARR寄存器来设置不同的频率,因而发出不同的声音。

3、乐谱中的频率

4、PWM代码部分

  1. #include "stm32f10x.h" // Device header
  2. void PassionBuzzer_Init()
  3. {
  4. RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2,ENABLE); //开启TIM2的时钟
  5. RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE); //开启GPIOA的时钟
  6. //GPIO初始化
  7. GPIO_InitTypeDef GPIO_InitStructure;
  8. GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
  9. GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0;
  10. GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  11. GPIO_Init(GPIOA,&GPIO_InitStructure);
  12. TIM_InternalClockConfig(TIM2);
  13. TIM_TimeBaseInitTypeDef TIM_TimeBaseInitStructure; //配置时基单元
  14. TIM_TimeBaseInitStructure.TIM_ClockDivision = TIM_CKD_DIV1; //此参数用于配置滤波器时钟,不影响时基单元功能
  15. TIM_TimeBaseInitStructure.TIM_CounterMode = TIM_CounterMode_Up; //向上计数
  16. TIM_TimeBaseInitStructure.TIM_Period = 1000-1; // 72M/72/1000=1000Hz,也就是1ms
  17. TIM_TimeBaseInitStructure.TIM_Prescaler = 72-1; //分频器,对TIM2时钟周期进行分频
  18. TIM_TimeBaseInitStructure.TIM_RepetitionCounter = 0; //重复计数器,高级定时器才会用到
  19. TIM_TimeBaseInit(TIM2,&TIM_TimeBaseInitStructure);
  20. TIM_OCInitTypeDef TIM_OCInitStructure;
  21. TIM_OCStructInit(&TIM_OCInitStructure); //结构体整体初始化,赋予默认值,然后对需要的变量进行配置
  22. TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1; //选择模式,总共8种模式
  23. TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_Low; //输出的极性选择,若选择极性为低,则输出高低电平取反
  24. TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable; //输出状态使能
  25. TIM_OCInitStructure.TIM_Pulse = 500-1; //初始化CCR的值,设置占空比为50%
  26. TIM_OC1Init(TIM2, &TIM_OCInitStructure);
  27. TIM_ARRPreloadConfig(TIM2,ENABLE); //AAR寄存器使能
  28. TIM_OC1PreloadConfig(TIM2,TIM_OCPreload_Enable); //使能TIM2在CCR1上的预装载寄存器
  29. TIM_Cmd(TIM2,ENABLE); //运行控制
  30. }
  31. void PassionBuzzer_Set_Freq_Duty(uint16_t freq,uint16_t duty)
  32. {
  33. TIM_SetAutoreload(TIM2,1000000/freq -1); //根据频率设置加载值
  34. TIM_SetCompare1(TIM2,(1000000/freq-1)*duty/100); //设置占空比
  35. }

这里我们找来一首孤勇者来进行测试,孤勇者乐理代码地址:

https://github.com/Lesterbor/GuYongZhe_PassiveBuzzer_STM32

下载后打开,并将这两个文件移植到我们的工程里面。

将里面的代码改成自己刚才实现的代码就好了。

主函数里调用MUSIC_Analysis()就可以欣赏孤勇者了~~~

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/IT小白/article/detail/756582
推荐阅读
相关标签
  

闽ICP备14008679号