打印
[AT32F421]

定时器驱动无源蜂鸣器

[复制链接]
49|0
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
1.蜂鸣器介绍
什么是无源蜂鸣器?

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

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

初始化蜂鸣器:
void Beep_Init(void)
{
    //variable
    tmr_output_config_type tmr_oc_init_structure;
    gpio_init_type gpio_init_struct = {0};
    //tmr_periph_config_type tmr_brkdt_config_struct = {0};
   
    crm_periph_clock_enable(CRM_GPIOB_PERIPH_CLOCK, TRUE );
    crm_periph_clock_enable(CRM_TMR17_PERIPH_CLOCK, TRUE );
   
    gpio_default_para_init(&gpio_init_struct);
    gpio_init_struct.gpio_pins = BEEP_PINS_9;
    gpio_init_struct.gpio_mode = GPIO_MODE_MUX;
    gpio_init_struct.gpio_out_type = GPIO_OUTPUT_PUSH_PULL;
    gpio_init_struct.gpio_pull = GPIO_PULL_NONE;
    gpio_init_struct.gpio_drive_strength = GPIO_DRIVE_STRENGTH_STRONGER;
    gpio_init(GPIOB,&gpio_init_struct);
   
    gpio_pin_mux_config(GPIOB,GPIO_PINS_SOURCE9,GPIO_MUX_2);
    //周期1ms
    tmr_base_init(TMR17,100-1,1200-1);
    tmr_cnt_dir_set(TMR17, TMR_COUNT_UP);
    tmr_clock_source_div_set(TMR17,TMR_CLOCK_DIV1);
   
    //tmr_output_config_type tmr_oc_init_structure;
    tmr_output_default_para_init(&tmr_oc_init_structure);
    tmr_oc_init_structure.oc_mode = TMR_OUTPUT_CONTROL_PWM_MODE_B;
    tmr_oc_init_structure.oc_idle_state = TRUE;
    tmr_oc_init_structure.oc_polarity = TMR_OUTPUT_ACTIVE_HIGH;
    tmr_oc_init_structure.oc_output_state = TRUE;
    tmr_oc_init_structure.occ_output_state = TRUE;
    tmr_oc_init_structure.occ_idle_state = TRUE;
    tmr_oc_init_structure.occ_polarity =TMR_OUTPUT_ACTIVE_HIGH;
   
    tmr_output_channel_config(TMR17, TMR_SELECT_CHANNEL_1, &tmr_oc_init_structure);   
    tmr_channel_value_set(TMR17, TMR_SELECT_CHANNEL_1,0);
   
    //tmr_output_channel_buffer_enable(TMR17,TMR_SELECT_CHANNEL_1,TRUE);
    tmr_period_buffer_enable(TMR17,TRUE);//
   
    tmr_output_enable(TMR17, TRUE);
    tmr_counter_enable(TMR17,TRUE);      
}

void Mcu_Init(void)
{
    /* reset crm */
  crm_reset();

  /* config flash psr register */
  flash_psr_set(FLASH_WAIT_CYCLE_3);

  crm_hick_sclk_frequency_select(CRM_HICK_SCLK_48MHZ);

  crm_clock_source_enable(CRM_CLOCK_SOURCE_HICK, TRUE);

   /* wait till hick is ready */
  while(crm_flag_get(CRM_HICK_STABLE_FLAG) != SET)
  {
  }

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

  /* enable pll */
  crm_clock_source_enable(CRM_CLOCK_SOURCE_PLL, TRUE);

  /* wait till pll is ready */
  while(crm_flag_get(CRM_PLL_STABLE_FLAG) != SET)
  {
  }

  /* config ahbclk */
  crm_ahb_div_set(CRM_AHB_DIV_1);

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

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

  /* enable auto step mode */
  crm_auto_step_mode_enable(TRUE);

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

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

  /* disable auto step mode */
  crm_auto_step_mode_enable(FALSE);

  /* update system_core_clock global variable */
  system_core_clock_update();
  nvic_priority_group_config(NVIC_PRIORITY_GROUP_4);
}

打开蜂鸣器

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

void Beep_Start(void)
{
    tmr_output_enable(TMR17, TRUE);
    tmr_counter_enable(TMR17,TRUE);
     
}

关闭蜂鸣器

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

void Beep_Stop(void)
{     
    tmr_output_enable(TMR17, FALSE);
    tmr_counter_enable(TMR17,FALSE);
   
}

蜂鸣器控制

void Beep_Out()
{              
      Beep_Start();
      
        tmr_channel_value_set(TMR17, TMR_SELECT_CHANNEL_1,500);
        delayInMs(30);         
         
      Beep_Stop();
}
void delayInNops(uint n)
{       
      while(n>0)
      {
                __NOP();
                n--;
      }        
}

void delayInMs(uint n)
{
        while(n>0)
        {
                delayInNops(17200);
                n--;
        }
}

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



使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

59

主题

454

帖子

1

粉丝