stm32定时器实现PWM输出控制无源蜂鸣器(HAL)

发布者:blq0681最新更新时间:2019-03-09 来源: eefocus关键字:stm32  定时器  PWM输出  无源蜂鸣器 手机看文章 扫描二维码
随时随地手机看文章

(一)PWM概念和原理


脉冲宽度调制(PWM),是英文“Pulse Width Modulation"的缩写,简称脉宽调制,是利用微处理器的数字输出来对模拟电路进行控制的一种非常有效的技术。


PWM原理示意图

PWM原理示意图


上图是简单的PWM原理示意图。图中,我们假定定时器工作在向上计数PWM模式,且当CNT


(二)代码示例


环境:STM32F103C8  主频64MHz   TIM3


(1)GPIO初始化


 GPIO_InitStruct.Pin = GPIO_PIN_0;

 GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;  

 GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_HIGH;

 GPIO_InitStruct.Pull = GPIO_PULLUP;

 HAL_GPIO_Init(GPIOB, &GPIO_InitStruct);

(2)PWM相关函数


//---------------------------main.c---------------------------------------

// PWM 输出初始化

// arr:自动重装值  

static void TIM3_PWM_Init(UStoreData *pStoreData)

{

uint32_t liv_Var = Buzzer_Get_Buzzer_Volume(pStoreData->Buzzer_Volume);


if (liv_Var == BUZZER_VOLUME_ABNORMAL)

{

liv_Var = BUZZER_VOLUME_5;

}


TIM3_Handler.Instance = TIM3;

TIM3_Handler.Init.Prescaler = (HAL_RCC_GetPCLK1Freq() << 1) / 200000UL - 1; // 定时器分频:200K

TIM3_Handler.Init.CounterMode = TIM_COUNTERMODE_UP;

TIM3_Handler.Init.Period = BUZZER_PWM_MAX_FRE; // 自动重装载值

TIM3_Handler.Init.ClockDivision = TIM_CLOCKDIVISION_DIV1;

HAL_TIM_PWM_Init(&TIM3_Handler);


TIM3_CH3Handler.OCMode = TIM_OCMODE_PWM1;

TIM3_CH3Handler.Pulse = liv_Var; // 设置比较值,此值用来确定占空比,占空比为50%时,蜂鸣器最响

TIM3_CH3Handler.OCPolarity = TIM_OCPOLARITY_LOW; // 输出比较极性为低

HAL_TIM_PWM_ConfigChannel(&TIM3_Handler, &TIM3_CH3Handler, TIM_CHANNEL_3);

HAL_TIM_PWM_Start(&TIM3_Handler, TIM_CHANNEL_3);

}

 

// 设置TIM通道3的占空比

// compare:比较值

void TIM_SetTIM3Compare3(uint32_t compare)

{

TIM3->CCR3 = compare;

}

 

//---------------------------stm32f1xx_hal_msp.c------------------------------------

 

// 定时器底层驱动,时钟使能,引脚配置

// 此函数会被HAL_TIM_PWM_Init()调用

// htim:定时器句柄

void HAL_TIM_PWM_MspInit(TIM_HandleTypeDef *htim)

{

__HAL_RCC_TIM3_CLK_ENABLE();

}

 


关键字:stm32  定时器  PWM输出  无源蜂鸣器 引用地址:stm32定时器实现PWM输出控制无源蜂鸣器(HAL)

上一篇:FreeRTOS移植到STM32F103步骤与注意事项
下一篇:STM32F103 UART中断接收 DMA发送

推荐阅读最新更新时间:2024-03-16 16:25

stm32和电机开发(直流有刷电机和步进电机)
很多的课程都喜欢把电机原理完完整整讲一遍。但是对于控制的同学,这部分内容是否真的需要值得商榷。做电机控制,大部分都是在学了stm32之类的mcu之后才开始进行的。这部分,不如按照个人认知习惯去学习或许效率更高。 1、直流有刷电机和步进电机 虽然直流无刷电机bldc、pmsm这两类电机似乎更有技术含量一点,但是从学习角度来说,直流有刷电机和步进电机是最合适的。说到直流有刷电机,大家可以把它想象成小时候玩具上的电机。上面会有一个正负极,分别连接在电源两侧。如果是正着接,那么电机就正转;如果反着接,就反转。 步进电机,看的比较多的是二相四线步进电机,可以简单看成两对正负线。如果要步进电机转起来,只需要定时给一定数量的方波即可。比
[单片机]
<font color='red'>stm32</font>和电机开发(直流有刷电机和步进电机)
stm32中的i2c协议编程
在上篇博客中,我已经介绍完了i2c的各种特征,这次就结合师兄给我的编程实例来分析学习。首先i2c协议的编程可以分为硬件i2c和模拟i2c,一般在51之类的低端单片机都是使用模拟i2c(即用软件编程来控制io口上的时序变化以符合i2c协议的biao标准),而在stm32一类的中高端单片机本身就自带可以某些硬件gpio口自动实现i2c协议。下面就分别讨论下两种方式的编程初始化配置过程。 1.1.模拟i2c编程 1.1.1初始化i2c函数 首先i2c协议通信需要两根总线数据线SDA与时钟线SCL,所以我们先选择两个gpio口进行相应初始化。gpio口的初始化过程在之前博客也详细介绍过这里就不过多赘述
[单片机]
<font color='red'>stm32</font>中的i2c协议编程
STM32系列第21篇--DMA
简介: DMA全称DirectMemory Access,即直接存储器访问。 比如串口发送用和不用DMA当然都可以发送。不用DMA发送是需要单片机实时参与,由单片机一个一个地发送数据并进行监控。但是如果用DMA,设置了起始地址,数据大小等参数后,就直接由专门的一个DMA模块进行数据发送,发送过程中单片机无需参与。发送完后会产生中断告知单片机。由此可知用DMA可以节省单片机资源,让单片可以在同一时间里干更多事。 STM32最多有2个DMA控制器(DMA2仅存在大容量产品中),DMA1有7个通道(通道1~通道7)。DMA2有5个通道(通道1~通道5)。每个通道专门用来管理来自于一个或多个外设对存储器访问的请求。还有一个仲裁起来协调各个
[单片机]
<font color='red'>STM32</font>系列第21篇--DMA
STM32学习14:EXTI(外部中断事件控制器)
EXTI管理了控制器的23个中断/事件线。每个中断/事件线都对应有一个边沿检测器,可以实现输入信号的上升沿检测和下降沿的检测。EXTI可以实现对每个中断/事件线进行单独配置,可以单独配置为中断或者事件,以及触发事件的属性。 编程思路: 1、配置NVIC。初始化NVIC(实现过程:先初始化NVIC结构体,再写NVICInit()函数)。 2、配置按键中断。在这个函数中,因为我们要使用IO口作为中断输入, 所以第一步我们要使能相应的IO时钟。(因为GPIO 和中断线映射关系是在寄存器 SYSCFG_EXTICR1~ SYSCFG_EXTICR4 中配置的。所以我们要配置外部中断,还需要打开 SYSCFG 时钟。)第二步,初始
[单片机]
<font color='red'>STM32</font>学习14:EXTI(外部中断事件控制器)
MSP430学习笔记2-跑马灯程序,熟悉定时器寄存器的配置
这个例子主要还是熟悉有关定时器A的寄存器配置以及IAR的配置方式。 /*********************************************** 程序功能:实现流水灯以三种流动方式和四种流动速度 的不同组合而进行点亮 流动 ------------------------------------------------ 拨码开关设置:将LED位拨至ON,其余拨至OFF 测试说明:观察流水灯流动顺序和速度的变化 ************************************************/ #include msp430x14x.h typedef unsig
[单片机]
stm32初始化流程图解析
  STM32系列基于专为要求高性能、低成本、低功耗的嵌入式应用专门设计的ARM Cortex-M3内核。   stm32参数:   12V-36V供电   兼容5V的I/O管脚   优异的安全时钟模式   带唤醒功能的低功耗模式   内部RC振荡器   内嵌复位电路   工作温度范围:-40°C至+85°C或105°C   stm32特点:   内核:ARM32位Cortex-M3 CPU,最高工作频率72MHz,1.25DMIPS/MHz。单周期乘法和硬件除法。   存储器:片上集成32-512KB的Flash存储器。6-64KB的SRAM存储器。时钟、复位和电源管理:2.0-3.6V的电源供电和I/O接口的驱动电压。上电
[单片机]
<font color='red'>stm32</font>初始化流程图解析
Stm32用寄存器还是库函数
首先放几段网友的观点 1、我当年初学的时候也纠结过,后来选择了先学习寄存器操作,后来慢慢的把库函数也学会了,其实都不难。完全可以两个都学,只是你现在选一个先下手而已。 建议你先学寄存器操作,然后学库,以后工作中尽量使用库。 先学寄存器是因为你从51过渡过来,51也是直接控制寄存器,趁你还没有忘记怎么操作寄存器的时候趁热打铁。 用库函数用习惯了你会发现自己会越做越快,但是知其然不知其所以然的感觉很糟糕,这时你再去学寄存器会感觉非常繁琐,完全学不进去。 所以,先学寄存器操作,再学库函数操作。 两个都学是必要的,有时候做工业控制的项目有严格的实时性要求,你用库函数会使速度变慢,这时你得用寄存器。其他时候能用库尽量
[单片机]
STM32系列里RTC的亚秒特性及功能(下)
我们回到前面提到的需求,每隔50±20ms做唤醒,即30ms~70ms范围内实现唤醒都可以接受。如果说使用ALARM中断,相信很多人自然会想到,先设定一个ALARM点,等唤醒后再修改新的ALARM值,就这样延续下去。 这样操作也是可以的,即每次在ALARM中断里修改新的ALARM时间点。下图是对ALARM值进行编程的流程【设置时先要关闭ALARM,修改ALARM值后再手动开启ALARM单元】: 不过,结合眼前的应用需求,我们可以不使用上面的做法,而是巧妙地使用RTC亚秒特性来实现周期性的ALARM以满足需求。怎么个巧法呢?一起来看看。 先假定RTCCLK为32768Hz,RTC同步分频系数和异步分频系数分别为如下参数:
[单片机]
小广播
添点儿料...
无论热点新闻、行业分析、技术干货……
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved