野火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 */
  }

程序现象

成功实现呼吸灯效果

相关推荐
ACP广源盛139246256732 小时前
IX8024@ACP# 搭配此芯 AI 服务器 + 爱芯元智产品完整方案
大数据·运维·服务器·人工智能·分布式·嵌入式硬件
ShallWeL3 小时前
NVIDIA Jetson 早期系列演进
人工智能·嵌入式硬件·边缘计算·智能硬件
hengcaib4 小时前
防封号电销外包公司怎么选合规线路与风控核查方法
笔记
2501_914245935 小时前
C语言与硬件交互:从GPIO到中断的嵌入式编程实践
c语言·单片机·交互
2401_854151555 小时前
嵌入式 Bootloader 与 OTA 固件升级深度解析——从 Flash 分区到安全回滚
开发语言·stm32·单片机·嵌入式硬件·安全·php
炸膛坦客6 小时前
单片机/C/C++八股:(二十四)编译文件( .bin 和 .hex ,包括 .elf 和 .axf )
c语言·c++·单片机
Yunhoa6 小时前
51单片机(DS18B20 数字温度传感器)
单片机·嵌入式硬件·51单片机
六点_dn7 小时前
Linux学习笔记-shell运算符
linux·笔记·学习
zlinear数据采集卡8 小时前
2mV纹波的代价:硬核拆解ZLinear模拟前端放大器与正负可调电源设计
arm开发·单片机·嵌入式硬件·fpga开发·架构·开源
降临-max8 小时前
软件测试基础---项目实战
软件测试·笔记·功能测试·测试用例