野火STM32_HAL库版课程笔记-TIM通道输出应用之PWM实现呼吸灯

前置介绍

呼吸灯

PWM 占空比高 -> LED 亮度高

PWM 占空比低 -> LED 亮度低

项目配置

TIM 2
  1. 首先引脚选择 PA1, PA2, PA3, 设置为 TIM2_CH2, TIM2_CH3, TIM2_CH4
  2. 然后到 TIM 的 Mode 配置中, 配置 CLock Source 为 Internal Clock
  3. Channel2, Channel3, Channel4 分别设置为 PWM Generation CH2, CH3, CH4
  4. 然后到 Parameter Settings 中
  5. 配置 Prescaler 预分频为 72-1
  6. 配置 Counter Period 为 1000 - 1
  7. 下面的三个通道 (CH2, CH3, CH4) 的 CH Polarity (通道输出电压极性, 即哪个电平代表 "开启" 状态)
    1. 因为 LED 是低电平点亮, 所以这里需要将都设置成为 Low (低电平)

代码部分

复制代码
/* USER CODE BEGIN PV */

uint16_t pwm_val = 0; // CCR的值 (修改占空比)
int8_t dir = 10;      // 变亮: 10, 变暗: -10

/* USER CODE END PV */

/* Private function prototypes -----------------------------------------------*/
void SystemClock_Config(void);
/* USER CODE BEGIN PFP */

/* USER CODE END PFP */

/* Private user code ---------------------------------------------------------*/
/* USER CODE BEGIN 0 */

/* USER CODE END 0 */

/**
  * @brief  The application entry point.
  * @retval int
  */
int main(void)
{

  /* USER CODE BEGIN 1 */

  /* USER CODE END 1 */

  /* MCU Configuration--------------------------------------------------------*/

  /* Reset of all peripherals, Initializes the Flash interface and the Systick. */
  HAL_Init();

  /* USER CODE BEGIN Init */

  /* USER CODE END Init */

  /* Configure the system clock */
  SystemClock_Config();

  /* USER CODE BEGIN SysInit */

  /* USER CODE END SysInit */

  /* Initialize all configured peripherals */
  MX_GPIO_Init();
  MX_TIM2_Init();
  /* USER CODE BEGIN 2 */
  
  // 启动 PWM
  HAL_TIM_PWM_Start(&htim2, TIM_CHANNEL_2);
  HAL_TIM_PWM_Start(&htim2, TIM_CHANNEL_3);
  HAL_TIM_PWM_Start(&htim2, TIM_CHANNEL_4);

  /* USER CODE END 2 */

  /* Infinite loop */
  /* USER CODE BEGIN WHILE */
  while (1)
  {
    
    // 设置 PWM 占空比
    __HAL_TIM_SET_COMPARE(&htim2, TIM_CHANNEL_2, pwm_val);
    __HAL_TIM_SET_COMPARE(&htim2, TIM_CHANNEL_3, pwm_val);
    __HAL_TIM_SET_COMPARE(&htim2, TIM_CHANNEL_4, pwm_val);
    
    // 调整占空比
    pwm_val += dir;
    
    if (pwm_val >= 1000)  dir = -10;  // 到顶翻转
    if (pwm_val <= 0)     dir = 10;

    HAL_Delay(5); // 控制呼吸灯节奏 (数字越大节奏越慢)
    
    /* USER CODE END WHILE */

    /* USER CODE BEGIN 3 */
  }

程序现象

成功实现呼吸灯效果

相关推荐
Cerman6 分钟前
商用处理器多点开花,边缘计算快速增长
嵌入式硬件·智能硬件
陈年老古董12 分钟前
Hive 分区表学习笔记:语法、操作、二级分区与动态分区
hive·笔记·学习
商业白皮书1 小时前
2026年上海豆包DeepSeekKimi百度AI通义千问GEO服务商选择
人工智能·笔记
存在morning1 小时前
【OLAP 学习笔记】Doris:数据湖之上的分析查询引擎
笔记·学习
llilian_161 小时前
失真度校准装置有哪些重点指标?失真度测量仪校准
功能测试·嵌入式硬件·51单片机·软件工程
2401_888859712 小时前
STM32H733 MPU、AXI、FMC学习
java·开发语言·stm32·spring
深圳老胡2 小时前
STM32F4 OTA升级:单App与双App方案优缺点对比
笔记·stm32·单片机·代码规范
恒锐丰科技林技术员2 小时前
EG3112 半桥栅极驱动芯片解析与应用
经验分享·嵌入式硬件·硬件工程
mftang3 小时前
CAN总线控制段:位级结构、DLC编码、代际扩展与错误处理的系统性分析
单片机·嵌入式硬件·can总线·控制段·数据长度代码
yi01110 小时前
LeetCode 219:存在重复元素 II——哈希表记录“最近一次出现的位置”
数据结构·人工智能·笔记·python·算法·leetcode·哈希表