打印
[STM32U5]

【NUCLEO-U5A5ZJ-Q测评】PWM

[复制链接]
657|3
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
Evan0319|  楼主 | 2023-11-29 23:31 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 Evan0319 于 2023-11-29 23:44 编辑

今天继续点灯,使用PWM来个呼吸灯.先来点理论知识:
什么是PWM​ 脉冲宽度调制(PWM),是英文“Pulse Width Modulation”的缩写,简称脉宽调制,是利用微处理器的数字输出来对模拟电路进行控制的一种非常有效的技术,广泛应用在从测量、通信到功率控制与变换的许多领域中。PWM工作原理SMT32F1系列共有8个定时器:高级定时器(TIM1、TIM8);通用定时器(TIM2、TIM3、TIM4、TIM5);基本定时器(TIM6、TIM7)。SMT32F4系列共有15个定时器:高级定时器(TIM1、TIM8);通用定时器(TIM2、TIM3、TIM4、TIM5、TIM9~TIM14);基本定时器(TIM6、TIM7)。STM32的每个通用定时器都有独立的4个通道可以用来作为:输入捕获、输出比较、PWM输出、单脉冲模式输出等。STM32的定时器除了TIM6和TIM7(基本定时器)之外,其他的定时器都可以产生PWM输出。其中,高级定时器TIM1、TIM8可以同时产生7路PWM输出。

PWM的工作模式:    PWM模式1(向上计数)  :计数器从0计数加到自动重装载值(TIMx_ARR),然后重新从0开始计数,并且产生一个计数器溢出事件       PWM模式2(向下计数)  :计数器从自动重装载值(TIMx_ARR)减到0,然后重新从重装载值(TIMx_ARR)开始递减,并且产生一个计数器溢出事件   设置寄存器TIMx_CCMR1的OC1M[2:0]位来确定PWM的输出模式:    PWM模式1:在向上计数时,一旦TIMx_CNT<TIMx_CCR1时通道1为有效电平,否则为无效电平;在向下计数时,一旦TIMx_CNT>TIMx_CCR1时通道1为无效电平(OC1REF=0),否则为有效电平(OC1REF=1)。    PWM模式2:在向上计数时,一旦TIMx_CNT<TIMx_CCR1时通道1为无效电平,否则为有效电平;在向下计数时,一旦TIMx_CNT>TIMx_CCR1时通道1为有效电平,否则为无效电平。
参加示例:
while (1)
  {
  /* USER CODE END WHILE */

  /* USER CODE BEGIN 3 */

          while (pwmVal< 500)
          {
                  pwmVal++;
                  __HAL_TIM_SetCompare(&htim3, TIM_CHANNEL_2, pwmVal);    //修改比较值,修改占空比
//                  TIM3->CCR1 = pwmVal;    与上方相同
                  HAL_Delay(1);
          }
          while (pwmVal)
          {
                  pwmVal--;
                  __HAL_TIM_SetCompare(&htim3, TIM_CHANNEL_2, pwmVal);    //修改比较值,修改占空比
//                  TIM3->CCR1 = pwmVal;     与上方相同
                  HAL_Delay(1);
          }
          HAL_Delay(200);

  /* USER CODE END 3 */
}

CUBE配置:




定时器3


下面是自己写的代码:
while (1)
  {
    /* USER CODE END WHILE */

    /* USER CODE BEGIN 3 */
//        __HAL_TIM_SET_COMPARE(&htim3, TIM_CHANNEL_2, PERIOD_VALUE * pwm_count * 5 / 100);

//        pwm_count++;
//        if(pwm_count > 20)
//        {
//          pwm_count = 0;
//        }
//        HAL_Delay(75);


//                  HAL_GPIO_WritePin(GPIOB, UCPD_DBn_Pin|LED_BLUE_Pin, GPIO_PIN_SET);
               
               
          while (pwmVal< 500)
          {
                  pwmVal++;
                  __HAL_TIM_SetCompare(&htim3, TIM_CHANNEL_2, pwmVal);    //修改比较值,修改占空比
//                  TIM3->CCR1 = pwmVal;    与上方相同
                  HAL_Delay(1);
          }
          while (pwmVal)
          {
                  pwmVal--;
                  __HAL_TIM_SetCompare(&htim3, TIM_CHANNEL_2, pwmVal);    //修改比较值,修改占空比
//                  TIM3->CCR1 = pwmVal;     与上方相同
                  HAL_Delay(1);
          }

  }
               
               
  /* USER CODE END 3 */
}


初始化:

  TIM_MasterConfigTypeDef sMasterConfig = {0};
  TIM_OC_InitTypeDef sConfigOC = {0};

  /* USER CODE BEGIN TIM3_Init 1 */

  /* USER CODE END TIM3_Init 1 */
  htim3.Instance = TIM3;
  htim3.Init.Prescaler = PRESCALER_VALUE;
  htim3.Init.CounterMode = TIM_COUNTERMODE_UP;
  htim3.Init.Period = PERIOD_VALUE;
  htim3.Init.ClockDivision = TIM_CLOCKDIVISION_DIV1;
  htim3.Init.AutoReloadPreload = TIM_AUTORELOAD_PRELOAD_DISABLE;
  if (HAL_TIM_PWM_Init(&htim3) != HAL_OK)
  {
    Error_Handler();
  }
  sMasterConfig.MasterOutputTrigger = TIM_TRGO_RESET;
  sMasterConfig.MasterSlaveMode = TIM_MASTERSLAVEMODE_DISABLE;
  if (HAL_TIMEx_MasterConfigSynchronization(&htim3, &sMasterConfig) != HAL_OK)
  {
    Error_Handler();
  }
  sConfigOC.OCMode = TIM_OCMODE_PWM1;
  sConfigOC.Pulse = PULSE_VALUE;
  sConfigOC.OCPolarity = TIM_OCPOLARITY_HIGH;
  sConfigOC.OCFastMode = TIM_OCFAST_DISABLE;
  if (HAL_TIM_PWM_ConfigChannel(&htim3, &sConfigOC, TIM_CHANNEL_2) != HAL_OK)
  {
    Error_Handler();
  }
  /* USER CODE BEGIN TIM3_Init 2 */

  /* USER CODE END TIM3_Init 2 */
  HAL_TIM_MspPostInit(&htim3);

}

视频:



使用特权

评论回复
沙发
jf101| | 2023-11-30 09:28 | 只看该作者
HAL库开发还是比较方便的

使用特权

评论回复
板凳
Tristan_C| | 2023-11-30 15:29 | 只看该作者
本帖最后由 Tristan_C 于 2023-12-1 09:26 编辑

不错不错

使用特权

评论回复
地板
储小勇_526| | 2023-11-30 15:45 | 只看该作者
最近做了个项目,用的HAL库,非常爽,代码看起来也很简洁

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

2

主题

8

帖子

0

粉丝