如何在USART1_IRQHandler中通过PWM和USART更改LED的亮度?

问题描述 投票:1回答:1

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

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

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

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);
}
stm32 stm32f4discovery adc pwm usart
1个回答
-1
投票

关于您的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引脚,则LOW脉冲将打开led,而High脉冲将其关闭。

© www.soinside.com 2019 - 2024. All rights reserved.