搜索
bottom↓
回复: 0

《STM32MP1 M4裸机HAL库开发指南》第十六章 蜂鸣器实验

[复制链接]

出0入234汤圆

发表于 2022-11-1 11:00:42 | 显示全部楼层 |阅读模式
本帖最后由 正点原子 于 2022-11-1 11:00 编辑

1)实验平台:正点原子STM32MP157开发板
2)购买链接:https://item.taobao.com/item.htm?&id=629270721801
3)全套实验源码+手册+视频下载地址:http://www.openedv.com/thread-318813-1-1.html
4)正点原子官方B站:https://space.bilibili.com/394620890
5)正点原子STM32MP157技术交流群:691905614 lQLPJxaFi2zaB4UWWrDAMgIsFEW2pwLb3abnwDMA_90_22.png
lQDPJxaFi2nfFizMjM0CbLCPlxn_FVheIQLb3aGrwFQA_620_140.jpg

lQLPJxaFi2nfFhLMkM0BXrDNvOUyeU_FPgLb3aGvQNIA_350_144.png


第十六章 蜂鸣器实验


上一章,我们介绍了STM32MP157的IO口作为输出的使用。本章,我们将通过另外一个例子继续巩固IO口作为输出使用的操作方法,不同的是本章讲的不是用IO口直接驱动器件,而是通过三极管间接驱动。我们将利用一个IO口来控制板载的有源蜂鸣器。
        本章将分为如下几个小节:
        16.1、蜂鸣器简介;
        16.2、硬件设计;
        16.3、程序设计;
        16.4、编译测试;

16.1 蜂鸣器简介

蜂鸣器是一种一体化结构的电子讯响器,采用直流电压供电,广泛应用于计算机、打印机、复印机、报警器、电子玩具、汽车电子设备、电话机、定时器等电子产品中,用作发声器件。蜂鸣器主要分为压电式蜂鸣器和电磁式蜂鸣器两种类型。
正点原子STM32MP157开发板板载的蜂鸣器是电磁式的有源蜂鸣器,如图16.1.1所示:
第十六章 蜂鸣器实验392.png
图16.1. 1有源蜂鸣器

这里的有源不是指电源的“源”,而是指有没有自带震荡电路,有源蜂鸣器自带了震荡电路,一通电就会发声;无源蜂鸣器则没有自带震荡电路,必须外部提供2~5KHz左右的方波驱动,才能发声。
上一章,我们利用STM32MP1的IO口直接驱动LED灯,本章的蜂鸣器,我们能否直接用STM32MP157的IO口驱动呢?让我们来分析一下:
①STM32MP157的单个IO最大可以提供20mA电流(来自数据手册,如下图),而蜂鸣器的驱动电流是30mA左右,如果直接将蜂鸣器接在IO口上,可能会烧毁IO。
②STM32MP157整个芯片的电流,最大也就140mA,如果用IO口直接驱动蜂鸣器,其他地方用电就得省着点了。
所以我们不用STM32MP1的IO直接驱动蜂鸣器,而是通过三极管扩流后再驱动蜂鸣器,这样STM32MP157的IO只需要提供不到1mA的电流就足够了。
IO口使用虽然简单,但是和外部电路的匹配设计,还是要十分讲究的,考虑越多,设计就越可靠,出现的问题也就越少。
第十六章 蜂鸣器实验864.png
图16.1. 2数据手册部分截图

16.2 硬件设计
1. 例程功能
控制蜂鸣器每隔一段时间响或者停一次,当蜂鸣器响的时候,LED0亮,当蜂鸣器停的时候,LED0灭。
2. 硬件资源
lQLPJxbU6UnzulYszQFfsI4hnS3GYprSA13mcMHASwA_351_44.png
表16.2. 1硬件资源

3. 原理图
STM32mp157原理图中,LED0接在PI0上,LED1接在PF3上。蜂鸣器的驱动信号连接在STM32mp157的PC7上。如下图所示:
第十六章 蜂鸣器实验1127.png
图16.2. 1 LED与STM32MP157连接原理图

第十六章 蜂鸣器实验1183.png
图16.2. 2蜂鸣器与STM32MP157连接原理图

图中我们用到一个PNP 型的三极管(S8550)来驱动蜂鸣器,R108主要用于防止蜂鸣器的误发声。当PC7输出低电平的时候,Q1导通,蜂鸣器发声,当PC7输出高电平的时候,Q1不导通,蜂鸣器停止发声。
16.3 程序设计
        本实验配置好的实验工程已经放到了开发板光盘中,路径为:开发板光盘A-基础资料\1、程序源码\ 3、M4裸机驱动例程\ MP157-M4 HAL库V1.2\实验5 蜂鸣器实验。
16.3.1 程序设计流程
        本章节我们通过HAL库的API函数来驱动LED和蜂鸣器,实现蜂鸣器和LED0交替开启和关闭。实验程序的设计流程如下:
1)初始化HAL库
HAL_Init();
2)开启GPIOI和GPIOC时钟
__HAL_RCC_GPIOI_CLK_ENABLE()
__HAL_RCC_GPIOC_CLK_ENABLE()
3)设置GPIO引脚电平
        通过HAL_GPIO_WritePin和HAL_GPIO_TogglePin设置GPIO口的电平。
4)实现LED0和BEEP电平以0和1交替变化
16.3.2 添加驱动文件
在上一章实验的基础上,我们在工程的Drivers\BSP\BEEP下新建beep.c和beep.h文件:
第十六章 蜂鸣器实验1765.png
图16.3.2.1 新建beep.c和beep.h文件

        新建好文件后,将beep.c文件和工程关联。
16.3.3 添加驱动代码
1. 添加beep.h文件代码
        在beep.h文件中添加如下代码:
#ifndef __BEEP_H
#define __BEEP_H

#include "./SYSTEM/sys/sys.h"

/* PC7引脚 定义 */
#define BEEP_GPIO_PORT                  GPIOC
#define BEEP_GPIO_PIN                   GPIO_PIN_7
/* GPIOC时钟使能 */
#define BEEP_GPIO_CLK_ENABLE()        do{ __HAL_RCC_GPIOC_CLK_ENABLE(); }while(0)   
/* 蜂鸣器引脚控制 */
#define BEEP(x)  do{ x ? \
                 HAL_GPIO_WritePin(BEEP_GPIO_PORT, BEEP_GPIO_PIN, GPIO_PIN_SET) : \
                 HAL_GPIO_WritePin(BEEP_GPIO_PORT, BEEP_GPIO_PIN, GPIO_PIN_RESET); \
                  }while(0)      

/* 蜂鸣器引脚电平取反控制 */
#define BEEP_TOGGLE()  do{ HAL_GPIO_TogglePin(BEEP_GPIO_PORT, BEEP_GPIO_PIN); }while(0)

void beep_init(void); /* BEEP初始化函数 */
#endif
        以上代码很好理解,beep.h文件中调用HAL_GPIO_WritePin函数来对GPIO端口位写值,调用HAL_GPIO_TogglePin函数来对GPIO端口位取反。当x大于0的时候,设置端口位为1,蜂鸣器不响;当x小于0的时候,设置端口位为0,蜂鸣器响。
2. 添加beep.c文件代码
        在beep.c文件中添加如下代码,完成蜂鸣器使用的引脚PC7的初始化,配置为推挽输出、上拉、高速模式,当调用beep_init函数时,默认关闭蜂鸣器。
#include "./BSP/BEEP/beep.h"

/**
* @brief       初始化蜂鸣器相关IO口, 并使能时钟
* @param       无
* @retval      无
*/
void beep_init(void)
{
    GPIO_InitTypeDef gpio_init_struct;
    BEEP_GPIO_CLK_ENABLE();                                /* 蜂鸣器时钟使能 */

    gpio_init_struct.Pin = BEEP_GPIO_PIN;                /* 蜂鸣器引脚PC7 */
    gpio_init_struct.Mode = GPIO_MODE_OUTPUT_PP;        /* 推挽输出 */
    gpio_init_struct.Pull = GPIO_PULLUP;                  /* 上拉 */
    gpio_init_struct.Speed = GPIO_SPEED_FREQ_VERY_HIGH;/* 高速 */
    HAL_GPIO_Init(BEEP_GPIO_PORT, &gpio_init_struct);   /* 初始化蜂鸣器引脚 */

    BEEP(1);                                                                    /* 关闭蜂鸣器 */
}
3. 添加main.c文件代码
        mian.c文件代码如下:
#include "./SYSTEM/sys/sys.h"
#include "./SYSTEM/delay/delay.h"
#include "./BSP/LED/led.h"
#include "./BSP/BEEP/beep.h"

/**
* @brief       主函数
* @param       无
* @retval      无
*/
int main(void)
{
    HAL_Init();     /* 初始化HAL库  */
    led_init();     /* 初始化LED */
    beep_init();    /* 初始化蜂鸣器 */

    while(1)
    {
        LED0(0);      /* 打开LED0 */
        BEEP(0);      /* 打开蜂鸣器 */
        delay(100);   /* 延时一段时间 */
        LED0(1);      /* 关闭LED0 */
        BEEP(1);      /* 关闭蜂鸣器 */
        delay(100);   /* 延时一段时间 */
    }
}
16.4 编译测试
        保存修改,编译无报错后进入仿真,运行后,蜂鸣器在滴答滴答响,LED0在闪烁,其中,当蜂鸣器响的时候,LED0是亮的,当蜂鸣器不响的时候,LED0是不亮的。

阿莫论坛20周年了!感谢大家的支持与爱护!!

一只鸟敢站在脆弱的枝条上歇脚,它依仗的不是枝条不会断,而是自己有翅膀,会飞。
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-3-29 23:41

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

快速回复 返回顶部 返回列表