stm32g431led调整亮度

STM32G431RBT6单片机如何调节LED灯的亮度,可以从修改PWM波方面考虑。

用定时器输出pwm波形(固定频率),通过调整占空比不就能实现LED灯亮度的调整了。

  • 关于该问题,我找了一篇非常好的博客,你可以看看是否有帮助,链接:基于STM32的PWM驱动LED呼吸灯
  • 除此之外, 这篇博客: PWM控制LED亮度(1)-STM32电控学习笔记09中的 【PWM相关公式&函数】 部分也许能够解决你的问题, 你可以仔细阅读以下内容或跳转源博客中阅读:
  • Fpwm = Tclk / ((arr + 1) * (psc + 1))
    pwm频率=时钟频率/(计数器值+1)(预分频值+1)
    Duty circle = TIMX -> CCR / arr
    占空比 = 用户设定值 / 计数器值

    而想要使用PWM信号,则需要设置周期和占空比
    例如时钟的上限是200,每次计数1ms,那么计数器值就是200ms,我们设置捕获值(CRR)为100,那么当定时器跑到100时就会拉高/降低电平,也就是说,200ms内有100ms为高电平,那么占空比就是50%,周期就是200ms,脉宽就是100ms。所以通过设置相关参数就可以输出我们想要的PWM方波。

    接下来我们用PWM脉宽调制实现LED灯的亮度调整:

    通过查询原理图我们发现,TIM5是挂载在ABP1总线上,从时钟的配置我们可以看到,其定时器频率为84Mhz
    在这里插入图片描述

    我们可以这么理解:定时器每1s中计数84000000次,而预分频系数就是把频率划分,如果预分频系数为84,那么时钟的频率就是84MHZ/84=1MHZ

    注,预分频系数应该设定为其数值-1,例如我们想将预分频系数设置为84000,那么在配置时,预分频系数就设置为83999,计时器频率就是1000HZ,即1s内计数1000次,也就是每1ms计数一次。
    在这里插入图片描述

    掌握了预分频值和重装载值的基本计算和配置,那么我们只需要设置我们需要的脉宽或者占空比即可。

    这两天有点摆,主要是作业有点多(doge),接下来准备国庆啦,更新就能快一点点了(对就一点点,多不了)。
    PS:因为是边学边做的博客,应该有部分错误,欢迎各位指出,如有侵权相关,请随时联系博主,会第一时间删帖。(虽然纯手打的不大可能侵权吧…)

  • 以下回答由chatgpt基于相关博客总结生成:

    解答(仅供参考)

    首先需要进行STM32CubeMx配置,具体步骤如下:

    1. 打开STM32CubeMx软件,选择MCU型号为STM32G431RBT6,打开“Pinout”选项卡,找到需要控制的LED引脚对应的GPIO引脚(例如PA5),将其设置为“PWM输出”模式。

    2. 打开“Clock Configuration”选项卡,选择系统时钟源为HSI16,并且将“TIMx (TIMxCLK)”时钟频率设置为84MHz(即与MCU时钟一致),点击“GENERATE CODE”生成代码。

    3. 在生成的代码中找到“main.c”文件,进入“mx_pwm_init()”函数,在其中进行如下配置:

    /* TIM_HandleTypeDef结构体定义 */
    TIM_HandleTypeDef htim1;
    
    /* TIM1初始化 */
    void mx_pwm_init(void)
    {
        /* 配置TIM1 */
        htim1.Instance = TIM1;
        htim1.Init.Prescaler = 83; // 设置预分频系数
        htim1.Init.Period = 999; // 设置计数器周期
        htim1.Init.ClockDivision = TIM_CLOCKDIVISION_DIV1;
        htim1.Init.CounterMode = TIM_COUNTERMODE_UP;
        htim1.Init.RepetitionCounter = 0;
        HAL_TIM_PWM_Init(&htim1);
    
        /* 配置PWM通道 */
        TIM_OC_InitTypeDef sConfigOC;
        sConfigOC.OCMode = TIM_OCMODE_PWM1;
        sConfigOC.OCIdleState = TIM_OCIDLESTATE_SET;
        sConfigOC.Pulse = 500; // 设置初始占空比为50%
        sConfigOC.OCPolarity = TIM_OCPOLARITY_HIGH;
        HAL_TIM_PWM_ConfigChannel(&htim1, &sConfigOC, TIM_CHANNEL_1);
    
        /* 开启PWM输出通道 */
        HAL_TIM_PWM_Start(&htim1, TIM_CHANNEL_1);
    
        /* 开启定时器中断 */
        HAL_NVIC_SetPriority(TIM1_UP_TIM16_IRQn, 0, 0);
        HAL_NVIC_EnableIRQ(TIM1_UP_TIM16_IRQn);
    }
    
    1. 在“main.c”中添加定时器中断服务程序,用于改变占空比:
    /* TIM1中断服务程序 */
    void TIM1_UP_TIM16_IRQHandler(void)
    {
        /* 判断是否清除中断标志 */
        if (__HAL_TIM_GET_FLAG(&htim1, TIM_FLAG_UPDATE) != RESET)
        {
            /* 清除中断标志 */
            __HAL_TIM_CLEAR_FLAG(&htim1, TIM_FLAG_UPDATE);
    
            /* 改变占空比 */
            static uint16_t pwm_value = 500;
            static int8_t pwm_direction = 1;
            if (pwm_direction == 1)
            {
                pwm_value += 10;
                if (pwm_value >= 950)
                {
                    pwm_direction = -1;
                }
            }
            else
            {
                pwm_value -= 10;
                if (pwm_value <= 50)
                {
                    pwm_direction = 1;
                }
            }
            TIM_OC_InitTypeDef sConfigOC;
            sConfigOC.OCMode = TIM_OCMODE_PWM1;
            sConfigOC.OCIdleState = TIM_OCIDLESTATE_SET;
            sConfigOC.Pulse = pwm_value;
            sConfigOC.OCPolarity = TIM_OCPOLARITY_HIGH;
            HAL_TIM_PWM_ConfigChannel(&htim1, &sConfigOC, TIM_CHANNEL_1);
        }
    }
    
    1. 在“main.c”中的“main()”函数中调用“mx_pwm_init()”函数即可启动PWM输出。

    以上配置代码实现了一个呼吸灯效果,即将LED灯在一定时间内从全亮到全暗再到全亮,并且可以通过改变初始占空比和占空比变化的步进来控制呼吸灯速度和最大亮度,相关说明见代码注释。

    注:以上代码仅供参考,实际运行可能需要根据具体情况进行调整和修改。还需要注意的是,在配置代码之前需要先掌握STM32G431RBT6的基础知识,以便更好地理解以上代码。

有帮助的话 采纳一下
调节LED亮度的步骤:
启用GPIO和定时器时钟:

RCC_AHB2ENR |= RCC_AHB2ENR_GPIOAEN;     // 使能GPIOA时钟
RCC_APB1ENR |= RCC_APB1ENR_TIM2EN;      // 使能TIM2定时器时钟

配置GPIO为PWM输出模式:

GPIOA_AFRL &= ~(15<< GPIO_AFRL_AFRL0_Pos);  
GPIOA_AFRL |=  2 << GPIO_AFRL_AFRL0_Pos;      // PA0复用为TIM2_CH1

GPIOA_MODER &= ~(3<<GPIO_MODER_MODE0_Pos);
GPIOA_MODER |= (2<<GPIO_MODER_MODE0_Pos);     // PA0配置为复用输出 

配置TIM2产生PWM波,作为PA0的PWM信号:

TIM2_CR1 |= TIM_CR1_ARPE;      // 使能TIM2在复位后自动重装载

TIM2_PSC = 15;                  // 定时器时钟频率为1MHz  
TIM2_ARR = 999;                 // 重装载寄存器值,PWM周期为1000个计数
TIM2_CCR1 = 500;                // 捕获/比较寄存器值,PWM占空比为50% 

TIM2_CCMR1 |= 7<<TIM_CCMR1_OC1M_Pos;   // OC1M位设置为PWM模式1
TIM2_CCER |= TIM_CCER_CC1E;             // OC1输出使能

TIM2_CR1 |= TIM_CR1_CEN;      // 使能TIM2定时器  

调节TIM2_CCR1的值改变PWM占空比,这样可以调节LED的亮度。TIM2_CCR1值越大,占空比越高,LED亮度越大。