首页 > 其他分享 >STM32CubeMX之定时器PWM输出

STM32CubeMX之定时器PWM输出

时间:2022-11-26 11:01:54浏览次数:68  
标签:定时器 HAL TIMx STM32CubeMX htim4 TIM PWM

STM32CubeMX之定时器PWM输出

1.知识百科 -- PWM简介      

​      PWM是一种对模拟信号电平进行​​​​数字编码​​​​​的方法。通过高​​​​分辨率​​​​计数器的使用,方波的占空比被调制用来对一个具体​​​​模拟信号​​​​的电平进行编码。PWM信号仍然是数字的,因为在给定的任何时刻,满幅值的直流供电要么完全有(ON),要么完全无(OFF)。电压或电流源是以一种通(ON)或断(OFF)的重复脉冲序列被加到模拟负载上去的。通的时候即是直流供电被加到负载上的时候,断的时候即是供电被断开的时候。只要带宽足够,任何模拟值都可以使用PWM进行编码。

      脉宽调制(PWM,Pulse Width Modulation)是利用微处理器的数字输出来对模拟电路进行控制的一种非常有效的技术,广泛应用在从测量、通信到功率控制与变换的许多领域中 。

      ​PWM的一个优点是从处理器到​​​被控系统​​​信号都是数字形式的,再进行数模转换。可将噪声影响降到最低(可以跟电脑一样)。噪声只有在强到足以将逻辑1改变为逻辑0或将逻辑0改变为逻辑1时,也才能对数字信号产生影响。

2.STM32定时器PWM输出简介

     定时器脉冲宽度调制模式可以产生一个由TIMx_ARR寄存器确定频率、由TIMx_CCRx寄存器确定占空比的信号。在TIMx_CCMRx寄存器中的OCxM位写入’110’(PWM模式1)或’111’(PWM模式2),能够独立地设置每个OCx输出通道产生一路PWM。必须设置TIMx_CCMRx寄存器OCxPE位以使能相应的预装载寄存器,最后还要设置TIMx_CR1 寄存器的ARPE位, (在向上计数或中心对称模式中)使能自动重装载的预装载寄存器。
      仅当发生一个更新事件的时候,预装载寄存器才能被传送到影子寄存器,因此在计数器开始计数之前,必须通过设置TIMx_EGR寄存器中的UG位来初始化所有的寄存器。OCx的极性可以通过软件在TIMx_CCER寄存器中的CCxP位设置,它可以设置为高电平有效或低电平有效。 TIMx_CCER寄存器中的CCxE位控制OCx输出使能。

2.1 PWM模式介绍

     在计数器向上计数模式下(即TIMx_CR1的DIR位为0) ,当TIMx_CNT<TIMx_CCRx时PWM信号参考OCxREF为高,否则为低。如果TIMx_CCRx中的比较值大于自动重装载值(TIMx_ARR),则OCxREF保持为’1’。如果比较值为0,则OCxREF保持为’0’。 下图为TIMx_ARR=8(ARR重装载寄存器,表示定时器的计数周期)时边沿对齐的PWM波形实例。

STM32CubeMX之定时器PWM输出_HAL库

      在PWM模式1 ,当TIMx_CNT>TIMx_CCRx 时参考信号OCxREF为低 , 否 为高 。 如果TIMx_CCRx中的比较值大于TIMx_ARR中的自动重装载值,则OCxREF保持为’1’。该模式下不能产生0%的PWM波形。

PWM模式2则刚好与PWM模式1相反,在向上计数时,一旦TIMx_CNT<TIMx_CCR1 时通道1 为无效电平,否则为有效电平;在向下计数时,一旦TIMx_CNT>TIMx_CCR1 时通道1 为有效电平(TIMx_CCER的CC1P位=0时有效电平为高电平),否则为无效电平。

3.通过PWM产生呼吸灯示例

3.1 硬件接口

  本硬件平台有3个LED灯分别为LED2、LED3、LED4LED2接PA1,LED2接PB8,LED4接PB9,硬件​​原理图​​如下:

STM32CubeMX之定时器PWM输出_HAL库_02

  根据STM32引脚定义手册或者STM32CUbeMX软件我们可得知定时器4的CH1和CH2对应外部引脚PB8和PB9。

STM32CubeMX之定时器PWM输出_KEIL仿真_03

3.2 软件设计

  打开STM32CubeMX工具,配置定时器4,将PB8配置为定时器4通道3(复用推挽输出),PB9配置为定时器4通道4(复用推挽输出)。

STM32CubeMX之定时器PWM输出_呼吸灯_04

STM32CubeMX之定时器PWM输出_PWM_05

  3.3 定时器4 基本配置及PWM模式配置

      配置定时器通道模式为PWM模式,设置分频系数为72,重装载值为500,设置有效电平为低电平。

STM32CubeMX之定时器PWM输出_HAL库_06

3.4 参数说明

模式

说明

Input capture direct mode

输入捕获直接模式

Input capture indirectmode

输入捕获间接模式

Input capture triggered by TRC

输入捕获触发器模式

Output compare no output

输出比较(冻结模式000 )

Output compare CH3

输出比较(001)

PWM Generation No output

PWM产生无输出

PWM Generation CH3

PWM输出到CH3

CH3 Combined channels

联合通道

xor activation

定时器输入异或模式

      配置通道工作模式:输出比较(001)

STM32CubeMX之定时器PWM输出_KEIL仿真_07

4.代码生成

/* TIM4 init function */
void MX_TIM4_Init(void)
{
TIM_ClockConfigTypeDef sClockSourceConfig = {0};
TIM_MasterConfigTypeDef sMasterConfig = {0};
TIM_OC_InitTypeDef sConfigOC = {0};

htim4.Instance = TIM4;//定时器4
htim4.Init.Prescaler = 72-1;//分频系数72分频
htim4.Init.CounterMode = TIM_COUNTERMODE_UP;//向上计数方式
htim4.Init.Period = 500;//重装装载值
htim4.Init.ClockDivision = TIM_CLOCKDIVISION_DIV1;//无时钟分频
htim4.Init.AutoReloadPreload = TIM_AUTORELOAD_PRELOAD_ENABLE;//自动重装载预装载使能
if (HAL_TIM_Base_Init(&htim4) != HAL_OK)//初始化定时器
{
Error_Handler();
}
sClockSourceConfig.ClockSource = TIM_CLOCKSOURCE_INTERNAL;
if (HAL_TIM_ConfigClockSource(&htim4, &sClockSourceConfig) != HAL_OK)
{
Error_Handler();
}
if (HAL_TIM_PWM_Init(&htim4) != HAL_OK)
{
Error_Handler();
}
sMasterConfig.MasterOutputTrigger = TIM_TRGO_RESET;
sMasterConfig.MasterSlaveMode = TIM_MASTERSLAVEMODE_DISABLE;
if (HAL_TIMEx_MasterConfigSynchronization(&htim4, &sMasterConfig) != HAL_OK)
{
Error_Handler();
}
sConfigOC.OCMode = TIM_OCMODE_PWM1;//PWM模式1,CNT<CCR为有效电平
sConfigOC.Pulse = 0;//占空比
sConfigOC.OCPolarity = TIM_OCPOLARITY_LOW;//有效电平时间
sConfigOC.OCFastMode = TIM_OCFAST_ENABLE;//快速比较使能
if (HAL_TIM_PWM_ConfigChannel(&htim4, &sConfigOC, TIM_CHANNEL_3) != HAL_OK)//PWM模式初始化
{
Error_Handler();
}
if (HAL_TIM_PWM_ConfigChannel(&htim4, &sConfigOC, TIM_CHANNEL_4) != HAL_OK)
{
Error_Handler();
}
HAL_TIM_MspPostInit(&htim4);//硬件层初始户化

}
  • TIM4基本功能配置

STM32CubeMX之定时器PWM输出_KEIL仿真_08

  • PWM模式配置:

STM32CubeMX之定时器PWM输出_HAL库_09

  • PB8、PB9引脚配置和PWM模式使能
HAL_TIM_PWM_Start(timHandle,TIM_CHANNEL_3);//初始化通道3
HAL_TIM_PWM_Start(timHandle,TIM_CHANNEL_4);//初始化通道4
  • 引脚模式配置及PWM初始化
void HAL_TIM_MspPostInit(TIM_HandleTypeDef* timHandle)
{

GPIO_InitTypeDef GPIO_InitStruct = {0};
if(timHandle->Instance==TIM4)
{
/* USER CODE BEGIN TIM4_MspPostInit 0 */

/* USER CODE END TIM4_MspPostInit 0 */

__HAL_RCC_GPIOB_CLK_ENABLE();
/**TIM4 GPIO Configuration
PB8 ------> TIM4_CH3
PB9 ------> TIM4_CH4
*/
GPIO_InitStruct.Pin = GPIO_PIN_8|GPIO_PIN_9;
GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;
GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;
HAL_GPIO_Init(GPIOB, &GPIO_InitStruct);

/* USER CODE BEGIN TIM4_MspPostInit 1 */
HAL_TIM_PWM_Start(timHandle,TIM_CHANNEL_3);//启动通道3
HAL_TIM_PWM_Start(timHandle,TIM_CHANNEL_4);//启动通道4
/* USER CODE END TIM4_MspPostInit 1 */
}
}

STM32CubeMX之定时器PWM输出_KEIL仿真_10

5.呼吸灯主函数示例

while (1)
{
/* USER CODE END WHILE */

/* USER CODE BEGIN 3 */
/*实现呼吸灯*/
if(flag==0)i++;
else i--;
if(i>=300)flag=1;
if(i==0)flag=0;
HAL_Delay(3);
htim4.Instance->CCR3=i;//调节占空比
htim4.Instance->CCR4=i;
}

6.HAL库定时器常用函数介绍

  HAL库中定时器基本功能函数源码均在stm32f1xx_hal_tim.c中,高级功能函数在stm32f1xx_hal_tim_ex.c中,本小节主要介绍几个常用函数。(以下列举函数可能需要用户调用或修改)。

/*硬件层初始化:时钟、中断,DMA*/
void HAL_TIM_Base_MspInit(TIM_HandleTypeDef *htim);
/*中断方式开启定时器*/
HAL_StatusTypeDef HAL_TIM_Base_Start_IT(TIM_HandleTypeDef *htim);
/*DMA方式开启定时器*/
HAL_StatusTypeDef HAL_TIM_Base_Start_DMA(TIM_HandleTypeDef *htim, uint32_t *pData, uint16_t Length);
/*开启定时器PWM模式*/
HAL_StatusTypeDef HAL_TIM_PWM_Start(TIM_HandleTypeDef *htim, uint32_t Channel);

/*获取状态*/
HAL_TIM_StateTypeDef HAL_TIM_Base_GetState(TIM_HandleTypeDef *htim);
/*中断方式开启定时器输入捕获功能*/
HAL_StatusTypeDef HAL_TIM_IC_Start_IT(TIM_HandleTypeDef *htim, uint32_t Channel)

7.软件仿真效果展示

  通过KEIL软件仿真,查看产生的脉冲信号,查看引脚电平变化,KEIL软件相关设置:

CPU DLL:SARMCM3.DLL

Dialog DLL:DARMSTM.DLL Parameter:-pSTM32F103C8

STM32CubeMX之定时器PWM输出_PWM_11

  进入仿真模式:

STM32CubeMX之定时器PWM输出_PWM_12

  查看引脚电平变化波形:

STM32CubeMX之定时器PWM输出_HAL库_13

STM32CubeMX之定时器PWM输出_HAL库_14

  波形效果:

STM32CubeMX之定时器PWM输出_HAL库_15

标签:定时器,HAL,TIMx,STM32CubeMX,htim4,TIM,PWM
From: https://blog.51cto.com/u_15688123/5888734

相关文章

  • STM32CubeMX之外部中断
    STM32CubeMX之外部中断1.中断简介​​   中断,是指处理机处理程序运行中出现的紧急事件的整个过程。程序运行过程中,系统外部、系统内部或者现行程序本身若出现紧急事件......
  • STM32CubeMX之RTC电子钟
    STM32CubeMX之RTC电子钟1.RTC简介  实时时钟是一个独立的定时器。RTC模块拥有一组连续计数的计数器,在相应软件配置下,可提供时钟日历的功能。修改计数器的值可以重新设置......
  • stm32f030f4p6_定时器1应用
    坑人的PDF框图显示TIM1,2,3,6,14,15,16,17都在APB1上,然而它却在APB2才可以运行。可是在PDF框图和STM32CubeMX中都找不到APB2的存在却在stm32f0xx_rcc.h中找到了APB2的踪......
  • 303-Air724UG(4G全网通GPRS)开发-定时器
    <p><iframename="ifd"src="https://mnifdv.cn/resource/cnblogs/LearnAir724UG"frameborder="0"scrolling="auto"width="100%"height="1500"></iframe></p> 程序......
  • BOM_window定时器方法和案例2_轮播图
    BOM_window定时器方法:与定时器有关的方式:setTimeout():在指定的毫秒数后调用函数或计算表达式。参数:1.js代码或者方法对象2.毫秒值返回值:唯一标识,用于取消定时器clearT......
  • STM32CubeMX输入配置---按键
    STM32CubeMX输入配置---按键  本示例主要讲解IO口输入模式的应用,以按键驱动为例来学校输入模式配置方法。本次实验所用开发板有3个按键,其中一个为复位按键,另外两个则可用......
  • java上位机开发(定时器使用)
    在实际开发中,我们发现有一些任务需要周期性的完成,比如说数据库的检查、设备的检查、状态的检查、变量的检查等等。这个时候就会使用到定时器。在javaswing中,因为本身已经集......
  • win32开发(定时器)
      要说除了鼠标、键盘消息之外,还有什么消息最重要。我想大概是就是定时器了。这定时器可长可短,如果是短定时器的话,那么就可以形成动画,记录成视频。如果是长定时器的话,那......
  • 随想录(编写用户侧定时器)
       定时器是我们在平时开发中经常使用到的工具,特别是在协议的编写上更是必不可少的组成部分。虽然系统本身给我们提供了定时器,但是有的时候,我们也想自己编写一个粗粒度......
  • Go语言中,定时器有 2种 实现方法,分别是什么 ?
    商务合作加微信:LetsFenggoland全家桶激活码,支持所有版本,支持所有系统链接:http://web.52shizhan.cn/activity/s2abxc提取码:GJF9B1DK 现在就开始你的Go语言学习之旅......