[原创] 【NUCLEO-U083RC】7.LPTIME产生PWM

电子烂人   2024-6-5 22:05 楼主

u0 系列有多个time定时器,但是还没用过LPtime,本次产生个PWM试试

1 . LPTIM、PWM介绍

LPTIM(Low-Power Timer)是ST公司为其STM32微控制器系列提供的一种低功耗定时器。LPTIM是为了在低功耗模式下提供时间测量和生成精准的时序而设计的,特别适用于那些对功耗要求非常严格的场合,比如在停止模式(Stop mode)或待机模式(Standby mode)下。 微信截图_20240605214842.png

LPTIM通常不直接用于生成PWM(Pulse Width Modulation)信号,因为PWM信号通常需要高精度的定时和快速的输出变化,通常由高级定时器(Advanced Timers)或通用定时器(General Purpose Timers)来处理。然而,在某些情况下,LPTIM可以用来生成简单的PWM信号,尤其是在对精度要求不是特别高,且功耗要求非常低的场合。本次设计的应用场景是在使用电池的小型搅拌器中,仅对速度挡位调节。

LPTIM生成PWM的基本原理是利用其比较功能,通过比较寄存器(Compare Register)和自动重装载寄存器(Auto-Reload Register)来控制输出信号的占空比。当LPTIM的计数器值与比较寄存器匹配时,输出电平会发生变化。

例程给出了PWM的计算方式,还是PSR\ARR\CCR老三样:


FrequencyOutput = Counter Clock Frequency / (Autoreload + 1)
DutyCycle = 1 - ((PulseValue + 1)/ (Autoreload + 1))
 

2.初始化

image.png  

 

如图使能lptim 3, 使能通道3,生成代码如下:

static void MX_LPTIM3_Init(void)
{

  /* USER CODE BEGIN LPTIM3_Init 0 */

  /* USER CODE END LPTIM3_Init 0 */

  LPTIM_OC_ConfigTypeDef sConfig1 = {0};

  /* USER CODE BEGIN LPTIM3_Init 1 */

  /* USER CODE END LPTIM3_Init 1 */
  hlptim3.Instance = LPTIM3;
  hlptim3.Init.Clock.Source = LPTIM_CLOCKSOURCE_APBCLOCK_LPOSC;
  hlptim3.Init.Clock.Prescaler = LPTIM_PRESCALER_DIV1;
  hlptim3.Init.Trigger.Source = LPTIM_TRIGSOURCE_SOFTWARE;
  hlptim3.Init.Period = 999;
  hlptim3.Init.UpdateMode = LPTIM_UPDATE_IMMEDIATE;
  hlptim3.Init.CounterSource = LPTIM_COUNTERSOURCE_INTERNAL;
  hlptim3.Init.Input1Source = LPTIM_INPUT1SOURCE_GPIO;
  hlptim3.Init.Input2Source = LPTIM_INPUT2SOURCE_GPIO;
  hlptim3.Init.RepetitionCounter = 0;
  if (HAL_LPTIM_Init(&hlptim3) != HAL_OK)
  {
    Error_Handler();
  }
  sConfig1.Pulse = 499;
  sConfig1.OCPolarity = LPTIM_OCPOLARITY_HIGH;
  if (HAL_LPTIM_OC_ConfigChannel(&hlptim3, &sConfig1, LPTIM_CHANNEL_3) != HAL_OK)
  {
    Error_Handler();
  }
  /* USER CODE BEGIN LPTIM3_Init 2 */

  /* USER CODE END LPTIM3_Init 2 */
  HAL_LPTIM_MspPostInit(&hlptim3);

}

3.测试低功耗下输出PWM

编辑代码,在主函数中添加:

while (1)
  {

    /* USER CODE END WHILE */

    /* USER CODE BEGIN 3 */

	  HAL_LPTIM_PWM_Start(&hlptim3, LPTIM_CHANNEL_3);

  }
  /* USER CODE END 3 */
如图所示,可以在示波器中看到稳定的PWM信号
微信图片_20240605214550.jpg

 

在代码中添加STOP2模式:

while (1)
  {

    /* USER CODE END WHILE */

    /* USER CODE BEGIN 3 */

	HAL_Delay(1000);
	BSP_LED_Toggle(LED_GREEN);
	HAL_LPTIM_PWM_Start(&hlptim3, LPTIM_CHANNEL_3);
	HAL_PWREx_EnterSTOP1Mode(PWR_STOPENTRY_WFI);
	HAL_Delay(10000);//停止10秒
	SystemClock_Config();//重新配置时钟

  }
  /* USER CODE END 3 */
}

生成波形如下:

微信图片_20240605220227.jpg
 
U083RC_LPTIME.zip (8.07 MB)
(下载次数: 0, 2024-6-5 22:04 上传)
本帖最后由 电子烂人 于 2024-6-5 22:04 编辑
没用比没有强

回复评论 (2)

波形看着可以啊,实际应用中对PWM精度要求那么高的情况不太多

在爱好的道路上不断前进,在生活的迷雾中播撒光引
点赞  2024-6-6 09:08
引用: 秦天qintian0303 发表于 2024-6-6 09:08 波形看着可以啊,实际应用中对PWM精度要求那么高的情况不太多

对的,精度要求高的话用高级定时器更好一些

 

没用比没有强
点赞  2024-6-6 14:49
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 京公网安备 11010802033920号
    写回复