前言
前两天学习了蜂鸣器的实验,但是我的蜂鸣器(内置于开发板)实验现象居然和教程中的不一样,啊,这是什么情况?我百思不得其解,经过半天的学习我发现,我的开发板中的蜂鸣器电路结构,与市面上用的蜂鸣器模块居然不同,接下来看看这里有什么不一样
一、开发板中的蜂鸣器的原理图和蜂鸣器模块(低电平触发)
经过我的仔细排查,发现两款蜂鸣器中的三级管不同,左边的是8050三级管,右边的是蜂鸣器模块是9012三极管驱动的,从此处决定了两款蜂鸣器的不同触发方式,左边是由高电平触发,右边的是由低电平触发的,接下来了解一下这两款蜂鸣器为何是不同的触发原理呢。
NPN型三极管
左图中的蜂鸣器就是NPN型的三极管,从左端这里为P端(基级),右上端无箭头的为N端(也叫集电极为正极),右下端有箭头的一端为N端(也叫发射极为负极)
PNP型三极管
左端为N端(基级),右上有箭头的为发射极(负极),右下角的端口为集电极(正极)
三极管导通条件
PNP型三极管基级所接电压为低电平时,该三极管导通;
PNP三极管发射极接电源,集电极接负载到地,然后当基极电压低于发射极电压一定范围值也就是常用的-0.6V至-0.7V(与NPN相反),就可以导通
NPN型三极管基极所接电压为高电平时,该三极管导通;
NPN三极管发射极接地,集电极接电源,然后当基极电压高于发射极电压一定范围值也就是常用的0.6V至0.7V(与PNP相反),就可以导通;
所以真相大白了,是由于不同的蜂鸣器具有不同的电路原理结构,这一点是我思维受限制了,理所应当的认为所以的蜂鸣器内部不都是一样的吗,其实这是不对的,一切要以实际为标准,所以我发现这实验现象的不同之处是由于蜂鸣器内部的三极管不同而造成的,看来自己还要学的东西确实有很多,还得继续努力,好了接下来看看代码部分
二、有源蜂鸣器封装代码(以PNP型驱动的蜂鸣器)
#include "stm32f10x.h" // Device header
void Buzzer_Init(void)
{
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB , ENABLE);//开启GPIO_F的时钟
GPIO_InitTypeDef GPIO_InitStructure;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; //推挽输出模式
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_8 ;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz ;
GPIO_Init(GPIOB , &GPIO_InitStructure);//地址传递,结构体变量名
}
void Buzzer_ON(void)
{
GPIO_ResetBits(GPIOB , GPIO_Pin_8);//设置为低电平,低电平打开BEEP
}
void Buzzer_OFF(void)
{
GPIO_SetBits(GPIOB , GPIO_Pin_8);
}
头文件部分
#ifndef _BUZZER_H
#define _BUZZER_H
void Buzzer_Init(void);
void Buzzer_ON(void);
void Buzzer_OFF(void);
void Buzzer_Turn(void);
#endif
主函数部分就是对这些函数的调用了
#include "stm32f10x.h" // Device header
#include "Delay.h" //延时函数
#include "Buzzer.h"//引入初始化蜂鸣器的头文件
int main(void)
{
Buzzer_Init();//初始化蜂鸣器,端口号PB8
while(1)
{
Buzzer_ON(); //对于外设蜂鸣器低电平触发,开发板内的BEEP是高电平触发的
Delay_ms(500);
Buzzer_OFF();
Delay_ms(500);
}
}
好了最后可以自己试一下代码是否正确,实验现象是否合适,需要自己多动手多去实践试试,年轻就多尝试尝试。