找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 4874|回复: 3
打印 上一主题 下一主题
收起左侧

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

[复制链接]
跳转到指定楼层
楼主
先上一下STM32的流程图,几个名词了解一下,CNT:计时器,系统时钟分频而来72M,ARR寄存器:A(重装载寄存器),CCR(比较/捕获计时器)N,图上标错了,设置TIMx相关参数(主要就是N的值,为了保证50%占空比,所以A≈2N{A/(N+1)}),控制TIMx复用的IO的输出方波的频率为声波的频率,即可驱动蜂鸣器发出不同的声音。程序是下载某位的,谁的我也忘了,但是原作者写的有点乱,我就重新改写一下,轻喷,倾删。

51hei图片20200327165438.png (27.06 KB, 下载次数: 79)

定时器流程图

定时器流程图

C8T6 - PWM单音输出.7z

240.7 KB, 下载次数: 89, 下载积分: 黑币 -5

评分

参与人数 1黑币 +50 收起 理由
admin + 50 共享资料的黑币奖励!

查看全部评分

分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏1 分享淘帖 顶 踩
回复

使用道具 举报

沙发
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);
        }

}
回复

使用道具 举报

板凳
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: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
  }  
}

回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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