本篇主要分为3部分:硬件分析、软件编程、演示效果、驱动接口
1 硬件分析
蜂鸣器按其驱动方式可分为:有源蜂鸣器(内含驱动线路)和无源蜂鸣器(外部驱动),即这里的“源”不是指电源,而是指震荡源,也就是说,有源蜂鸣器内部带震荡源,所以只要一通电就会叫。无源蜂鸣器内部不带振荡源,所以必须需要外部驱动,才能使它鸣叫。下图是有源蜂鸣器与无源蜂鸣器的对比。
FireBLE上连接的蜂鸣器是KLJ1230型号,它是一款贴片压电式无源蜂鸣器,它是靠压电效应的原理来发声的,压电材料,一般常见的是各种压电陶瓷,这种材料的特别之处在于,当电压作用于压电材料时,就会随电压和频率的变化产生机械变形.另一方面,当振动压电陶瓷时,则会产生电荷.就是说这种材料能把机械变形和电荷相互转化,压电式蜂鸣器里面的起振片,就是一种压电陶瓷。如上所述,要让它振动,除了压电陶瓷本身,还需要适当大小和频率变化的电压作用于压电陶瓷。压电式(有源)蜂鸣器内部带有多谐振荡器,可以产生 1.5—2.5kHZ 的电压信号. 由此压电式蜂鸣器才能发声。
在【FireBLE试用体验】环境篇(2)认识硬件开发环境 曾分析过蜂鸣器的原理图,如下图所示,其中的控制端接到了QN9021的P2_6引脚,而该引脚可以配置成PWM输出模式,即可以控制P2_6输出PWM的频率和占空比的变化,来控制蜂鸣器的发声。
P2_6的引脚功能配置如下所示:
P2_6 |
Buzzer 0: P2_6 (I/O):GPIO 1: PWM1 (O):PWM1 output 2: T2_0 (I/O):Timer 2 input capture /clock or PWM output |
PWM是脉冲宽度调制,它是利用微处理器的数字输出来对模拟电路进行控制的一种非常有效的技术,广泛应用在从测量、通信到功率控制与变换的许多领域中。而 在单片机的世界里,主要使用定时器计数器来产生,它最主要的两个参数是周期(频率)和占空比。下面通过软件的形式,实现P2_6输出PWM波。
2 软件编程
(1)蜂鸣器初始化
void BuzzerInit(void) { syscon_SetPMCR0(QN_SYSCON, P07_SW_CLK_PIN_CTRL| P06_SW_DAT_PIN_CTRL); syscon_SetPMCR1(QN_SYSCON, P27_PWM0_PIN_CTRL //P2.7 pwm0 | P26_PWM1_PIN_CTRL ); //P2.6 pwm1 // pin pull ( 00 : High-Z, 01 : Pull-down, 10 : Pull-up, 11 : Reserved ) syscon_SetPPCR0(QN_SYSCON, 0xAAAA5AAA); syscon_SetPPCR1(QN_SYSCON, 0x2AAAAAAA); pwm_init(PWM_CH0); pwm_init(PWM_CH1); }(2)控制蜂鸣器
void BuzzeOn(void ) { pwm_enable(PWM_CH0, MASK_ENABLE); pwm_enable(PWM_CH1, MASK_ENABLE); } void BuzzerOff(void) { pwm_enable(PWM_CH0, MASK_DISABLE); pwm_enable(PWM_CH1, MASK_DISABLE); }(3)测试蜂鸣器,该函数直接由main函数调用
void TestBuzzer(void) { SystemInit(); BuzzerInit(); BuzzeOn(); while (1) /* Loop forever */ { for(int i=0;i<900;i++) { pwm_config(PWM_CH0,119,PWM_COUNT_US(100-i,119),PWM_COUNT_US(500,119)); pwm_config(PWM_CH1,119,PWM_COUNT_US(100-i,119),PWM_COUNT_US(500,119)); delay(10000); } } }3 演示效果
4 驱动接口
(1)由于声音信号无法捕捉演示,故使用LED灯的形式演示,但效果也不佳。
(2)void pwm_init(enum PWM_CH pwmch);
(3) uint8_t pwm_config(enum PWM_CH pwmch, uint16_t pscal, uint8_t periodcount, uint8_t pulsecount);
(4) void pwm_enable(enum PWM_CH pwmch, uint32_t able);;