搜索
查看: 5455|回复: 3

[STM32L496] 【NUCLEO-L496ZG评测】+ LPTIM/TIM2/TIM1输出PWM测试

[复制链接]

该用户从未签到

60

主题

2111

帖子

31

蝴蝶豆

版主

最后登录
2023-6-21
发表于 2017-4-20 21:47:12 | 显示全部楼层 |阅读模式
本帖最后由 creep 于 2017-4-20 21:50 编辑

        STM32L496外设中有低功耗的LPTIM,这个定时器支持在低功耗模式下工作比如输出PWM,可以将设备从低功耗模式下唤醒的“Timeout functions”。LPTIM拥有灵活的时钟配置可在尽可能减少功耗的情况下实现各种功能。下面我们就简单的测试下该定时器在stop模式下输出PWM。

1、LPTIM    LSI
STML496的LPTIM时钟配置可以有多种选择:
0.png
LPTIM可以使用内部的时钟APB、LSI、LSE、或者HSI也可以使用从input输入的外部时钟。
1.png
LPTIM支持的低功耗模式很多,可以在多种低功耗模式下输出PWM信号。
2.png

下面我们要测试的就是LPTIM在STOP模式下输出PWM,首先是使用内部的LSI,在初始化的时候要选择内部时钟设置LSI作为LPITM的时钟源。
  1. <font face="微软雅黑" size="3">if (LSI_ClockEnable() != HAL_OK)
  2.   {
  3.     while(1);
  4.   }  
  5.   
  6.   RCC_PeriphCLKInitStruct.PeriphClockSelection = RCC_PERIPHCLK_LPTIM1;
  7.   RCC_PeriphCLKInitStruct.Lptim1ClockSelection = RCC_LPTIM1CLKSOURCE_LSI;  
  8.   HAL_RCCEx_PeriphCLKConfig(&RCC_PeriphCLKInitStruct);</font>
复制代码


设置Autoreload 为99,Pulse value为49这样占空比设置为50%,输出频率为32768/100=327hz
实际输出波形如下图,可以看到内部时钟LSI不准确导致输出频率稍有偏差。


Lptime.png

2、LPTIM LSE

如果使用LSE作为LPTIM的时钟就要使用下面的时钟设置:
  1.   RCC_PeriphCLKInitStruct.PeriphClockSelection = RCC_PERIPHCLK_LPTIM1;
  2.   RCC_PeriphCLKInitStruct.Lptim1ClockSelection = RCC_LPTIM1CLKSOURCE_LSE;  
  3.   HAL_RCCEx_PeriphCLKConfig(&RCC_PeriphCLKInitStruct);
复制代码
此外还要在初始化系统时钟的时候配置LSE

  1. __HAL_RCC_PWR_CLK_ENABLE();
  2.         HAL_PWR_EnableBkUpAccess();
  3.         __HAL_RCC_LSE_CONFIG(RCC_LSE_ON);
复制代码
设置Autoreload 为99,Pulse value为49这样占空比设置为50%,输出频率为32768/100=327hz
实际输出波形如下图,可以看到外部时钟LSE比LSI准确性要好一些。


Lptime-LSE.png

3、TIM2 输出PWM

除了LPTIM之外,STM32L496还有其他的基本定时器、通用定时器、高级定时器,作为对比我们使用通用定时器TIM2输出2个通道的PWM波形。
TIM2接在APB1上根据系统时钟配置TIM1的时钟为系统时钟80MHZ。



3.png

通过设置预分频5将TIM2的时钟输出设置为16MHZ,然后设置自动重装值为666,则输出的PWM为16000000/666=24K左右,分别设置TIM2的通道1和通道占空比为1/2(50%)和3/8(37.5%)。使用HAL库初始化代码比较简单:


4.png

输出结果:
TIM2_CH1:

TIM2—ch1.png
TIM2_CH2:
TIM2-ch2.png


4、TIM1输出PWM

TIM1是一个16bit的高级定时器,功能要比基础定时器和高级定时器强大一些,但是作为PWM设置和TIM2差不多。同样TIM1的时钟也是80MHZ,为了对比我们设置TIM1和TIM2同样的配置。初始化配置部分如下:

  1. void Tim1_Init(void)
  2. {
  3.   
  4.   uhPrescalerValue = (uint32_t)(SystemCoreClock / 16000000) - 1;
  5.     /* Initialize TIMx peripheral as follows:
  6.        + Prescaler = (SystemCoreClock / 16000000) - 1
  7.        + Period = (666 - 1)
  8.        + ClockDivision = 0
  9.        + Counter direction = Up
  10.   */
  11.   TimHandle.Instance = TIM1;
  12.   TimHandle.Init.Prescaler         = uhPrescalerValue;
  13.   TimHandle.Init.Period            = PERIOD_VALUE;
  14.   TimHandle.Init.ClockDivision     = 0;
  15.   TimHandle.Init.CounterMode       = TIM_COUNTERMODE_UP;
  16.   TimHandle.Init.RepetitionCounter = 0;
  17.   if (HAL_TIM_PWM_Init(&TimHandle) != HAL_OK)
  18.   {
  19.     while(1);
  20.   }
  21.   sConfig.OCMode       = TIM_OCMODE_PWM1;
  22.   sConfig.OCPolarity   = TIM_OCPOLARITY_HIGH;
  23.   sConfig.OCFastMode   = TIM_OCFAST_DISABLE;
  24.   sConfig.OCNPolarity  = TIM_OCNPOLARITY_HIGH;
  25.   sConfig.OCNIdleState = TIM_OCNIDLESTATE_RESET;
  26.   sConfig.OCIdleState  = TIM_OCIDLESTATE_RESET;
  27.   /* Set the pulse value for channel 1 */
  28.   sConfig.Pulse = PULSE1_VALUE;
  29.   if (HAL_TIM_PWM_ConfigChannel(&TimHandle, &sConfig, TIM_CHANNEL_1) != HAL_OK)
  30.   {
  31.     /* Configuration Error */
  32.     while(1);
  33.   }
  34.   
  35.   /* Set the pulse value for channel 2 */
  36.   sConfig.Pulse = PULSE2_VALUE;
  37.   if (HAL_TIM_PWM_ConfigChannel(&TimHandle, &sConfig, TIM_CHANNEL_2) != HAL_OK)
  38.   {
  39.     /* Configuration Error */
  40.      while(1);
  41.   }
  42.   
  43.   if (HAL_TIM_PWM_Start(&TimHandle, TIM_CHANNEL_1) != HAL_OK)
  44.   {
  45.      while(1);
  46.   }
  47.   /* Start channel 2 */
  48.   if (HAL_TIM_PWM_Start(&TimHandle, TIM_CHANNEL_2) != HAL_OK)
  49.   {
  50.      while(1);
  51.   }
  52. }
复制代码
输出PWM:
TIM1-CH1

TIM1-ch1.png
TIM2-CH2
TIM1-ch2.png

LPTIM作为支持低功耗模式的定时器用在休眠模式下可以实现功能还能节能能耗。TIM1和TIM2作为PWM输出时使用HAL库进行配置非常简单。
测试LPTIM打开了STOP模式休眠,如果不能下载程序请复位开发板或者重新上电后马上进行程序下载。

测试代码:
LPTime_PWM_LSI.rar (1.19 MB, 下载次数: 40)
回复

使用道具 举报

该用户从未签到

64

主题

809

帖子

23

蝴蝶豆

实习版主

最后登录
2021-4-25
发表于 2017-4-20 22:39:18 | 显示全部楼层
啥示波器?USB的?
回复 支持 反对

使用道具 举报

该用户从未签到

60

主题

2111

帖子

31

蝴蝶豆

版主

最后登录
2023-6-21
 楼主| 发表于 2017-4-21 07:09:22 | 显示全部楼层

最便宜的逻辑分析仪。
回复 支持 反对

使用道具 举报

该用户从未签到

1

主题

6

帖子

0

蝴蝶豆

初级会员

最后登录
2019-12-4
发表于 2018-11-3 19:23:53 | 显示全部楼层
谢谢分享
回复

使用道具 举报

您需要登录后才可以回帖 注册/登录

本版积分规则

关闭

站长推荐上一条 /3 下一条

Archiver|手机版|小黑屋|论坛-意法半导体STM32/STM8技术社区

GMT+8, 2024-4-26 04:19 , Processed in 0.194777 second(s), 40 queries .

Powered by Discuz! X3.4

Copyright © 2001-2024, Tencent Cloud.

快速回复 返回顶部 返回列表