当前位置: 首页 > news >正文

STM32单片机PWM驱动无源蜂鸣器模块C语言程序

一、使用硬件介绍

无源蜂鸣器外形及原理图如下所示;
在这里插入图片描述在这里插入图片描述单片机型号为STM32F103C8T6;

二、PWM驱动程序

使用STM32CubeMX配置、频率及占空比的计算公式,可参考STM32单片机输出频率及占空比可调的PWM波;
使用定时器TIM1的Channel 1作为PWM通道,时钟为72MHz,配置PSC为72-1,这样当ARR从0~65535变化时,可以得到约15Hz-1MHz的频率,如果想要其他频率,则可以修改PSC的值;
一般无源蜂鸣器的共振频率为2000Hz或4000Hz,笔者设置默认频率为4000Hz,占空比为50%;
将需要用到的变量封装在一个结构体,放在头文件中:

typedef struct
{uint16_t u16OnMs;//一个鸣叫周期内声音开启时间uint16_t u16OffMs;//一个鸣叫周期内声音关闭时间uint8_t u8Cycles;//重复次数uint8_t u8CycleCnt;//次数计数uint16_t u16CycleMs;//每个周期计时,单位msbool bStart:1;//鸣叫开始标志bool bBeeping:1;//正在鸣叫标志uint8_t Reserved:6;//保留   
}BuzPara_ts;

蜂鸣器驱动c文件中的程序:

#include "PWM.h"
#include "Buzzer.h"
#include <string.h>#define BUZZER_PWM_FREQUENCY                4000//共振频率
#define BUZZER_PWM_DUTY_CYCLE               50//占空比static BuzPara_ts sBuzzer_Para;
/******************************************************************************** 函数名:Buzzer_Start* 功  能:初始化* 参  数:无* 返回值:无* 说  明:无
*******************************************************************************/
void Buzzer_Start(void)
{PWM_Config(BUZZER_PWM_FREQUENCY, BUZZER_PWM_DUTY_CYCLE);PWM_Start();
}
/******************************************************************************** 函数名:Buzzer_Stop* 功  能:初始化* 参  数:无* 返回值:无* 说  明:无
*******************************************************************************/
void Buzzer_Stop(void)
{PWM_Stop();
}
/******************************************************************************** 函数名:Buzzer_Init* 功  能:初始化* 参  数:无* 返回值:无* 说  明:无
*******************************************************************************/
void Buzzer_Init(void)
{Buzzer_Stop();memset(&sBuzzer_Para, 0, sizeof(sBuzzer_Para));Buzzer_SoundSet(50,100,5);
}
/******************************************************************************** 函数名:Buzzer_SoundSet* 功  能:蜂鸣器声音设置* 参  数:OnTime:开启时间OffTime:关闭时间Cycles:重复次数* 返回值:无* 说  明:无
*******************************************************************************/
void Buzzer_SoundSet(uint16_t OnTime, uint16_t OffTime, uint8_t Cycles)
{sBuzzer_Para.u16OnMs = OnTime;sBuzzer_Para.u16OffMs = OffTime;sBuzzer_Para.u8Cycles = Cycles;sBuzzer_Para.u8CycleCnt = 0;sBuzzer_Para.u16CycleMs = 0;sBuzzer_Para.bStart = 1;sBuzzer_Para.bBeeping = 0;
}
/******************************************************************************** 函数名:Buzzer_SoundProcess* 功  能:蜂鸣器声音鸣叫处理* 参  数:无* 返回值:无* 说  明:无
*******************************************************************************/
void Buzzer_SoundProcess(void)
{if (sBuzzer_Para.bStart){        if (sBuzzer_Para.u8CycleCnt < sBuzzer_Para.u8Cycles){if (sBuzzer_Para.u16CycleMs < sBuzzer_Para.u16OnMs)//鸣叫时间未结束{if (!sBuzzer_Para.bBeeping){Buzzer_Start();sBuzzer_Para.bBeeping = 1;}}else//一个周期内鸣叫的时间结束{if (sBuzzer_Para.bBeeping){Buzzer_Stop();//关闭蜂鸣器sBuzzer_Para.bBeeping = 0;                    }else{if (sBuzzer_Para.u16CycleMs >= (sBuzzer_Para.u16OnMs + sBuzzer_Para.u16OffMs))//一个周期结束{sBuzzer_Para.u16CycleMs = 0;sBuzzer_Para.u8CycleCnt++;}}}}else//重复次数完成{Buzzer_Stop();memset(&sBuzzer_Para, 0, sizeof(sBuzzer_Para));}}
}
/******************************************************************************** 函数名:Buzzer_CycleTimeProcess* 功  能:时间处理* 参  数:无* 返回值:无* 说  明:无
*******************************************************************************/
void Buzzer_CycleTimeProcess(void)
{if (sBuzzer_Para.bStart){sBuzzer_Para.u16CycleMs++;}else{sBuzzer_Para.u16CycleMs = 0;}
}
/******************************************************************************** 函数名:Buzzer_TaskMs* 功  能:每ms执行的任务* 参  数:无* 返回值:无* 说  明:无
*******************************************************************************/
void Buzzer_TaskMs(void)
{Buzzer_SoundProcess();Buzzer_CycleTimeProcess();
}

在程序初始化时运行以下函数:

Buzzer_Init();

每隔1ms运行以下函数:

Buzzer_TaskMs();

当需要蜂鸣器响时,调用以下:

void Buzzer_SoundSet(uint16_t OnTime, uint16_t OffTime, uint8_t Cycles)

例如,让蜂鸣器响100ms,关500ms,如此重复3次,即响三声,“嘀嘀嘀”,按如下方式调用:

Buzzer_SoundSet(100, 500, 3);

完整Keil MDK工程文件下载链接:
STM32F103C8T6单片机PWM驱动无源蜂鸣器
如有错漏之处,请评论指出。

http://www.dtcms.com/a/526314.html

相关文章:

  • 光通信|高效动态的自由空间-光纤CVB通信
  • 柳州网站建设33展示型网站解决方案
  • 网站优化排名网站天猫网站建设论文
  • 建站平台在线提交表格功能百度官网认证申请
  • 建浏览器网站制作谷歌网站提交
  • 重庆市建设网站首页多合一建网站
  • 网站不被百度收录域名后缀html是怎样的网站
  • 嵌入式开发 | C语言 | 单精度浮点数解疑--为什么规格化数中指数位E不能是E=0 或 E=255?
  • TensorFlow框架中神经网络模型设计流程
  • 每日一个C语言知识:C 输入 输出
  • Shiro反序列化漏洞提权渗透实战:原理+复现(CVE-2016-4437)
  • 百讯科技网站建设做图标去什么网站找
  • 做网站服务器电脑配置医院网站建设合同范本
  • icp备案域名网站备案信息网站联盟的基本流程
  • 男和男人怎么做那个视频网站苏州的网络企业
  • 一个网站开发的流程二次开发创造作用
  • 网站怎么做认证免费网站备案号码
  • 西安网站开发的未来发展东莞企业官方网站建设
  • 11. Python 列表: 元素增操作详解
  • 記錄js中的冒泡事件
  • 腾讯云 怎样建设网站域客式单页网站能申请域名吗
  • 西双版纳州住房和城乡建设局网站wordpress注册美化
  • 多种方法找回Root密码详细操作步骤
  • 阿里云服务器建设网站视频网站用什么做的好
  • 大专生工作后还能专升本吗?对职业发展有帮助吗?
  • 棉桃剥壳机做网站重庆网站推广营销
  • 大学生简历免费制作网站互联网备案服务平台
  • 哪些网站用django做的狼雨seo网站排名查询
  • 网站制作公司推荐深圳黑马品牌网站设计
  • 做网站需要字体切换从用户旅程角度做网站分析