社区导航

 

搜索
查看: 330|回复: 0

[原创] 【 ST NUCLEO-G071RB测评】TIM-PWM

[复制链接]

720

TA的帖子

0

TA的资源

一粒金砂(高级)

Rank: 3Rank: 3

发表于 2019-1-12 12:14 | 显示全部楼层 |阅读模式
       本次实验使用的NUCLEO-G071RB开发板由https://www.stmcu.com.cn/index.p ... /261/layout/product提供,更多相关资讯请进入查询。本次实验是利用NUCLEO-G071RB开发板的通用定时器TIM2模块四个通道输出PWM,TIM2_CH1被配置在PA5引脚,输出占空比可变的PWM驱动LD4产生呼吸灯效果;另外的TIM2_CH2、TIM2_CH3、TIM2_CH4被分配至PA1、PA2、PA3引脚,输出占空比为25%、50%、75%的PWM波型,并通过逻辑分析仪测试验证。
一、实验资源
1、NUCLEO-G071RB开发板;
2、Keil v5.25.2.0;
3、STM32CubeMX v5.0.1;
4、逻辑分析仪;

二、实验过程
1、资源简介
       在STM32G0071RBT6中共有6个通用定时器,包括TIM2, TIM3, TIM14, TIM15, TIM16, TIM17。其中TIM2是通用带有32位可重加载向上/向下计数定时器,而其它的均为16位。这些定时器较之基本定时器(TIM6、TIM7)无论是在功能及性能都强大了许多。利用其输入捕获功能可以测量输入信号脉冲宽度及频率,或者利用输出比较和PWM功能输出波型。这些功能使得定时器有着非常广泛的用途。
QQ截图20190112104656.png
QQ截图20190112104431.png

2、工程配置
      这里依然是采用STM32CubeMX配置并生成工程文件,之所以选择TIM2是因为LD4接在了PA5引脚,PA5可复用为TIM2_CH1,这样就可以直接利用LD4测试PWM输出了,其它三个PWM输出通道也被配置在了GPIOA的PA1、PA2、PA3;时钟直接选用HSI;TIM2向上计数;PWM输出极性为高,其它的一些配置直接按默认了,具体的参数准备在工程文件调试时根据情况再修改。
QQ截图20190112105228.png
QQ截图20190112105255.png

3、软件实现
      从通用计时器框架图中可以看出,TIM2的计数时钟来自于内部时钟,TPCLK时钟为16MHz经预分频器(CK_PSC)分频(16MHz/160=100KHz)后为TIM2提供计数脉冲。TIM2_CNT以此频率开始向上计数,当计数值小于CCRx期间TIM2_CHx输出高电平;当计数值大于CCRx时TIM2_CHx输出低电平;当TIM2_CNT等于ARR重装载值时TIM2_CNT回零重新开始计数。这些活儿一直重复干,相应PWM输出通道上就产生了频率固定的PWM波型。PWM的频率及占空比均可以通过软件进行改变,改变ARR的值即可改变频率;改变CCRx可以改变占空比。LD4产生呼吸灯效果即是在不同的时间点上在TIM2_CCR1装载变化的值所产生的效果。下面是TIM2的初始化函数,根据自己的理解加了注释,不一定都正确:
  1. TIM_HandleTypeDef htim2;

  2. /* TIM2 init function */
  3. void MX_TIM2_Init(void)
  4. {
  5.   TIM_MasterConfigTypeDef sMasterConfig = {0};
  6.   TIM_OC_InitTypeDef sConfigOC = {0};

  7.         /*
  8.         TIM2时钟=TPCLK=16000000Hz,经预分频器(Prescaler)16000000/(159+1)=100KHz;
  9.         TIM2计数频率为100KHz,PWM频率=100000/1000(Period)=100Hz;
  10.         */
  11.   htim2.Instance = TIM2;
  12.   htim2.Init.Prescaler = 159;                                                                                //定时器预分频PSC,
  13.   htim2.Init.CounterMode = TIM_COUNTERMODE_UP;        //向上计数模式
  14.   htim2.Init.Period = 1000;                                                                                        //自动重装载值ARR
  15.   htim2.Init.ClockDivision = TIM_CLOCKDIVISION_DIV1;
  16.   htim2.Init.AutoReloadPreload = TIM_AUTORELOAD_PRELOAD_DISABLE;
  17.   if (HAL_TIM_PWM_Init(&htim2) != HAL_OK)                                //初始化PWM
  18.   {
  19.     Error_Handler();
  20.   }
  21.   sMasterConfig.MasterOutputTrigger = TIM_TRGO_RESET;
  22.   sMasterConfig.MasterSlaveMode = TIM_MASTERSLAVEMODE_DISABLE;
  23.   if (HAL_TIMEx_MasterConfigSynchronization(&htim2, &sMasterConfig) != HAL_OK)
  24.   {
  25.     Error_Handler();
  26.   }
  27.   sConfigOC.OCMode = TIM_OCMODE_PWM1;                                        //模式选择PWM1
  28.   sConfigOC.Pulse = 0;                                                                                                //输出比较值,初始占空比为0
  29.   sConfigOC.OCPolarity = TIM_OCPOLARITY_HIGH;        //输出比较极性为高
  30.   sConfigOC.OCFastMode = TIM_OCFAST_DISABLE;
  31.   if (HAL_TIM_PWM_ConfigChannel(&htim2, &sConfigOC, TIM_CHANNEL_1) != HAL_OK)//配置TIM2通道1
  32.   {
  33.     Error_Handler();
  34.   }
  35.   if (HAL_TIM_PWM_ConfigChannel(&htim2, &sConfigOC, TIM_CHANNEL_2) != HAL_OK)
  36.   {
  37.     Error_Handler();
  38.   }
  39.   if (HAL_TIM_PWM_ConfigChannel(&htim2, &sConfigOC, TIM_CHANNEL_3) != HAL_OK)
  40.   {
  41.     Error_Handler();
  42.   }
  43.   if (HAL_TIM_PWM_ConfigChannel(&htim2, &sConfigOC, TIM_CHANNEL_4) != HAL_OK)
  44.   {
  45.     Error_Handler();
  46.   }
  47.   HAL_TIM_MspPostInit(&htim2);

  48. }
复制代码

这里出现了一个问题,原打算在PA3引脚配置TIM2_CH4输出通道,但调试时一直没有输出,后来改在了PC7引脚就有输出了。另外PB11也可以配置成TIM2_CH4,但还没有尝试。
下面是主函数的片断,在这里别忘了打开PWM输出通道:
  1. /* USER CODE BEGIN 2 */
  2.         HAL_TIM_PWM_Start(&htim2, TIM_CHANNEL_1);//开启TIM2PWM通道1
  3.         HAL_TIM_PWM_Start(&htim2, TIM_CHANNEL_2);//开启TIM2PWM通道2
  4.         HAL_TIM_PWM_Start(&htim2, TIM_CHANNEL_3);//开启TIM2PWM通道3
  5.         HAL_TIM_PWM_Start(&htim2, TIM_CHANNEL_4);//开启TIM2PWM通道4
  6.   /* USER CODE END 2 */

  7.   /* Infinite loop */
  8.   /* USER CODE BEGIN WHILE */
  9.   while (1)
  10.   {
  11.                 TIM2->CCR2 = 250;
  12.                 TIM2->CCR3 = 500;
  13.                 TIM2->CCR4 = 750;
  14.                 for(pwm_val=0; pwm_val<1000; pwm_val++)
  15.                 {
  16.                         HAL_Delay(1);
  17.                         TIM2->CCR1 = pwm_val;
  18.                        
  19.                 }
  20.                 for(pwm_val=1000; pwm_val>0; pwm_val--)
  21.                 {
  22.                         HAL_Delay(1);
  23.                         TIM2->CCR1 = pwm_val;
  24.                 }
  25.     /* USER CODE END WHILE */

  26.     /* USER CODE BEGIN 3 */
  27.   }
复制代码



三、实验结果
QQ截图20190108185843.png

四、实验总结
      通过本次实验对于通用定时器比较输出有了更加深入地认识和了解,但对于PA3配置为TIM2_CH4没有输出的问题比较疑惑,还没有找到具体的原因,请朋友们指教。


附件:工程文件
TIM2_PWM.rar (4.56 MB, 下载次数: 2)


回复

使用道具 举报

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

本版积分规则

  • 论坛活动 E手掌握

    扫码关注
    EEWORLD 官方微信

  • EE福利  唾手可得

    扫码关注
    EE福利 唾手可得

Archiver|手机版|小黑屋|电子工程世界 ( 京ICP证 060456 )

GMT+8, 2019-4-21 14:38 , Processed in 0.078784 second(s), 17 queries , Gzip On, MemCache On.

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