[AT32F421] 定时器驱动无源蜂鸣器

[复制链接]
 楼主| 菜鸟的第一步 发表于 2025-2-27 09:21 | 显示全部楼层 |阅读模式
1.蜂鸣器介绍
什么是无源蜂鸣器?

        字面意思就是无"源",内部电路没有直接的震荡源,只是相当于一个扬声器的作用,直接接直流电,输出方波信号才能驱动无源蜂鸣器发声。      

2.驱动代码编写
本 例采用的是AT32F421控制,PB9作为蜂鸣器接口,使用复用定时器17驱动

初始化蜂鸣器:
  1. void Beep_Init(void)
  2. {
  3.     //variable
  4.     tmr_output_config_type tmr_oc_init_structure;
  5.     gpio_init_type gpio_init_struct = {0};
  6.     //tmr_periph_config_type tmr_brkdt_config_struct = {0};
  7.    
  8.     crm_periph_clock_enable(CRM_GPIOB_PERIPH_CLOCK, TRUE );
  9.     crm_periph_clock_enable(CRM_TMR17_PERIPH_CLOCK, TRUE );
  10.    
  11.     gpio_default_para_init(&gpio_init_struct);
  12.     gpio_init_struct.gpio_pins = BEEP_PINS_9;
  13.     gpio_init_struct.gpio_mode = GPIO_MODE_MUX;
  14.     gpio_init_struct.gpio_out_type = GPIO_OUTPUT_PUSH_PULL;
  15.     gpio_init_struct.gpio_pull = GPIO_PULL_NONE;
  16.     gpio_init_struct.gpio_drive_strength = GPIO_DRIVE_STRENGTH_STRONGER;
  17.     gpio_init(GPIOB,&gpio_init_struct);
  18.    
  19.     gpio_pin_mux_config(GPIOB,GPIO_PINS_SOURCE9,GPIO_MUX_2);
  20.     //周期1ms
  21.     tmr_base_init(TMR17,100-1,1200-1);
  22.     tmr_cnt_dir_set(TMR17, TMR_COUNT_UP);
  23.     tmr_clock_source_div_set(TMR17,TMR_CLOCK_DIV1);
  24.    
  25.     //tmr_output_config_type tmr_oc_init_structure;
  26.     tmr_output_default_para_init(&tmr_oc_init_structure);
  27.     tmr_oc_init_structure.oc_mode = TMR_OUTPUT_CONTROL_PWM_MODE_B;
  28.     tmr_oc_init_structure.oc_idle_state = TRUE;
  29.     tmr_oc_init_structure.oc_polarity = TMR_OUTPUT_ACTIVE_HIGH;
  30.     tmr_oc_init_structure.oc_output_state = TRUE;
  31.     tmr_oc_init_structure.occ_output_state = TRUE;
  32.     tmr_oc_init_structure.occ_idle_state = TRUE;
  33.     tmr_oc_init_structure.occ_polarity =TMR_OUTPUT_ACTIVE_HIGH;
  34.    
  35.     tmr_output_channel_config(TMR17, TMR_SELECT_CHANNEL_1, &tmr_oc_init_structure);   
  36.     tmr_channel_value_set(TMR17, TMR_SELECT_CHANNEL_1,0);
  37.    
  38.     //tmr_output_channel_buffer_enable(TMR17,TMR_SELECT_CHANNEL_1,TRUE);
  39.     tmr_period_buffer_enable(TMR17,TRUE);//
  40.    
  41.     tmr_output_enable(TMR17, TRUE);
  42.     tmr_counter_enable(TMR17,TRUE);      
  43. }

  44. void Mcu_Init(void)
  45. {
  46.     /* reset crm */
  47.   crm_reset();

  48.   /* config flash psr register */
  49.   flash_psr_set(FLASH_WAIT_CYCLE_3);

  50.   crm_hick_sclk_frequency_select(CRM_HICK_SCLK_48MHZ);

  51.   crm_clock_source_enable(CRM_CLOCK_SOURCE_HICK, TRUE);

  52.    /* wait till hick is ready */
  53.   while(crm_flag_get(CRM_HICK_STABLE_FLAG) != SET)
  54.   {
  55.   }

  56.   /* config pll clock resource */
  57.   crm_pll_config(CRM_PLL_SOURCE_HICK, CRM_PLL_MULT_30);

  58.   /* enable pll */
  59.   crm_clock_source_enable(CRM_CLOCK_SOURCE_PLL, TRUE);

  60.   /* wait till pll is ready */
  61.   while(crm_flag_get(CRM_PLL_STABLE_FLAG) != SET)
  62.   {
  63.   }

  64.   /* config ahbclk */
  65.   crm_ahb_div_set(CRM_AHB_DIV_1);

  66.   /* config apb2clk, the maximum frequency of APB1/APB2 clock is 120 MHz  */
  67.   crm_apb2_div_set(CRM_APB2_DIV_1);

  68.   /* config apb1clk, the maximum frequency of APB1/APB2 clock is 120 MHz  */
  69.   crm_apb1_div_set(CRM_APB1_DIV_1);

  70.   /* enable auto step mode */
  71.   crm_auto_step_mode_enable(TRUE);

  72.   /* select pll as system clock source */
  73.   crm_sysclk_switch(CRM_SCLK_PLL);

  74.   /* wait till pll is used as system clock source */
  75.   while(crm_sysclk_switch_status_get() != CRM_SCLK_PLL)
  76.   {
  77.   }

  78.   /* disable auto step mode */
  79.   crm_auto_step_mode_enable(FALSE);

  80.   /* update system_core_clock global variable */
  81.   system_core_clock_update();
  82.   nvic_priority_group_config(NVIC_PRIORITY_GROUP_4);
  83. }

打开蜂鸣器

        开启蜂鸣器就是使能定时器的计数器功能,开始计数

  1. void Beep_Start(void)
  2. {
  3.     tmr_output_enable(TMR17, TRUE);
  4.     tmr_counter_enable(TMR17,TRUE);
  5.      
  6. }

关闭蜂鸣器

        关闭蜂鸣器就是让定时器计数器停止计数

  1. void Beep_Stop(void)
  2. {     
  3.     tmr_output_enable(TMR17, FALSE);
  4.     tmr_counter_enable(TMR17,FALSE);
  5.    
  6. }

蜂鸣器控制

  1. void Beep_Out()
  2. {              
  3.       Beep_Start();
  4.       
  5.         tmr_channel_value_set(TMR17, TMR_SELECT_CHANNEL_1,500);
  6.         delayInMs(30);         
  7.          
  8.       Beep_Stop();
  9. }
  10. void delayInNops(uint n)
  11. {       
  12.       while(n>0)
  13.       {
  14.                 __NOP();
  15.                 n--;
  16.       }        
  17. }

  18. void delayInMs(uint n)
  19. {
  20.         while(n>0)
  21.         {
  22.                 delayInNops(17200);
  23.                 n--;
  24.         }
  25. }

3.分析代码

        由于定时器资源比较多,比如输入捕获,输出比较,计数模式,PWM模式,这边就不一一介绍了,有兴趣的可以自己去多了解,就重点介绍一下接下来实例中用到的PWM输出。


        定时器的PWM通道可以设置输出信号的频率、周期、时间


        频率 = TCLK/((ARR+1)(PSC+1))


         时间(周期)=1/频率


        例如本例中:产生一个1000hz的PWM信号,在定时器17的时钟为120MHZ                         tmr_base_init(TMR17,100-1,1200-1);//周期1ms   1000hz


         频率 = 120000000/(100*1200) = 1000hz


        时间 = 1/1000   /s = 1ms


      

        tmr_cnt_dir_set(TMR17, TMR_COUNT_UP);//计数器向上计数

        tmr_clock_source_div_set(TMR17,TMR_CLOCK_DIV1);//1分频


        设置波形占空比


       tmr_channel_value_set(TMR17, TMR_SELECT_CHANNEL_1,0);//占空比初始化的时候设置为0


        tmr_channel_value_set(TMR17, TMR_SELECT_CHANNEL_1,800);//占空比设置800



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

本版积分规则

60

主题

459

帖子

1

粉丝
快速回复 在线客服 返回列表 返回顶部