找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索

改写一篇STM32 PWM单声驱动蜂鸣器播放音乐程序

查看数: 5369 | 评论数: 3 | 收藏 1
关灯 | 提示:支持键盘翻页<-左 右->
    组图打开中,请稍候......
发布时间: 2020-3-27 17:03

正文摘要:

先上一下STM32的流程图,几个名词了解一下,CNT:计时器,系统时钟分频而来72M,ARR寄存器:A(重装载寄存器),CCR(比较/捕获计时器)N,图上标错了,设置TIMx相关参数(主要就是N的值,为了保证50%占空比,所以A ...

回复

ID:581602 发表于 2020-3-27 17:11

这部分是我改写的,原作者写的很乱
//蜂鸣器发出指定频率的声音
//usFreq是发声频率,取值 (人耳可听20Hz-20KHz)

void buzzerSound(unsigned short usFreq)         
{
  GPIO_InitTypeDef  GPIO_InitStructure;
  unsigned long  ulVal;
  if((usFreq<=20)||(usFreq>20000))//次音和超声过滤
  {
    buzzerQuiet();// 蜂鸣器静音
  }
  else
  {
        GPIO_PinRemapConfig(GPIO_PartialRemap_TIM3, ENABLE); //Timer3部分重映射  TIM3_CH2->PB5   
     //设置该引脚为复用输出功能,输出TIM3 CH2的PWM脉冲波形        GPIOB.5
        GPIO_InitStructure.GPIO_Pin = GPIO_Pin_5; //TIM_CH2
        GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;  //复用推挽输出
        GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
        GPIO_Init(GPIOB, &GPIO_InitStructure);//初始化GPIO          
               
        ulVal=7200000/usFreq;//声音频率                        //主频是72M不分频,原作者是8M
        TIM3->ARR =2*ulVal ;        //设置自动重装载寄存器  A  的值        ,原作者是        ulVal                                                                                                //ulVal

        TIM_SetCompare2(TIM3,ulVal);//TIM3比较/捕获寄存器 N 重设置为                                                                                //原作者是ulVal /2,保证50%占空比 ->A=2N
        TIM_Cmd(TIM3, ENABLE);  //启动TIM3
//IO输出  为 周期 T = (N+1)*系统时钟分频 {即倒数为输入声波的方波}  的方波。N=ulVal /2
  }  
}

ID:581602 发表于 2020-3-27 17:07

        // 低音频率
#define L1 262
#define L2 294
#define L3 330
#define L4 349
#define L5 392
#define L6 440
#define L7 494

// 中音频率
#define M1 523
#define M2 587
#define M3 659
#define M4 698
#define M5 784
#define M6 880
#define M7 988

// 高音频率
#define H1 1047
#define H2 1175
#define H3 1319
#define H4 1397
#define H5 1568
#define H6 1760
#define H7 1976

ID:581602 发表于 2020-3-27 17:06
主函数主要是初始化延时函数和初始化TIM3
int main(void)
{
       

        delay_init();//

        TIM3_PWM_Init(14399,0);         //TIM3预分频系数为0,72M/0+1=72M,不分频

       
        while(1)
        {
        musicPlay();
//        LED=!LED;
        delay_ms(50);
        }

}

小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

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