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
|