定时器与PWM的LED控制

1、PWM

PWM是脉冲宽度调制(Pulse Width Modulation)的缩写,是一种用于控制模拟电路的技术。通过控制脉冲信号的占空比(高电平时间占总周期的比例),可以实现对输出信号的平均功率的调节。在数字电路中,PWM通常用于控制电机、LED灯等设备的亮度、速度等参数。通过改变PWM信号的占空比,可以实现对设备的精确控制。

PWM的频率是指每个脉冲周期的重复率,通常以赫兹(Hz)为单位来表示。在实际应用中,PWM的频率可以根据具体的需求进行设定,常见的PWM频率范围为几十赫兹到几千赫兹不等。频率越高,脉冲信号的变化越快,对于一些灵敏性要求高的设备控制会更加精准。而低频率的PWM适用于一些功率控制或灯光调节等需要平稳变化的场景。在实际应用中,根据具体的控制需求来选择合适的PWM频率是非常重要的。

在STM32微控制器中,使用PWM(脉冲宽度调制)控制呼吸灯通常需要配置定时器和相应的GPIO端口。以下是一个初始化PWM控制呼吸灯的示例代码,这段代码使用了STM32的HAL库函数。

2、代码

#include "stm32f1xx_hal.h"
// 假设使用TIM2作为PWM定时器,使用PA0作为PWM输出引脚
TIM_HandleTypeDef htim2;
GPIO_InitTypeDef GPIO_InitStruct = {0};
void SystemClock_Config(void);
static void MX_GPIO_Init(void);
static void MX_TIM2_Init(void);
int main(void)
{
  HAL_Init();
  SystemClock_Config();
  MX_GPIO_Init();
  MX_TIM2_Init();
  // 启动PWM信号输出
  HAL_TIM_PWM_Start(&htim2, TIM_CHANNEL_1);
  while (1)
  {
    // 在这里可以改变PWM的占空比,实现呼吸灯效果
    // 例如,逐步增加占空比然后减少,模拟呼吸效果
  }
}
void SystemClock_Config(void)
{
  // 系统时钟配置代码,根据实际需求进行配置
}
static void MX_GPIO_Init(void)
{
  __HAL_RCC_GPIOA_CLK_ENABLE();
  // 初始化PA0为复用推挽输出,用于PWM输出
  GPIO_InitStruct.Pin = GPIO_PIN_0;
  GPIO_InitStruct.Mode = GPIO_MODE_AF_PP; // 复用推挽输出
  GPIO_InitStruct.Pull = GPIO_NOPULL;
  GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;
  HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);
}
static void MX_TIM2_Init(void)
{
  __HAL_RCC_TIM2_CLK_ENABLE();
  htim2.Instance = TIM2;
  htim2.Init.Prescaler = 0; // 预分频器
  htim2.Init.CounterMode = TIM_COUNTERMODE_UP; // 向上计数模式
  htim2.Init.Period = 1000 - 1; // 自动重装载寄存器的值
  htim2.Init.ClockDivision = TIM_CLOCKDIVISION_DIV1; // 时钟分频
  htim2.Init.RepetitionCounter = 0;
  HAL_TIM_PWM_Init(&htim2);
  TIM_OC_InitTypeDef sConfigOC = {0};
  sConfigOC.OCMode = TIM_OCMODE_PWM1;
  sConfigOC.Pulse = 500; // 初始占空比
  sConfigOC.OCPolarity = TIM_OCPOLARITY_HIGH;
  sConfigOC.OCFastMode = TIM_OCFAST_DISABLE;
  HAL_TIM_PWM_ConfigChannel(&htim2, &sConfigOC, TIM_CHANNEL_1);
  HAL_TIM_MspPostInit(&htim2);
}


这段代码中,`MX_GPIO_Init`函数初始化了GPIOA的0号引脚,模式设置为`GPIO_MODE_AF_PP`,这正是复用推挽输出模式,允许PWM波形通过该引脚输出。`MX_TIM2_Init`函数初始化了TIM2定时器,并配置了PWM通道。最后,通过`HAL_TIM_PWM_Start`函数启动PWM信号输出。

改变CCR的值

void PWM_SetCompare1(uint16_t Compare)
{
    TIM_SetCompare1(TIM2, Compare);        //设置CCR1的值
}

主函数

int main(void)
{
    PWM_Init();            //PWM初始化
    
    while (1)
    {
        for (i = 0; i <= 100; i++)
        {
            PWM_SetCompare1(i);            //依次将定时器的CCR寄存器设置为0~100,PWM占空比逐渐增大,LED逐渐变亮
            Delay_ms(10);                //延时10ms
        }
        for (i = 0; i <= 100; i++)
        {
            PWM_SetCompare1(100 - i);    //依次将定时器的CCR寄存器设置为100~0,PWM占空比逐渐减小,LED逐渐变暗
            Delay_ms(10);                //延时10ms
        }
    }
}

3、现象

63be71dce2d94d7788dd480957ab3b0c.png 

532648566e214a1cb533a417b45ae231.png 

1198d39d09b149618ce15c4d3951715c.png 

eed1213c0b994187bbc7dc793266d3e7.png 

 


 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值