一.概要

脉冲宽度调制(PWM),是英文“Pulse Width Modulation”的缩写,简称脉宽调制,是利用单片机数字输出(1或0)来对外部模拟电路进行控制的一种非常有效的技术。
在这里插入图片描述
PWM波主要应用场景:
电机控制
PWM信号可以用来控制直流电机的转速和位置,实现对电机的精确控制。在无刷直流电机(BLDC)和步进电机中,利用PWM调制可以充分发挥电子设备的精确度和能效。

LED灯光调光
PWM信号可用于调控LED灯的亮度。通过改变PWM信号的占空比(on-time和off-time的比值),可以实现对LED灯光的调光操作,达到节能和避免眩光的效果。

电源管理
采用PWM技术的开关稳压器(如降压转换器)在电源管理中具有广泛的应用。

音频放大器
在数字音频放大器中,PWM信号用于控制音频信号的放大和调制。

混合动力电动汽车(HEV)和电动汽车(EV)
PWM信号用于控制电池充放电和电动机的驱动管理,提高电池的使用性能和寿命。

伺服系统
在伺服系统中,PWM信号用于传输伺服电机的控制信号,实现对伺服电机的精确控制。

二.PWM输出波形框架图

定时器部分框图如下,其中PWM相关的主要是基本定时器和PWM输出控制部分,基本定时器主要控制PWM输出的频率,PWM控制部分主要控制PWM输出的占空比。
在这里插入图片描述

PWM输出控制部分信号流向如下图所示
在这里插入图片描述
主要寄存器
1.TIMx_CCR1
捕获比较(值)寄存器(x=1,2,3,4):设置比较值。

2.TIMx_CNT
计数器值与捕获比较寄存器CCR1进行比较,通过比较结果输出有效电平和无效电平 。

3.TIMx_ARR
自动重装载寄存器,计数器(TIMx_CNT)开始计数,直到计数器(TIMx_CNT)达到TIMx_ARR中存放的值后,重新回到0,依次循环 。

在PWM工作模式下,引入一个寄存器CCRx,这个寄存器用于控制PWM输出波的有效电平长度(占空比),假定定时器工作在向上计数 PWM模式,且当 CNT<CCRx 时,输出 0,当 CNT>=CCRx 时输出 1。当 CNT 达到 ARR 值的时候,重新归零,然后重新向上计数,依次循环。改变 CCRx 的值,就可以改变 PWM 输出的占空比,改变 ARR 的值,就可以改变 PWM 输出的频率。

工作过程如下图所示
在这里插入图片描述

三.PWM输入框架图

定时器部分框图如下,其中PWM相关的主要是基本定时器和PWM输入控制部分。

PWM输入检测部分信号流向如下图所示。
在这里插入图片描述

该模式是输入捕获模式的一个特例,除下列区别外,操作与输入捕获模式相同:
● 两个ICx信号被映射至同一个TIx输入。
● 这2个ICx信号为边沿有效,但是极性相反。
● 其中一个TIxFP信号被作为触发输入信号,而从模式控制器被配置成复位模式。

在这里插入图片描述

周期,占空比测量如下图所示:
TI1为输入PWM波信号波形,TIMx_CNT为计数器计数值,当第一个下降沿信号到来,IC2会先进行捕获,然后到下一个上升沿到来,IC1进行捕获!在捕获的同时,IC1和IC2会把CNT的值映射到对应的CCR1、CCR2的寄存器里面,这个值就是我们需要的计数值!
那么我们所需测量的周期就是IC1捕获的值,脉冲宽度即为IC2测量的值。

在这里插入图片描述

四.CubeMX配置一个TIME输出1KHZ,占空比50%PWM波,并且带输入采集的例程

1.硬件准备

STLINK接STM32G474RET6开发板,STLINK接电脑USB口,一台波形测量仪接PA10脚跟GND,用杜邦线把PA9与PA10接起来。
在这里插入图片描述

2.创建CubeMX工程

如下图所示,打开STM32CubeMX软件,新建工程。
在这里插入图片描述
如下图所示,Part Number处输入STM32G474RE,再双击就创建新的工程。
在这里插入图片描述

如下图所示,配置下载口引脚,PA13为SWD的SWDIO脚,PA14为SWD的SWCLK脚。
在这里插入图片描述

如下图所示,配置TIM2_CH4为PWM输出,PA10引脚作为输出脚,周期为1ms,高电平脉冲时间为500us,所以占空比为50%。
在这里插入图片描述
如下图所示,配置TIM1_CH2为PWM输入,PA9引脚作为输入脚,选择TI2FP2,TI2FP2中的“TI2”表示定时器的第2通道输入(Timer Input 2),当选择TI2FP2作为触发源时,该信号会用于控制定时器的计数过程,TI2FP2的有效边沿可以触发定时器计数器复位,从而实现对输入信号的特定事件(如脉冲宽度、周期)的测量。通道2采样的是周期,通道1采样的是占空比。
在这里插入图片描述
如下图所示,中断使能。
在这里插入图片描述

如下图所示,配置系统主频170Mhz,使用内部16MHZ晶振。
在这里插入图片描述

配置工程文件名,保存路径,KEIL5工程输出方式,生成工程。
在这里插入图片描述
在这里插入图片描述

如下图所示,增加代码,添加PWM输入与输出使能。
在这里插入图片描述

如下图所示,增加代码,添加PWM输入捕获回调函数void HAL_TIM_IC_CaptureCallback(TIM_HandleTypeDef *htim),采集占空比与周期。
在这里插入图片描述

主要代码如下

/* Captured Value */
__IO uint32_t            uwIC2Value = 0;
/* Duty Cycle Value */
__IO uint32_t            uwDutyCycle = 0;//占空比
/* Frequency Value */
__IO uint32_t            uwFrequency = 0;//频率
/* USER CODE END PV */
//输入捕捉中断服务程序
void HAL_TIM_IC_CaptureCallback(TIM_HandleTypeDef *htim)
{
  if (htim->Channel == HAL_TIM_ACTIVE_CHANNEL_2)
  {
    uwIC2Value = HAL_TIM_ReadCapturedValue(htim, TIM_CHANNEL_2);//读取捕获到上升沿的计数值,就是周期的计数
    if (uwIC2Value != 0)
    {
      uwDutyCycle = ((HAL_TIM_ReadCapturedValue(htim, TIM_CHANNEL_1)) * 100) / uwIC2Value;//高电平时间计数/周期计数就是占空比,单位%
      //定时器基础时钟是1MHZ,初始化的时候分频了
      uwFrequency = (HAL_RCC_GetSysClockFreq()/170) / uwIC2Value;//计数值转成周期频率,单位HZ

    }
    else
    {
      uwDutyCycle = 0;
      uwFrequency = 0;
    }
  }
}
/* USER CODE END PFP */

/* Private user code ---------------------------------------------------------*/
/* USER CODE BEGIN 0 */

/* USER CODE END 0 */

/**
  * @brief  The application entry point.
  * @retval int
  */
int main(void)
{
  /* USER CODE BEGIN 1 */

  /* USER CODE END 1 */

  /* MCU Configuration--------------------------------------------------------*/

  /* Reset of all peripherals, Initializes the Flash interface and the Systick. */
  HAL_Init();//SysTick配置成1ms中断

  /* USER CODE BEGIN Init */

  /* USER CODE END Init */

  /* Configure the system clock */
  SystemClock_Config();//16M内部晶振,170MHZ系统主频

  /* USER CODE BEGIN SysInit */

  /* USER CODE END SysInit */

  /* Initialize all configured peripherals */
  MX_GPIO_Init();
  MX_TIM2_Init();//定时器2初始化,1KHZ,50%占空比
  MX_TIM1_Init();//定时器1初始化,PWM输入,1MHZ
  /* USER CODE BEGIN 2 */
	if(HAL_TIM_PWM_Start(&htim2, TIM_CHANNEL_4) != HAL_OK)//启动PWM波输出
  {
    /* PWM generation Error */
    while(1);
  }
  if (HAL_TIM_IC_Start_IT(&htim1, TIM_CHANNEL_2) != HAL_OK)//定时器1通道2输入捕获使能
  {
    /* Starting Error */
    Error_Handler();
  }
  if (HAL_TIM_IC_Start_IT(&htim1, TIM_CHANNEL_1) != HAL_OK)//定时器1通道1输入捕获使能
  {
    /* Starting Error */
    Error_Handler();
  }
  /* USER CODE END 2 */

  /* Infinite loop */
  /* USER CODE BEGIN WHILE */
  while (1)
  {
    /* USER CODE END WHILE */

    /* USER CODE BEGIN 3 */
		HAL_Delay(100);//等待100ms

  }
  /* USER CODE END 3 */
}

3.测量波形结果

通过波形接收器测量PA10引脚,可以看到PWM输出是1Khz,占空比50%。
在这里插入图片描述
在Keil5环境进入调试程序模式,全速运行,查看Keil5的调试Watch界面,可以看到占空比是49%,
频率是1001HZ,说明采集到的PWM波值跟发送的PWM波一致,测量到的频率与占空比如图所示。
在这里插入图片描述

五.小结

脉冲宽度调制(PWM:Pulse Width Modulation)可以广泛应用于电机控制、灯光的亮度调节、功率控制等领域,所以在那些领域避免不了需要用到PWM输出与输入技能。

Logo

智能硬件社区聚焦AI智能硬件技术生态,汇聚嵌入式AI、物联网硬件开发者,打造交流分享平台,同步全国赛事资讯、开展 OPC 核心人才招募,助力技术落地与开发者成长。

更多推荐