Day13:PWM 输出(上)

PWM 原理:
脉冲宽度调制,通过调节占空比 (高电平时间 / 周期) 控制输出信号平均功率
频率:1/(ARR+1) × (PSC+1)/ 时钟频率
占空比:(CCR/ARR) × 100% (CCR 为比较值)
PWM 配置步骤:
配置 GPIO 为复用功能 (如 PA1 复用为 TIM2_CH2)
配置定时器时基 (PSC、ARR)
配置 PWM 模式 (向上计数 / 中央对齐)
配置输出比较参数 (CCR)
启动 PWM 输出
PWM 模式选择:
边沿对齐: 计数器向上 / 向下计数,适用于一般应用
中央对齐: 计数器先向上再向下,生成对称 PWM 波
LED 呼吸灯 (亮度渐变):

// 定时器初始化
TIM_HandleTypeDef htim2;
void TIM2_PWM_Init(void){
  GPIO_InitTypeDef GPIO_InitStruct;
  
  // 使能GPIOA和定时器2时钟
  __HAL_RCC_GPIOA_CLK_ENABLE();
  __HAL_RCC_TIM2_CLK_ENABLE();
  
  // 配置PA1为复用功能
  GPIO_InitStruct.Pin = GPIO_PIN_1;
  GPIO_InitStruct.Mode = GPIO_MODE_AF_PP; // 复用推挽输出
  GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_HIGH;
  GPIO_InitStruct.Alternate = GPIO_AF1_TIM2; // 复用为TIM2
  HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);
  
  // 配置定时器参数(1KHz PWM)
  htim2.Instance = TIM2;
  htim2.Init.Prescaler = 71;    // 72MHz/(71+1)=1MHz
  htim2.Init.Period = 999;      // 周期1ms
  htim2.Init.CounterMode = TIM_COUNTERMODE_UP;
  HAL_TIM_PWM_Init(&htim2);
  
  // 配置PWM通道(CH2)
  TIM_OC_InitTypeDef sConfigOC;
  sConfigOC.OCMode = TIM_OCMODE_PWM1; // PWM模式1
  sConfigOC.Pulse = 0;                // 初始占空比0%
  sConfigOC.OCPolarity = TIM_OCPOLARITY_HIGH; // 高电平有效
  HAL_TIM_PWM_ConfigChannel(&htim2, &sConfigOC, TIM_CHANNEL_2);
  
  HAL_TIM_PWM_Start(&htim2, TIM_CHANNEL_2); // 启动PWM输出
}

// 主函数
int main(){
  TIM2_PWM_Init();
  int duty = 0;
  int dir = 1;
  while(1){
    duty += dir;
    if(duty >= 1000 || duty <= 0) dir *= -1; // 达到边界改变方向
    __HAL_TIM_SetCompare(&htim2, TIM_CHANNEL_2, duty); // 更新占空比
    HAL_Delay(10); // 调整渐变速度
  }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值