creep 发表于 2017-4-20 21:47:12

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

本帖最后由 creep 于 2017-4-20 21:50 编辑

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

1、LPTIM    LSI
STML496的LPTIM时钟配置可以有多种选择:

LPTIM可以使用内部的时钟APB、LSI、LSE、或者HSI也可以使用从input输入的外部时钟。

LPTIM支持的低功耗模式很多,可以在多种低功耗模式下输出PWM信号。


下面我们要测试的就是LPTIM在STOP模式下输出PWM,首先是使用内部的LSI,在初始化的时候要选择内部时钟设置LSI作为LPITM的时钟源。
<font face="微软雅黑" size="3">if (LSI_ClockEnable() != HAL_OK)
{
    while(1);
}

RCC_PeriphCLKInitStruct.PeriphClockSelection = RCC_PERIPHCLK_LPTIM1;
RCC_PeriphCLKInitStruct.Lptim1ClockSelection = RCC_LPTIM1CLKSOURCE_LSI;
HAL_RCCEx_PeriphCLKConfig(&RCC_PeriphCLKInitStruct);</font>

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




2、LPTIM LSE

如果使用LSE作为LPTIM的时钟就要使用下面的时钟设置:
RCC_PeriphCLKInitStruct.PeriphClockSelection = RCC_PERIPHCLK_LPTIM1;
RCC_PeriphCLKInitStruct.Lptim1ClockSelection = RCC_LPTIM1CLKSOURCE_LSE;
HAL_RCCEx_PeriphCLKConfig(&RCC_PeriphCLKInitStruct);此外还要在初始化系统时钟的时候配置LSE
__HAL_RCC_PWR_CLK_ENABLE();
      HAL_PWR_EnableBkUpAccess();
      __HAL_RCC_LSE_CONFIG(RCC_LSE_ON); 设置Autoreload 为99,Pulse value为49这样占空比设置为50%,输出频率为32768/100=327hz
实际输出波形如下图,可以看到外部时钟LSE比LSI准确性要好一些。




3、TIM2 输出PWM

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





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




输出结果:
TIM2_CH1:


TIM2_CH2:



4、TIM1输出PWM

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

void Tim1_Init(void)
{

uhPrescalerValue = (uint32_t)(SystemCoreClock / 16000000) - 1;
    /* Initialize TIMx peripheral as follows:
       + Prescaler = (SystemCoreClock / 16000000) - 1
       + Period = (666 - 1)
       + ClockDivision = 0
       + Counter direction = Up
*/
TimHandle.Instance = TIM1;
TimHandle.Init.Prescaler         = uhPrescalerValue;
TimHandle.Init.Period            = PERIOD_VALUE;
TimHandle.Init.ClockDivision   = 0;
TimHandle.Init.CounterMode       = TIM_COUNTERMODE_UP;
TimHandle.Init.RepetitionCounter = 0;
if (HAL_TIM_PWM_Init(&TimHandle) != HAL_OK)
{
    while(1);
}
sConfig.OCMode       = TIM_OCMODE_PWM1;
sConfig.OCPolarity   = TIM_OCPOLARITY_HIGH;
sConfig.OCFastMode   = TIM_OCFAST_DISABLE;
sConfig.OCNPolarity= TIM_OCNPOLARITY_HIGH;
sConfig.OCNIdleState = TIM_OCNIDLESTATE_RESET;
sConfig.OCIdleState= TIM_OCIDLESTATE_RESET;
/* Set the pulse value for channel 1 */
sConfig.Pulse = PULSE1_VALUE;
if (HAL_TIM_PWM_ConfigChannel(&TimHandle, &sConfig, TIM_CHANNEL_1) != HAL_OK)
{
    /* Configuration Error */
    while(1);
}

/* Set the pulse value for channel 2 */
sConfig.Pulse = PULSE2_VALUE;
if (HAL_TIM_PWM_ConfigChannel(&TimHandle, &sConfig, TIM_CHANNEL_2) != HAL_OK)
{
    /* Configuration Error */
   while(1);
}

if (HAL_TIM_PWM_Start(&TimHandle, TIM_CHANNEL_1) != HAL_OK)
{
   while(1);
}
/* Start channel 2 */
if (HAL_TIM_PWM_Start(&TimHandle, TIM_CHANNEL_2) != HAL_OK)
{
   while(1);
}
}输出PWM:
TIM1-CH1


TIM2-CH2


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

测试代码:





相关阅读:

【NUCLEO-L476RG开发】LPTIM在STOP1模式下输出PWM



哈佛祖安智 发表于 2017-4-20 22:39:18

啥示波器?USB的?

creep 发表于 2017-4-21 07:09:22

哈佛祖安智 发表于 2017-4-20 22:39
啥示波器?USB的?

最便宜的逻辑分析仪。

congsp 发表于 2018-11-3 19:23:53

谢谢分享
页: [1]
查看完整版本: 【NUCLEO-L496ZG评测】+ LPTIM/TIM2/TIM1输出PWM测试