[STM32C0] 【STM32C092RC 测评】+NUCLEO-C092RC开发板pwm+timer+控制呼吸

[复制链接]
 楼主| yinxiangxv 发表于 2025-5-4 08:47 | 显示全部楼层 |阅读模式
<
本帖最后由 yinxiangxv 于 2025-5-26 22:30 编辑

采用工具进行相关的配置,选择好对应的封装?
435006816b664cb06a.png
这里开启了tim1,tim2对应的通道,同时进行相关参数的配置
根据时钟树的显示,这里面不再对时钟的频率进行修改,采用默认方式。
599586816b6f504ae1.png
那么下面看看对应的关键配置,因为tim1是高级计时器,所以参数比较多,但是这里用到的比较有限
530476816b719334d7.png
同理,tim2是一个普通计时器,只要简单正确配置就可以了
那么看看关键代码:
  1. /* USER CODE BEGIN 2 */
  2.   // Start the PWM channels for both LEDs
  3.   // Note: Use the correct Timer handle and Channel defined by your configuration
  4.   if (HAL_TIM_PWM_Start(&htim1, TIM_CHANNEL_2) != HAL_OK) // For LED on PC9
  5.   {
  6.     Error_Handler();
  7.   }
  8.   if (HAL_TIM_PWM_Start(&htim2, TIM_CHANNEL_1) != HAL_OK) // For LED on PA5
  9.   {
  10.     Error_Handler();
  11.   }


  12.   // --- Variables for breathing effect ---
  13.   // Set PWM_MAX_VALUE to your timer's ARR (Auto-Reload Register) value
  14.   // Assuming ARR was set to 999 for both timers in CubeMX for a 0-1000 range
  15.   uint32_t pwm_max_value = 999;
  16.   uint32_t brightness = 0;
  17.   int8_t step = 5; // How much to change brightness each step
  18.   uint8_t delay_ms = 10; // Delay between steps, controls breathing speed


  19.   /* USER CODE END 2 */

  20.   /* Infinite loop */
  21.   /* USER CODE BEGIN WHILE */
  22.   while (1)
  23.   {
  24.     /* USER CODE END WHILE */
  25.           // --- Fade In ---
  26.               for (brightness = 0; brightness <= pwm_max_value; brightness += step)
  27.               {
  28.                 // Clamp brightness to max value in case step overshoots
  29.                 if (brightness > pwm_max_value) {
  30.                     brightness = pwm_max_value;
  31.                 }

  32.                 // Set the PWM duty cycle (Compare value) for both LEDs simultaneously
  33.                 __HAL_TIM_SET_COMPARE(&htim1, TIM_CHANNEL_2, brightness); // LED on PC9
  34.                 __HAL_TIM_SET_COMPARE(&htim2, TIM_CHANNEL_1, brightness); // LED on PA5

  35.                 HAL_Delay(delay_ms); // Adjust delay for breathing speed
  36.               }

  37.                // Ensure brightness is exactly max value after loop
  38.               __HAL_TIM_SET_COMPARE(&htim1, TIM_CHANNEL_2, pwm_max_value);
  39.               __HAL_TIM_SET_COMPARE(&htim2, TIM_CHANNEL_1, pwm_max_value);
  40.               HAL_Delay(delay_ms * 10); // Optional: Pause briefly at full brightness


  41.               // --- Fade Out ---
  42.               // Start slightly below max to avoid issues with unsigned wrap-around if step doesn't divide evenly
  43.               for (brightness = pwm_max_value; brightness > 0; )
  44.               {
  45.                  // Decrement first, then check bounds
  46.                  if (brightness <= step) { // Prevent underflow for unsigned int
  47.                       brightness = 0;
  48.                  } else {
  49.                      brightness -= step;
  50.                  }

  51.                 // Set the PWM duty cycle (Compare value) for both LEDs simultaneously
  52.                 __HAL_TIM_SET_COMPARE(&htim1, TIM_CHANNEL_2, brightness); // LED on PC9
  53.                 __HAL_TIM_SET_COMPARE(&htim2, TIM_CHANNEL_1, brightness); // LED on PA5

  54.                 HAL_Delay(delay_ms); // Adjust delay for breathing speed
  55.               }

  56.               // Ensure brightness is exactly 0 after loop
  57.               __HAL_TIM_SET_COMPARE(&htim1, TIM_CHANNEL_2, 0);
  58.               __HAL_TIM_SET_COMPARE(&htim2, TIM_CHANNEL_1, 0);
  59.               HAL_Delay(delay_ms * 10); // Optional: Pause briefly when off

  60.               /* USER CODE END 3 */
  61.             }
  62.     /* USER CODE BEGIN 3 */
  63.   }
  64.   /* USER CODE END 3 */


并且构建成功: 14356816b8fd30c53.png
继续新的探索
AdaMaYun 发表于 2025-6-8 19:56 | 显示全部楼层
s
PWM设置还是非常实用的
sdlls 发表于 2025-6-10 09:35 | 显示全部楼层
s
涵盖了STM32C092RC的基本特性、开发环境搭建、PWM和定时器的配置与使用
robincotton 发表于 2025-6-10 12:02 | 显示全部楼层
s
是否需要启用多个PWM通道或使用DMA同步?
febgxu 发表于 2025-6-10 13:13 | 显示全部楼层
s
如何选择合适的定时器和配置参数以实现最佳效果?
mattlincoln 发表于 2025-6-10 13:48 | 显示全部楼层
s
若LED在低占空比下出现闪烁,应如何调整PWM频率
yiyigirl2014 发表于 2025-6-10 15:14 | 显示全部楼层
s
这个初始化不是都是在MX里配置就行了吗,需要自己一步一步从头配置吗
lihuami 发表于 2025-6-10 15:34 | 显示全部楼层
s
可对比不同定时器(如TIM1与TIM3)的性能差异,为复杂应用提供参考。
elsaflower 发表于 2025-6-10 16:46 | 显示全部楼层
s
对于高功率 LED ,如何设计外部驱动电路
sdlls 发表于 2025-6-10 17:46 | 显示全部楼层
s
提供了丰富的代码示例, 更好地理解和应用PWM、定时器和呼吸灯控制。
fengm 发表于 2025-6-10 18:28 | 显示全部楼层
s
在配置PWM时,是否需要特别注意某些参数的设置?
maqianqu 发表于 2025-6-10 19:24 | 显示全部楼层
s
当多个 PWM 通道同时工作时,如何避免通道间的干扰
saservice 发表于 2025-6-10 20:01 | 显示全部楼层
s
如何选择预分频器(Prescaler)和自动重载值(ARR)以平衡PWM分辨率和频率?
macpherson 发表于 2025-6-10 20:38 | 显示全部楼层
s
​​STM32C092RC的PWM模块与Timer的协同配置​​
sanfuzi 发表于 2025-6-10 22:07 | 显示全部楼层
s
控制多个LED的呼吸效果,如何分配定时器通道并避免资源冲突?
linfelix 发表于 2025-6-10 22:46 | 显示全部楼层
s
最大支持多大频率的PWM输出?              
macpherson 发表于 2025-6-12 13:27 | 显示全部楼层
s
通过中断或主循环调整占空比,两者在实时性和资源占用上有何差异?
plsbackup 发表于 2025-6-12 14:26 | 显示全部楼层
s
呼吸灯亮度变化采用线性增减还是非线性曲线
robincotton 发表于 2025-6-12 15:32 | 显示全部楼层
s
通过DMA自动更新PWM占空比              
sdlls 发表于 2025-6-12 16:01 | 显示全部楼层
s
是否需要引入全局变量存储亮度状态 ?
您需要登录后才可以回帖 登录 | 注册

本版积分规则

50

主题

336

帖子

0

粉丝
快速回复 在线客服 返回列表 返回顶部