【GD32F303红枫派使用手册】第七节 TIMER-蜂鸣器PWM

7.1 实验内容

通过本实验主要学习以下内容:

  • PWM输出功能实现;
  • 定时器基本原理;
  • 蜂鸣器驱动原理;

7.2 实验原理

7.2.1 蜂鸣器驱动原理

蜂鸣器是一种一体化结构的电子讯响器,采用直流电压供电,广泛应用于计算机、打印机、复印机、报警器、电子玩具、汽车电子设备、电话机、定时器等电子产品中作发声器件。比如台式电脑的主机开机会"滴"一声、洗衣机按下按键及洗衣完成都会有声响,以上这些声音都是通过蜂鸣器来发出的。蜂鸣器的驱动方式可分为:有源蜂鸣器(内有驱动线路)和无源蜂鸣器(使用外部驱动)。这里的“源”不是指电源。而是指震荡源。 也就是说,有源蜂鸣器内部带震荡源,所以只要一通电就会叫。而无源内部不带震荡源,所以如果用直流信号无法令其鸣叫。必须用2K~5K的方波去驱动它。

有源蜂鸣器不需要外部的激励源,只需要接入直流电源,即可自动发出声音(声音频率相对固定),它的工作发声原理是:直流电源输入经过振荡系统的放大取样电路在谐振装置作用下产生声音信号。

7.2.2 定时器基本原理

GD32F30X系列MCU的timer主要有以下五类,主要包括高级定时器/通用定时器L0/通用定时器L1/通用定时器L2/基本定时器。各个定时器支持的功能可在该表中查阅,其中黑点代表改类型的定时器支持该功能,X代表改类型的定时器不支持该功能。

 定时器可支持主从模式,可实现多个定时器级联,相关定时器的级联信号说明如下表所示。以TIMER0为例,其触发信号可以选择TIMER4_TRGO/TIMER1_TRGO/TIMER2_TRGO/TIMER3_TRGO。

定时器可支持主从模式,可实现多个定时器级联,相关定时器的级联信号说明如下表所示。以TIMER0为例,其触发信号可以选择TIMER4_TRGO/TIMER1_TRGO/TIMER2_TRGO/TIMER3_TRGO。

根据计数模式,PWM输出分为两种波形:

  • EAPWM(边沿对齐 PWM)  

EAPWM 的周期由 TIMERx_CAR 寄存器值决定,占空比由 TIMERx_CHxCV 寄存器值决定。下图显示了 EAPWM 的输出波形和中断。  

  • CAPWM(中央对齐PWM)  

CAPWM 的周期由(2*TIMERx_CAR 寄存器值)决定,占空比由(2*TIMERx_CHxCV 寄存器值)决定。 下图显示了 CAPWM 的输出波形和中断。  

7.3 硬件设计

蜂鸣器驱动电路如下图所示,在本例程中,通过BEEP_PWM(PA15)引脚驱动三极管实现蜂鸣器的驱动,当BEEP_PWM输出高电平时,三极管导通,蜂鸣器鸣叫;当BEEP_PWM输出低电平时,三极管截断,蜂鸣器停止鸣叫。

 

当我们通直流电到有源蜂鸣器的时候,它会发送预设的声音,通常是连续的蜂鸣声或间歇的蜂鸣声等。 工作电压不变,改变通断时间,获得不同的长音,如连续声,快短声,慢长声等。

7.4 代码解析

本例程实现通过调整PWM的周期占空比以及对应PWM输出的时间,实现不同音调的蜂鸣器播放,进而实现模拟音乐播放的效果,例程中模拟的是孤勇者的音乐。

7.4.1 主函数代码解析

主函数如下所示,主要包括串口/LED初始化,蜂鸣器PWM初始化,TIMER初始化(该timer仅实现基本定时的功能,通过该timer控制蜂鸣器PWM输出时间),以及启动蜂鸣器等。

C
int main(void)
{uint16_t t=0;driver_init(); bsp_uart_init(&BOARD_UART);bsp_led_group_init();  bsp_led_on(&LED0);bsp_led_off(&LED1);bsp_beep_init(1000000,50);    TIMER_INT.timer_updata_callback=Music_switch;bsp_timer_init(10000,5000);buzzer_on();printf("\r\n Bepp music play\r\n");while(1){if(int_flag==1){int_flag=0;t++;bsp_led_toggle(&LED0);            printf("\r\n Bepp music play loop %d\r\n",t);}}
}

7.4.2 蜂鸣器PWM配置函数

蜂鸣器PWM配置函数如下所示,通过调用driver_timer_channel_init底层驱动函数实现对对应TIMER周期和占空比的配置。

C
void bsp_beep_init(uint32_t counter_frequency,uint16_t period)
{driver_timer_channel_init(&PWM_BEEP,counter_frequency,period);
}

PWM_BEEP的定义如下,采用TIMER1的CH0通道进行输出,引脚为PA15,通过该定义可实现对蜂鸣器相关参数的一站式定义。

C
TIMER_CH_DEF(PWM_BEEP,TIMER1,0,TIMER_CH_PWM_HIGH,A,15,AF_PP,GPIO_TIMER1_PARTIAL_REMAP0);

7.4.3 基本定时器初始化函数

基本定时器初始化函数如下,启动了TIMER5作为中断功能,定时周期为10000个定时器时钟,其回调函数为Music_switch。

CTIMER_INT.timer_updata_callback=Music_switch;bsp_timer_init(10000,5000);void bsp_timer_init(uint32_t counter_frequency,uint16_t period)
{driver_timer_base_int_init(&TIMER_INT,counter_frequency,period);nvic_irq_enable(TIMER5_IRQn,0,0);
}TIMER_BASE_DEF(TIMER_INT,TIMER5);

Music_switch的定义如下,该函数在TIMER5的中断中调用,该函数实现的功能主要为配置修改TIMER5的周期以及蜂鸣器PWM输出的周期占空比,进而实现对不同音调的播放。

C
void Music_switch(void)
{   
    static uint16_t i=0;
    buzzer_set(music[i],12);
    i++;
    bsp_timer_init(10000,music[i]*50);  
    i++;

    if( i==(sizeof(music)/sizeof(music[0])) )
    {
        i=0;
        bsp_led_toggle(&LED1);
        int_flag=1;        
    }        
}

 音乐的相关数据定义在music数组中,其参数含义如下:M6代表蜂鸣器PWM的周期,下一个50代表该PWM输出的时间(对应TIEMR5的周期),以上两个数据一组,后面的数据类似。

C
uint16_t music[]=
{
//        //这一路上走走停停 顺着少年漂流的痕迹
//                M2,50,M2,50,M1,25,M2,50,M2,50,M1,25,M2,50,M3,50,M5,50,M3,50, M2,50,M2,50,M1,25,M2,50,M2,50,M1,25,M2,25,M3,25,M2,25,M1,25,L6,100,Z0,10,
//                //迈出车站的前一刻 竟有些犹豫
//                M2,50,M2,50,M1,25,M2,50,M2,50,M1,25,M2,50,M3,50,M5,50,M3,50, M2,50,M2,50,M3,25,M2,50,M1,50,M2,100,Z0,50,
//                //不仅笑着这近乡情怯 仍无法避免
//                M2,50,M2,50,M1,25,M2,50,M2,50,M1,25,M2,50,M3,50,M5,50,M3,50, M2,50,M2,50,M3,25,M2,50,M1,50,L6,100,Z0,10,
//                //而长野的天 依旧那么暖 风吹起了从前
//                M3,25,M2,25,M1,25,M2,25,M1,100, M3,25,M2,25,M1,25,M2,25,M1,50,M1,50, M5,25,M3,25,M2,25,M1,25,M2,25,M1,100,M1,150,Z0,30,
//                //从前初识这世间 万般留恋 看着天边似在眼前 也甘愿赴汤蹈火去走它一遍
//                M1,50,M2,50,M3,50,M1,50,M6,50,M5,25,M6,25,M6,50,M6,50, M1,25,M7,50,M6,25,M7,25,M7,100,Z0,5, M7,50,M6,25,M7,25,M7,50,M3,50,H1,25,H2,25,H1,25,M7,25,M6,50,M5,50, M6,50,M5,25,M6,25,M6,25,M5,25,M6,25,M5,25,M6,50,M5,25,M2,25,M2,25,M5,50,M5,50,M3,100,M3,100,Z0,25,
//                //如今走过这世间 万般留恋 翻过岁月不同侧脸 措不及防闯入你的笑颜
//                M1,50,M2,50,M3,50,M1,50,M6,50,M5,25,M6,25,M6,50,M6,50, M1,25,M7,50,M6,25,M7,25,M7,100,Z0,5, M7,50,M6,25,M7,25,M7,50,M3,50,H1,25,H2,25,H1,25,M7,25,M6,50,M5,50, M6,50,H3,25,H3,25,H3,50,M5,50,M6,50,H3,25,H3,25,H3,25,M5,50,M6,25,M6,100,M6,100,M6,100,Z0,25,
//                //我曾难自拔与世界之大 也沉溺于其中梦话
//                H1,50,H2,50,H3,50,H6,25,H5,25,H5,50,H6,25,H5,25,H5,50,H6,25,H5,25,H5,50,H2,25,H3,25,H3,50, H6,25,H5,25,H5,50,H6,25,H5,25,H5,50,H6,25,H5,25,H5,25,H3,50,H3,50,
//                //不得真假 不做挣扎 不惧笑话
//                H2,50,H1,25,M6,25,M6,25,H1,50, M6,25,H2,25,H1,25,M6,50,M6,25,H1,50,H1,50, H3,100,H3,25,H4,25,H3,50,H3,25,H2,50,H2,50,Z0,25,
//                //我曾将青春翻涌成她 也曾指尖弹出盛夏 心之所动且就随缘去吧
//                H1,50,H2,50,H3,50,H6,25,H5,25,H5,50,H6,25,H5,25,H5,50,H6,25,H5,25,H5,50,H2,50, H3,50,H6,25,H5,25,H5,50,H6,25,H5,25,H5,50,H6,25,H5,25,H5,50,H3,50,H3,50, H2,50,H1,25,M6,25,M6,25,H3,50,H3,50, H2,50,H1,25,M6,25,M6,25,H1,50,H1,50,H1,100,H1,100,Z0,10,
//                //逆着光行走任风吹雨打吧
//                M6,25,H3,50,H3,50,H2,50,H1,25,M6,25,M6,25,H3,50,H2,50,H1,25,M6,25,M6,25,H1,50,H1,50,H1,50,H1,100,Z0,10,   M6,50,M7,50,H1,50,H2,50,M7,50,H1,50,H1,100,Z0,10,        //爱你孤身走暗巷H1,50,M7,50,H1,50,H2,50,M7,50,H1,50,H1,100,Z0,10,         //爱你不跪的模样H1,50,H2,50,H3,50,H2,50,H3,50,H2,50,H3,100,H3,50,H3,50,H2,50,H3,100,H5,100,H3,100,Z0,10 //爱你对峙过绝望不肯哭一场    
};

7.5 实验结果

将本例程烧录到红枫派开发板中,运行后将会通过蜂鸣器听到相关音乐

由聚沃科技原创,来源于    

【红枫派开发板】第七讲 TIMER-蜂鸣器PWM - 苏州聚沃电子科技有限公司 (gd32bbs.com)

GD32MCU技术交流群:859440462  

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/diannao/21551.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

2024年信息素养大赛图形化编程小低组复赛模拟真题

2024年全国青少年信息素养大赛复赛为六道编程题,分值为10分*215分*225分*2,难度依次递增,按步骤评分,据Scratch实验室预估,初赛80%的晋级率,初赛近20万人,意味着有15万多进入复赛,7月…

bootstrapblazor小白笔记

使用了bootstrapblazor,采用.net8.0,server模式,所有的问题都是基于以上条件所遇到的 1、登录过后需要在每个页面都使用认证吗 是不需要的,每个页面都写attribute [Authorize]没有问题,但是页面很多的话一个一个的写很…

私有化部署的无忧企业文档,助力企业实现文档权限的精细化管理

在当今数字化快速发展的时代,企业文档管理已成为企业运营中不可或缺的一部分。文档的安全性和访问权限的精确控制对于企业的信息保护至关重要。在无忧企业文档管理系统中,不仅具备强大的内容管理能力,更在权限管理上做到了细致入微。下面我对…

【MySQL】MySQL Connect -- 详解

一、Connector / C 使用 要使用 C 语言连接 MySQL,需要使用 MySQL 官网提供的库,可以去官网进行下载:MySQL :: MySQL Community Downloads 我们使用 C 接口库来进行连接,要正确使用,还需要做一些准备工作&#xff1a…

[Windows] 植物大战僵尸杂交版

游戏包含冒险模式、挑战模式、生存模式三种不同玩法。冒险模式主打关卡闯关,挑战模式则挑战特殊设计的关卡,生存模式结合无尽模式和特殊地图,各具特色。玩家可根据喜好自由选择模式,体验不同的游戏乐趣。快来尝试这款独特的pvz游戏…

C++_deque:deque的数据结构特点

文章目录 🚀1. deque介绍🚀2. deque数据结构🚀3. deque的缺陷🚀4.为什么选择deque作为stack和queue的底层默认容器🚀5.deque头插逻辑(了解) 大家好!本文会简单讲讲deque的使用与数据…

html + js 实现单个标签内文本大小不一样的效果

<!DOCTYPE html> <html lang"zh-CN"> <head><meta charset"UTF-8"><title>价格显示示例</title><style>.small {font-size: 0.7em; /* 设置较小的字体大小 */color:red;}#price{color:red;}</style> <…

第24讲:Ceph集群RGW对象存储高可用集群部署与测试

文章目录 1.RGW对象存储高可用集群架构1.1.环境规划1.2.高可用集群架构图 2.部署RGW对象存储高可用集群2.1.在所有的Ceph节点中部署RGW2.2.部署Haproxy负载均衡服务2.3.配置Haproxy负载均衡三个节点中的RGW2.4.配置Keepalived实现RGW高可用集群2.5.启动Keepalived并观察VIP地址…

有本HCIE,作用真的不大

在现在内卷的时代&#xff0c;获得专业认证是提升个人职业竞争力的重要途径之一。 获取认证证书是一种常见的提升自身技能和职业竞争力的方法。 然而&#xff0c;仅仅持有一张证书&#xff0c;并不能保证你在实际工作中游刃有余。 真正将其知识转化为技术能力&#xff0c;才…

学会读书并不简单,如何真正学会读书

一、教程描述 读书是要讲究方法的&#xff0c;否则就会事倍功半&#xff0c;比如&#xff0c;在学习书本上的每一个问题每一章节的时候&#xff0c;首先应当不只看到书面上&#xff0c;而且还要看到书背后的东西&#xff0c;在对书中每一个问题都经过细嚼慢咽&#xff0c;其次…

ClickHouse如何整合数据源:MySQL、HDFS...

一、ClickHouse数据源 ClickHouse 作为一个强大的列式数据库管理系统&#xff0c;支持多种数据源&#xff0c;使得用户能够方便地将数据导入 ClickHouse 进行存储和分析。以下是常见的 ClickHouse 数据源&#xff1a; 外部数据源 HDFS&#xff1a; 支持从 Hadoop 分布式文件系…

0基础认识C语言(理论知识)

为了给0基础一个舒服的学习路径&#xff0c;就有了这个专栏希望带大家一起进步。 话不多说&#xff0c;开始正题。 一、C语言的一段小历史 C语言的设计要追溯到20世纪60年代末和70年代初&#xff0c;在那个时代美国有这么一号人叫做丹尼斯.里奇&#xff0c;他和同事肯.汤普逊…

小程序使用Canvas设置文字竖向排列

在需要使用的js页面引入js文件,传入对应参数即可 /** * 文本竖向排列 */ function drawTextVertical(context, text, x, y) {var arrText text.split();var arrWidth arrText.map(function (letter) {return 26; // 字体间距,需要自定义可以自己加参数,根据传入参数进行…

计算机网络学习实践:DHCP跨网段动态分配IP

计算机网络学习实践&#xff1a;DHCP跨网段动态分配IP 1.实验准备 实验环境&#xff1a;思科的模拟器 实验设备&#xff1a; 1个服务器&#xff0c;2个二层交换机&#xff08;不是三层的&#xff09;&#xff0c;4个PC机&#xff0c;1个路由器 三个网段 192.168.1.0 255.…

logback删除日志文件和文件夹

​​​​​一&#xff0c;事由和源码 logback版本1.2.11 网上找了很多都是无法删除文件夹的&#xff0c;原先使用的TimeBasedRollingPolicy无法删除日志的文件夹&#xff0c;有很多空的日期文件夹&#xff0c;于是查看TimeBasedRollingPolicy源码发现有校验不删除文件夹&#x…

Docker的网络管理

文章目录 一、Docker容器之间的通信1、直接互联&#xff08;默认Bridge网络&#xff09;1.1、Docker安装后默认的网络配置1.2、创建容器后的网络配置1.2.1、首先创建一个容器1.2.2、ip a 列出网卡变化信息1.2.3、查看新建容器后的桥接状态 1.3、容器内安装常见的工具1.4、容器间…

46、Flink 的 异步 I/O 算子详解

异步 I/O 1.需求 在与外部系统交互&#xff08;用数据库中的数据扩充流数据&#xff09;时&#xff0c;需要考虑与外部系统的通信延迟对整个流处理应用的影响。 同步交互&#xff1a;使用 MapFunction访问外部数据库的数据&#xff0c; MapFunction 向数据库发送一个请求然后…

高级 Go 程序设计:使用 net/http/httputil 包构建高效网络服务

高级 Go 程序设计&#xff1a;使用 net/http/httputil 包构建高效网络服务 介绍ReverseProxy 的使用基本概念实现步骤高级配置实际案例 DumpRequest 的使用功能说明代码示例应用场景NewSingleHostReverseProxy 的特性功能概述 详细教程 注意事项使用 NewChunkedWriter 实现高效…

C语言 带头双向循环链表的基本操作

带头双向循环链表的基本操作 结构体定义初始化创建新节点头插头删尾插尾删查找在指定位置之后插入删除指定位置的值打印 结构体定义 typedef int DataType; typedef struct LinkNode {DataType data;struct LinkNode* prev;struct LinkNode* next; }LNode;初始化 有两种初始化…

远控免杀篇

0x00&#xff1a;前言 随着近两年hvv和红蓝对抗以及国家对于网络安全的重视&#xff0c;国内防护水平都蹭蹭上了一个台阶&#xff0c;不管是内部人员的技术水平提高还是防护设备的层层部署&#xff0c;均给了红队人员想要进一步行动设置了障碍。 通过weblogic的cve-2019-2725获…