前置介绍
呼吸灯

PWM 占空比高 -> LED 亮度高
PWM 占空比低 -> LED 亮度低
项目配置
TIM 2

- 首先引脚选择 PA1, PA2, PA3, 设置为 TIM2_CH2, TIM2_CH3, TIM2_CH4
- 然后到 TIM 的 Mode 配置中, 配置 CLock Source 为 Internal Clock
- Channel2, Channel3, Channel4 分别设置为 PWM Generation CH2, CH3, CH4
- 然后到 Parameter Settings 中
- 配置 Prescaler 预分频为 72-1
- 配置 Counter Period 为 1000 - 1
- 下面的三个通道 (CH2, CH3, CH4) 的 CH Polarity (通道输出电压极性, 即哪个电平代表 "开启" 状态)
- 因为 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 */
}
程序现象

成功实现呼吸灯效果