STM32G431RBT6单片机如何调节LED灯的亮度,可以从修改PWM波方面考虑。
用定时器输出pwm波形(固定频率),通过调整占空比不就能实现LED灯亮度的调整了。
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:因为是边学边做的博客,应该有部分错误,欢迎各位指出,如有侵权相关,请随时联系博主,会第一时间删帖。(虽然纯手打的不大可能侵权吧…)
首先需要进行STM32CubeMx配置,具体步骤如下:
打开STM32CubeMx软件,选择MCU型号为STM32G431RBT6,打开“Pinout”选项卡,找到需要控制的LED引脚对应的GPIO引脚(例如PA5),将其设置为“PWM输出”模式。
打开“Clock Configuration”选项卡,选择系统时钟源为HSI16,并且将“TIMx (TIMxCLK)”时钟频率设置为84MHz(即与MCU时钟一致),点击“GENERATE CODE”生成代码。
在生成的代码中找到“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);
}
/* 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);
}
}
以上配置代码实现了一个呼吸灯效果,即将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亮度越大。