如何在USART1_IRQHandler中使用PWM和USART更改LED的亮度?



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

我使用DMA获取ADC值,选择TIM4用于PWM,选择USART1用于USART。到目前为止,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 aktifrn",sizeof("LED 4 ONrn"));    
}
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 aktifrn",sizeof("LED 4 ONrn"));  
}
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 aktifrn",sizeof("LED 4 ONrn"));  
}
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 aktifrn",sizeof("LED 4 ONrn"));        
}
else 
{
Hello();  
UARTSend("Please enter another number:n",sizeof("Please enter another number:n"));
}   
} USART_ClearITPendingBit(USART1,USART_IT_RXNE);
}

关于您的USART1_IRQ处理器,您是否使用检查中断是否处于活动状态

__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脉冲将关闭它。

相关内容

  • 没有找到相关文章

最新更新