首页 > 解决方案 > 如何在 USART1_IRQHandler 中使用 PWM 和 USART 更改 LED 的亮度?

问题描述

我正在使用 STM32F4 发现板,并且正在使用 ADC 和 USART 更改 LED 亮度和定时器周期。

我使用 DMA 获取 ADC 值,为 PWM 选择了 TIM4,为 USART 选择了 USART1。ADC、USART 和 PWM 到目前为止运行良好,但USART1_IRQHandler()未按预期运行。

在以下实现中,如何使用 PWM 和 ADC 调整定时器周期和 LED 亮度USART1_IRQHandler()

void USART1_IRQHandler()
{
   if (USART_GetITStatus(USART1, USART_IT_RXNE) )
    {      
      delay(168000);
        i = USART_ReceiveData(USART1);
        if(i == '1'){

          TIMOC_InitStruct.TIM_Pulse=pwm_value;
          TIM_OC1Init(TIM4,&TIMOC_InitStruct);
          TIM_OC1PreloadConfig(TIM4,TIM_OCPreload_Enable);

          UARTSend("3 led aktif\r\n",sizeof("LED 4 ON\r\n"));    
        }
        else if(i == '2')
        {
          TIMOC_InitStruct.TIM_Pulse=pwm_value;
          TIM_OC1Init(TIM4,&TIMOC_InitStruct);
          TIM_OC1PreloadConfig(TIM4,TIM_OCPreload_Enable);

          TIMOC_InitStruct.TIM_Pulse=pwm_value;
          TIM_OC2Init(TIM4,&TIMOC_InitStruct);
          TIM_OC2PreloadConfig(TIM4,TIM_OCPreload_Enable);

          UARTSend("2 led aktif\r\n",sizeof("LED 4 ON\r\n"));  

        }
        else if(i == '4')
        {

          TIMOC_InitStruct.TIM_Pulse=pwm_value;
          TIM_OC1Init(TIM4,&TIMOC_InitStruct);
          TIM_OC1PreloadConfig(TIM4,TIM_OCPreload_Enable);

          TIMOC_InitStruct.TIM_Pulse=pwm_value;
          TIM_OC2Init(TIM4,&TIMOC_InitStruct);
          TIM_OC2PreloadConfig(TIM4,TIM_OCPreload_Enable);

          TIMOC_InitStruct.TIM_Pulse=pwm_value;
          TIM_OC3Init(TIM4,&TIMOC_InitStruct);
          TIM_OC3PreloadConfig(TIM4,TIM_OCPreload_Enable);

          UARTSend("4 led aktif\r\n",sizeof("LED 4 ON\r\n"));  

        }
        else if(i == '4')
          {
          TIMOC_InitStruct.TIM_Pulse=pwm_value;
          TIM_OC1Init(TIM4,&TIMOC_InitStruct);
          TIM_OC1PreloadConfig(TIM4,TIM_OCPreload_Enable);

          TIMOC_InitStruct.TIM_Pulse=pwm_value;
          TIM_OC2Init(TIM4,&TIMOC_InitStruct);
          TIM_OC2PreloadConfig(TIM4,TIM_OCPreload_Enable);

          TIMOC_InitStruct.TIM_Pulse=pwm_value;
          TIM_OC3Init(TIM4,&TIMOC_InitStruct);
          TIM_OC3PreloadConfig(TIM4,TIM_OCPreload_Enable);

          TIMOC_InitStruct.TIM_Pulse=pwm_value;
          TIM_OC4Init(TIM4,&TIMOC_InitStruct);
          TIM_OC4PreloadConfig(TIM4,TIM_OCPreload_Enable);

          UARTSend("4 led aktif\r\n",sizeof("LED 4 ON\r\n"));        
        }
         else 
         {
           Hello();  
           UARTSend("Please enter another number:\n",sizeof("Please enter another number:\n"));
         }   
    } USART_ClearITPendingBit(USART1,USART_IT_RXNE);
}

标签: stm32stm32f4discoveryadcpwmusart

解决方案


关于您的 USART1_IRQHandler,您是否检查过中断是否处于活动状态

__HAL_RCC_UART4_CLK_ENABLE();
HAL_NVIC_SetPriority(USART1_IRQn, 0, 0);
HAL_NVIC_EnableIRQ(USART1_IRQn);

如果您通过此调用启用它

UART_Receive_IT( &huart1 );

我正在使用 STM32Cube,存储库 V1.25.0。

现在,关于 USART1_IRQHandler() 中的代码,您可以使用快捷方式来处理您想做的事情。如果我理解的话,你有 4 个 LED 可以用 Timer4 和 4 个通道来控制。

脉冲是输出比较值(通道 1 的 TIM4->CCR1)。所以,我会用一个等于周期(或零。见下面的注释)的脉冲来启动定时器。

从那时起,如果你想改变亮度,你只需要改变脉冲宽度

__HAL_TIM_SET_COMPARE( htim4, TIM_CHANNEL_1, pwm_value);

或与

TIM4->CCR1 = pwm_value;

您还可以禁用任何频道

__HAL_TIM_DISABLE_IT( htim4, TIM_CHANNEL_1);
__HAL_TIM_ENABLE_IT( htim4, TIM_CHANNEL_1);

所以,你会得到类似的东西

if(i == '1'){
    TIM4->CCR1 = pwm_value;
} else if(i == '2')  {
    TIM4->CCR1 = pwm_value;
    TIM4->CCR2 = pwm_value;
} ...

注意:我不知道你的 LED 是如何连接的。如果 LED 连接到 Vcc,另一端连接到 MPU 引脚,低脉冲将打开 LED,高脉冲将其关闭。


推荐阅读