STM32-HAL-定时器(无源蜂鸣器的驱动)

这篇具有很好参考价值的文章主要介绍了STM32-HAL-定时器(无源蜂鸣器的驱动)。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

一、蜂鸣器的介绍

  • 有源蜂鸣器:

    有源蜂鸣器内部有一个发声电路,也就是“源”(震荡源,与无源蜂鸣器的区别),只要通电就可以响。

  • 无源蜂鸣器:

    无源蜂鸣器相当于扬声器,无源蜂鸣器直接接直流电,只在刚接触和离开的时候发声(利用电磁感应现象,通电、断电时推动振膜发声),一般使用方波信号源驱动发声。

二、常用的无源蜂鸣器的电路

单片机无源蜂鸣器pwm,STM32,stm32,单片机,嵌入式硬件

1、从电路图中可以看出,蜂鸣器的驱动源来自单片机的定时器4的通道2产生的PWM方波

2、其中添加了IN4148二极管为的是再使用方波信号源驱动时,防止突然断电产生的高压反向电动势击穿其他的原件以及使用寿命的缩短。

3、其中使用的SS8085三极管作为开关器件使用,当基极电压为高电平时,三极管处于饱和状态,电路通电。

三、测试准备

  • 基于STM32F407VGT6的网络开发板(其他也可)
  • 安装windows系统并安装CubemxKeil MDK的电脑

四、初始化片上外设

4.1 初始化定时器4的通道2为PWM输出模式

单片机无源蜂鸣器pwm,STM32,stm32,单片机,嵌入式硬件设置定时器4的Clock Source Internal Clock

  • 时钟源设置为外部高速时钟

单片机无源蜂鸣器pwm,STM32,stm32,单片机,嵌入式硬件
【重要】查看开发板的板载晶振的频率(根据自己的开发板的晶振频率设置),因此设置输入的时钟的频率为25Hz,经过分频后最后设置频率为最大168MHz

  • 时钟树设置,经过分频、倍频后

单片机无源蜂鸣器pwm,STM32,stm32,单片机,嵌入式硬件
经过代码查看,在"stm32f4xx_hal_rcc_ex.h" 头文件中,定时器4所在的时钟桥为APB1,查看时钟树后定时器4所在的外设桥时钟频率为84MHz.

单片机无源蜂鸣器pwm,STM32,stm32,单片机,嵌入式硬件

  • 针对TIM4-Channel2 -PWM生成进行参数设置
Internal Clock 内部时钟源,即晶振震荡源作为时钟
PWM Generation CH2 PWM输出为通道2
Prescaler-(16位计数) 定时器的分频系数(PSC):84-1
Counter Mode 向上计数模式:UP
Counter Period-(16位计数) 自动重装载值(ARR):1000 - 1
Internal Clock Division(CKD) 不分频,频率非很高:No Division
auto-reload-preload 自动重装载:Enable
Mode PWM mode 1 向上计数
Plus (CCR)寄存器值:500
CH Polarity PWM极性,初始电平为下降沿

单片机无源蜂鸣器pwm,STM32,stm32,单片机,嵌入式硬件

PWM的频率计算式

单片机无源蜂鸣器pwm,STM32,stm32,单片机,嵌入式硬件

定时器的计数频率计算式

单片机无源蜂鸣器pwm,STM32,stm32,单片机,嵌入式硬件

设置后的PWM的频率为PWM-Freq = 84MHz / (84*1000) = 1kHz
时钟的计数频率为 CLK_CNT = Clcok-Freq / (PSC + 1) = 1MHz
计数一次的时间为 1 / CLK_CNT = (PSC + 1) / Clock-Freq = 1 / 1MHz = 1us
完成一次整周期的计数时间为 (ARR + 1)*1us = 1000 * 1uS = 1ms
高点评占空时间为CCR * 1us = 500us
设置的CCR值为 500 因此占空比为 500 / 1000 = 50%
  • 设置生成Keil- MDK代码文件

4.2 编写驱动代码

简单写两个函数可以表达意思即可。

[设置定时器的CCR寄存器的值]
#define BELL_PWM_FREQ                   2000000

void beep_SetFreq(uint16_t freq)
{	
	uint32_t Period = BELL_PWM_FREQ / freq;
	uint16_t Pulse  = Period  / 2;
	
	 HAL_TIM_PWM_Init(&htim4);// 初始化定时器的PWM模式
	
	 HAL_TIM_PWM_Start(&htim4,TIM_CHANNEL_2);// 启动定时器的PWM模式	
	 
	/* Set the Autoreload value , frequency*/
	
	/*设置频率和占空比*/
	
	__HAL_TIM_SET_AUTORELOAD (&htim4, Period - 1);
	
	__HAL_TIM_SET_COMPARE(&htim4,TIM_CHANNEL_2,Pulse);	
}

void beep_off(void)
{	
	HAL_TIM_PWM_Stop(&htim4,TIM_CHANNEL_2);// 停止定时器的PWM输出
}

void beep_on(void)
{
	beep_SetFreq(2000);//设置自动重装载值为2000 ARR寄存器的值为1000 占空比为50%
	HAL_Delay(1000);
	beep_off();
}

  /* USER CODE BEGIN 2 */
 	beep_on();
  /* USER CODE END 2 */


[result]
鸣响一秒后结束
修改不同的值会得到不同频率的鸣叫声

4.3 Logic分析仪查看波形

逻辑分析仪分析的波形的PWM参数设置是基于代码修改的

  • ARR = 2000 000/2000 - 1 = 1000 - 1
  • CCR = 1000 / 2 = 500
  • PWM-Freq = 84M / (1000 * 84) = 1kHz
  • Duty = 500 / 1000 = 50%

单片机无源蜂鸣器pwm,STM32,stm32,单片机,嵌入式硬件

4.4 代码分析

__HAL_TIM_SET_AUTORELOAD (&htim4,Pulse - 1);	

这是一个宏定义,用于设置STM32中的定时器的自动重装载寄存器的值,从而实现定时器的计数周期。

  • &htim4 是定时器4的句柄,表示要设置的定时器。
  • Period 表示要设置的定时器计数周期的值,单位为定时器时钟周期数。
__HAL_TIM_SET_COMPARE(&htim4,TIM_CHANNEL_2,Pulse);	

这是一个宏定义,用来设置STM32中的定时器的比较值,从而实现定时器的计数和输出控制。

  • &htim4 是定时器4的句柄,表示要设置的定时器。
  • TIM_CHANNEL_2 表示要设置的定时器通道,表示比较输出的通道。
  • Pulse 表示要设置的比较值,用于控制定时器的输出和计数。

使用时需要先配置好定时器的基本参数,如时钟源、分频系数、计数方式等,然后再使用宏定义来设置自动重装载寄存器的值和比较值,从而实现定时器的计数周期控制和计数输出控制。文章来源地址https://www.toymoban.com/news/detail-627716.html

到了这里,关于STM32-HAL-定时器(无源蜂鸣器的驱动)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • stm32——hal库学习笔记(定时器)

    使用纯软件(CPU死等)的方式实现定时(延时)功能 使用精准的时基,通过硬件的方式,实现定时功能 递增计数模式实例说明 中心对齐模式实例说明 TIM6 和TIM7 控制寄存器 1(TIMx_CR1) TIM6 和TIM7 DMA/中断使能寄存器(TIMx_DIER) TIM6 和TIM7 状态寄存器(TIMx_SR) TIM6 和TIM7 计数器(TIMx_CNT)

    2024年02月21日
    浏览(47)
  • # HAL库STM32常用外设教程(四)—— 定时器 基本定时

    1、STM32F407ZGT6 2、STM32CubeMx软件 3、keil5 内容简述: 通篇文章将涉及以下内容,如有错误,欢迎指出 : 1、基础定时器特性 2、基础定时器的结构和功能 3、基础定时器HAL库驱动程序 (1)CubeMx配置 (2)TIM驱动程序   STM32F407有2个高级控制定时器(TIM1、TIM8)、8个通用定时器和

    2024年02月02日
    浏览(58)
  • STM32-PWM驱动无源蜂鸣器播放音乐(附网盘代码)

    一、工作原理: 1.利用STM32的定时器PWM输出通道,驱动蜂鸣器以特定频率发声,实现播放音乐的效果。 2.C调音符与频率对照表: 3.以下为常用的七声音阶频率(Hz): #define  MC         262    Do #define  MD         294    Re #define  ME         330     Mi #define  MF   

    2024年02月07日
    浏览(40)
  • 【STM32F103】谁在用蜂鸣器弹奏一曲东风破(无源蜂鸣器&PWM)

    蜂鸣器一般可以分为两种,一种是有源蜂鸣器,另一种是无源蜂鸣器。 有源蜂鸣器中的源是指震荡源,也就是给了电压再给个触发信号就会以固定的频率发出声响。 而无源蜂鸣器内部没有震荡源,我们可以将触发信号的频率传给无源蜂鸣器,这样就可以发出不同音阶的声响

    2024年01月19日
    浏览(37)
  • STM32 HAL库 STM32CubeMX -- TIM(定时器中断)

    STM32F1 系列中,除了一些特殊的型号,大部分F1有8 个定时器,分为 基本定时器,通用定时器和高级定时器 。 基本定时器TIM6 和TIM7 是一个16 位的只能向上计数的定时器,只能定时,没有外部IO。 通用定时器TIM2/3/4/5 是一个16 位的可以向上/下计数的定时器,可以定时,可以输出

    2024年02月16日
    浏览(66)
  • STM32 hal库编程定时器计数清零

    1、stm32定时器是有重装载功能的,所以定时器中断不关的话,就不需要计数清零 2、主要是应对单次计时使用,可能因为没有清零导致程序再次运行到相同位置时,中断立即出发,没有完成计时的功能。 顺便加一个读取定时器计数值得函数

    2024年02月03日
    浏览(48)
  • STM32 HAL库开发——入门篇(2):定时器

    一、TIMER定时器概述 1.1 软件定时原理 1.2 定时器定时原理 1.3 STM32定时器分类 1.4 STM32定时器特性表 1.5 STM32基本、通用、高级定时器功能整体的区别 二、基本定时器 2.1 基本定时器简介 2.3 STM32定时器计数模式及溢出条件 2.4 定时器中断实验相关寄存器 2.5 定时器溢出时间计算方

    2024年02月10日
    浏览(88)
  • 【STM32】HAL库-系统滴答定时器SysTick

    SysTick定时器被捆绑在NVIC中,是一个简单的定时器,对于CM3、CM4内核芯片,都有Systick定时器。Systick定时器常用来做延时,或者实时系统的心跳时钟。这样可以节省MCU资源,不用浪费一个定时器。 Systick定时器就是系统滴答定时器,一个 24 位的倒计数定时器 ,计到0 时,将从

    2023年04月08日
    浏览(40)
  • STM32 HAL库 STM32CubeMX -- TIM(定时器输入捕获)

    输入捕获可以对 输入的信号的上升沿、下降沿或者双边沿进行捕获 ,常用的有 测量输入信号的脉宽 和 测量PWM 输入信号的频率 和 占空比 这两种。 输入捕获的原理 就是,当捕获到信号的跳变沿的时候,把计数器CNT 的值锁存到捕获寄存器CCR 中,把前后两次捕获到的CCR 寄存

    2023年04月14日
    浏览(96)
  • STM32 hal库使用笔记(二)中断—定时器中断

    目录 一、定时器简介 二、HAL库配置 1.时钟树的配置 2. CubeMX的配置 三、代码编写 四、拓展实验 五、实验效果 实验目的:利用定时器6控制LED灯的亮灭,间隔500ms 实验平台:正点原子精英板 一、定时器简介     定时器可以对输入的时钟进行计数,并在计数值达到设定值时触发

    2024年01月19日
    浏览(47)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包