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
|