你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

【经验分享】STM32驱动压电式蜂鸣器发出和弦音原理图加程序

[复制链接]
STMCU小助手 发布时间:2022-4-21 21:31
一、原理图

20201013090026800.jpg

一、驱动代码


  1. #include "beep.h"



  2. void beep_init(void)
  3. {
  4.         GPIO_InitTypeDef  GPIO_InitStructure;

  5.         RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE);         //使能GPIOB端口时钟

  6.         GPIO_InitStructure.GPIO_Pin = GPIO_Pin_8;                                 //BEEP-->PB.8 端口配置
  7.         GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;                  //推挽输出
  8.         GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;         //速度为50MHz
  9.         GPIO_Init(GPIOB, &GPIO_InitStructure);         //根据参数初始化GPIOB.8

  10.         GPIO_ResetBits(GPIOB,GPIO_Pin_8);//输出0,关闭蜂鸣器输出
  11. }

  12. void beep_pwm_Init(u16 arr,u16 psc)
  13. {  
  14.         GPIO_InitTypeDef GPIO_InitStructure;
  15.         TIM_TimeBaseInitTypeDef  TIM_TimeBaseStructure;
  16.         TIM_OCInitTypeDef  TIM_OCInitStructure;
  17.         

  18.         RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM4, ENABLE);        //使能定时器3时钟
  19.          RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB  | RCC_APB2Periph_AFIO, ENABLE);  //使能GPIO外设和AFIO复用功能模块时钟
  20.         
  21. //        GPIO_PinRemapConfig(GPIO_PartialRemap_TIM4, ENABLE); //Timer3部分重映射  TIM3_CH2->PB5   

  22.    //设置该引脚为复用输出功能,输出TIM4 CH2的PWM脉冲波形        GPIOB.5
  23.         GPIO_InitStructure.GPIO_Pin = GPIO_Pin_7; //TIM_CH2
  24.         GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;  //复用推挽输出
  25.         GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  26.         GPIO_Init(GPIOB, &GPIO_InitStructure);//初始化GPIO

  27.    //初始化TIM4
  28.         TIM_TimeBaseStructure.TIM_Period = arr; //设置在下一个更新事件装入活动的自动重装载寄存器周期的值
  29.         TIM_TimeBaseStructure.TIM_Prescaler =psc; //设置用来作为TIMx时钟频率除数的预分频值
  30.         TIM_TimeBaseStructure.TIM_ClockDivision = 0; //设置时钟分割:TDTS = Tck_tim
  31.         TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;  //TIM向上计数模式
  32.         TIM_TimeBaseInit(TIM4, &TIM_TimeBaseStructure); //根据TIM_TimeBaseInitStruct中指定的参数初始化TIMx的时间基数单位
  33.         
  34.         //初始化TIM3 Channel2 PWM模式         
  35.         TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM2; //选择定时器模式:TIM脉冲宽度调制模式2
  36.          TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable; //比较输出使能
  37.         TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High; //输出极性:TIM输出比较极性高
  38.         TIM_OC2Init(TIM4, &TIM_OCInitStructure);  //根据T指定的参数初始化外设TIM3 OC2

  39.         TIM_OC2PreloadConfig(TIM4, TIM_OCPreload_Enable);  //使能TIM3在CCR2上的预装载寄存器

  40.         TIM_Cmd(TIM4, ENABLE);  //使能TIM3
  41.         

  42. }


  43. /*******************************************************************************
  44. k07样板  2     2.2    2.4
  45. db_pwm  69      65      62      59      56      54    50     43         41                                                  
  46. fxx     1.8k    1.9k    2.0k    2.1k    2.2k    2.3k  2.47K  2.86K      3K
  47. *******************************************************************************/



  48. /*******************************************************************************
  49. k07样板  2     2.46    3
  50. db_pwm  69      65      62      59      56      54    50     43         41                                                  
  51. fxx     1.8k    1.9k    2.0k    2.1k    2.2k    2.3k  2.47K  2.86K      3K
  52. *******************************************************************************/

  53. #define     F1      486                                                                  //2.057 KHZ
  54. #define     F1PSC      71                                                                  //2.057 KHZ

  55. #define     F2      442                                                                 //2.257 KHZ
  56. #define     F2PSC      71                                                                  //2.257 KHZ

  57. #define     F3      413                                                                  //2.415 KHZ
  58. #define     F3PSC      71                                                                  //2.415 KHZ

  59. #define     F4      464                                                                  //2.15        KHZ
  60. #define     F4PSC      71                                                                  //2.15 KHZ




  61. u16 const db_table_10 [6] = { F1, F1, F2, F2, F3, F3,        };            //底 嗒 帝  开机频率  
  62. u16 const db_table_20 [6] = { 3,  7,  3,         7,  9,  35,        };                //每个频率所用的时间10ms单位
  63. u16 const db_table_psc0 [6] = { F1PSC,F1PSC,  F2PSC,         F2PSC,  F3PSC,  F3PSC,        };                //每个频率所用的时间10ms单位

  64. u16 const db_table_11 [6] = { F3, F3, F2, F2, F1, F1,        };            //帝 嗒  底         关机频率
  65. u16 const db_table_21 [6] = { 3,  7,  3,  7,  9,  35,        };          //每个频率所用的时间10ms单位
  66. u16 const db_table_psc1 [6] = { F3PSC,  F3PSC,  F2PSC,  F2PSC,  F1PSC,  F1PSC,        };          //每个频率所用的时间10ms单位

  67. u16 const db_table_12 [2] = { F4, F4,         };                           //帝         按键频率
  68. u16 const db_table_22 [2] = { 8,  35,         };                                    //每个频率所用的时间10ms单位   
  69. u16 const db_table_psc2 [2] = { F4PSC,  F4PSC,         };                                    //每个频率所用的时间10ms单位

  70. u16 const db_table_13 [4] = { F3, F3, F2, F2,         };                    //底 嗒        上电模式频率
  71. u16 const db_table_23 [4] = { 3,  20, 7,  60,        };                                //每个频率所用的时间10ms单位
  72. u16 const db_table_psc3 [4] = { F3PSC,  F3PSC, F2PSC,  F2PSC,        };                                //每个频率所用的时间10ms单位

  73. u16 const db_table_14 [16] = { F3, F3, F3, F3, F3, F3, F3, F3, F3, F3, F3, F3, F3, F3, F3, F3,        };         //测试模式 加速模式
  74. u16 const db_table_24 [16] = { 3,  18, 3,  18, 3,  18, 3,  18, 3,  18, 3,  18, 3,  18, 3,  18,        };        //每个频率所用的时间10ms单位
  75. u16 const db_table_psc4 [16] = { F3PSC,  F3PSC, F3PSC,  F3PSC, F3PSC,  F3PSC, F3PSC,  F3PSC, F3PSC,  F3PSC, F3PSC,  F3PSC, F3PSC,  F3PSC, F3PSC,  F3PSC,        };        //每个频率所用的时间10ms单位

  76. u8  const size_table1x []=
  77. {
  78.         (sizeof (db_table_10)) / (sizeof (db_table_10[0])),                                                                                         //求数组字节总数
  79.         (sizeof (db_table_11)) / (sizeof (db_table_11[0])),
  80.         (sizeof (db_table_12)) / (sizeof (db_table_12[0])),
  81.         (sizeof (db_table_13)) / (sizeof (db_table_13[0])),
  82.         (sizeof (db_table_14)) / (sizeof (db_table_14[0])),
  83. };
  84. /******************************************************************************/


  85. //================================================
  86. //                        使能蜂鸣器函数
  87. //================================================

  88. u16   
  89.         buz_musc_fz,                                                                //赋数组的频率
  90.         buz_fz_timer,                                                                //赋数组每个频率的时间
  91.         buz_kong_timer;                                                                //防止响蜂鸣超时
  92. u8                 
  93.         buz_musc_type,                                                                //选择使用蜂鸣类型        0=开机音 1=关机音        2=按键音        3=上电音        4=测试音                                                
  94.         buz_musc_num,                                                                //决定选择数组的第几位
  95.         buz_musc_len,                                                                //赋数组字节总位数                                                
  96.         buz_musc_read_type;                                                        // 蜂鸣类型        1=开机声        2=关机声        3=按键声        4=上电声        5=加速测试声

  97. u8 F_buz_start,buzzer_flag;

  98. u16 timerPsc;
  99. void start_musc (u8 _musc_nm)
  100. {
  101.         buz_musc_read_type = 0;
  102.         
  103.         buz_musc_fz = 0;                                                                                                // 所有变量清0
  104.         buz_fz_timer = 0;
  105.         buz_musc_type = 0;
  106.         buz_musc_num = 0;
  107.         buz_musc_len = 0;
  108.         buzzer_flag = 0;
  109.         
  110.         
  111.         buz_musc_type = _musc_nm;                                                                                 // 蜂鸣声音的类型
  112.         if (buz_musc_type > 4)        { F_buz_start = 0;buz_musc_type = 0; }        // 不使能蜂鸣函数
  113.         else                                        { F_buz_start = 1; }                                        // 开始使能蜂鸣函数
  114.         
  115.         close_beep();                                                                                                // 关闭蜂鸣器电源脚输出
  116.         disable_beep_pwm();                                                                                        // 关闭蜂鸣器PWM输出        

  117.         buz_kong_timer = 0;                                                                                                // 响蜂鸣超时清0
  118. }


  119. //================================================
  120. //                        使能蜂鸣器函数
  121. //================================================

  122. void musc_scan (void)
  123. {
  124.         //===========================================================  开始
  125.         if (F_buz_start)
  126.         {        
  127.                 //======================================================== 无蜂鸣时间
  128.                 if (buz_fz_timer == 0)
  129.                 {
  130.                         switch (buz_musc_type)                                                                                 //蜂鸣声音的类型
  131.                         {
  132.                                 case 0:
  133.                                                 buz_musc_fz = db_table_10 [buz_musc_num];                //赋频率
  134.                                                 buz_fz_timer = db_table_20 [buz_musc_num];                //赋频率所需的时间                                
  135.                                                 timerPsc=db_table_psc0[buz_musc_num];
  136.                                                 break;
  137.                                 case 1:
  138.                                                 buz_musc_fz = db_table_11 [buz_musc_num];
  139.                                                 buz_fz_timer = db_table_21 [buz_musc_num];                                       
  140.                                                 timerPsc=db_table_psc1[buz_musc_num];
  141.                                                 break;
  142.                                 case 2:
  143.                                                 buz_musc_fz = db_table_12 [buz_musc_num];
  144.                                                 buz_fz_timer = db_table_22 [buz_musc_num];                                       
  145.                                                 timerPsc=db_table_psc2[buz_musc_num];
  146.                                                 break;
  147.                                 case 3:
  148.                                                 buz_musc_fz = db_table_13 [buz_musc_num];
  149.                                                 buz_fz_timer = db_table_23 [buz_musc_num];                                       
  150.                                                 timerPsc=db_table_psc3[buz_musc_num];
  151.                                                 break;
  152.                                 case 4:
  153.                                                 buz_musc_fz = db_table_14 [buz_musc_num];
  154.                                                 buz_fz_timer = db_table_24 [buz_musc_num];                                       
  155.                                                 timerPsc=db_table_psc4[buz_musc_num];
  156.                                                 break;                                                
  157.                         }

  158.                         //装载 pwm1蜂鸣器        周期与占空比        
  159.                         
  160.                         beep_pwm_Init(buz_musc_fz,timerPsc);
  161.                         TIM_SetCompare2(TIM4, buz_musc_fz/2);
  162.                 //        enable_beep_pwm();
  163.                                        
  164.                         
  165.                         if (buz_musc_num & 0x01)        { close_beep(); }                                //数组单数就关闭蜂鸣电源脚
  166.                         else                                                { open_beep(); }                                //数组双数就打开蜂鸣电源脚
  167.                         buz_musc_len = size_table1x [buz_musc_type];                                //计算数组的总字节数
  168.                 }
  169.                 //======================================================== 无蜂鸣时间 end
  170.                
  171.                 //======================================================== 有蜂鸣时间
  172.                 if (buz_fz_timer)
  173.                 {
  174.                         buz_fz_timer--;                                                                                                                //每个蜂鸣频率的时间减减
  175.                         if (buz_fz_timer == 0)        
  176.                         {
  177.                                 buz_musc_num++;
  178.                                 if (buz_musc_num >= buz_musc_len)                                                                //与数组字节相等就结束
  179.                                 {
  180.                                         start_musc (5);                                                                                                // 其它关闭蜂鸣PWM及变量清0        
  181.                                 }
  182.                         }
  183.                 }
  184.                 //======================================================= 有蜂鸣时间 end
  185.         }
  186.         else
  187.         {
  188.                 close_beep();                // 关闭蜂鸣器电源脚输出
  189.                 disable_beep_pwm();        // 关闭蜂鸣器PWM输出
  190.         }
  191.         //===========================================================结束
  192. }

  193. //================================================
  194. //                        扫描使能蜂鸣器函数
  195. //================================================

  196. void musc_select_num_scan (void)
  197. {
  198.         switch (buz_musc_read_type)
  199.         {
  200.                 case 1:        start_musc (0);                break;                // 开机蜂鸣               
  201.                 case 2:        start_musc (1);                break;                // 关机蜂鸣               
  202.                 case 3:        start_musc (2);                break;                // 按键蜂鸣        
  203.                 case 4:        start_musc (3);                break;                // 上电蜂鸣               
  204.                 case 5:        start_musc (4);                break;                // 加速蜂鸣        
  205.                 default:
  206.                                 if (F_buz_start)
  207.                                 {
  208.                                         if (++buz_kong_timer > 1000)        // 如果响蜂鸣超过了10sec
  209.                                         {
  210.                                                 start_musc (5);                                // 其它关闭蜂鸣PWM及变量清0               
  211.                                         }
  212.                                 }
  213.                                 else { buz_kong_timer = 0; }
  214.                                 break;                                                
  215.         }
  216. }
复制代码

主函数中调用

  1. int main(void)
  2. {        
  3.         u8 i,led=0x00;
  4.         delay_init();        
  5.         program_led_init();        
  6.         can_led_init();
  7.         rs485_led_init();
  8.         beep_init();
  9.         while(1)
  10.         {        

  11.                 i++;
  12.                 if(i>=100)
  13.                 {
  14.                         i=0;
  15.                         led=~led;
  16.                         buz_musc_read_type=1;
  17.                         program_led_data(0x00,led-0xf0,0x00);        
  18.                 }


  19.                         
  20.                 musc_select_num_scan ();                                                // 蜂鸣
  21.                 musc_scan ();
  22.                 delay_ms(10);
  23.         }
  24. }
复制代码


收藏 评论0 发布时间:2022-4-21 21:31

举报

0个回答

所属标签

相似分享

官网相关资源

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
STM32N6 AI生态系统
STM32MCU,MPU高性能GUI
ST ACEPACK电源模块
意法半导体生物传感器
STM32Cube扩展软件包
关注我们
st-img 微信公众号
st-img 手机版