查看野火霸道V2开发板跟三色LED相关的硬件电路原理图,如下:
由该图可知红灯跟PB5相连,绿灯跟PB0相连,蓝灯跟PB1相连,分别跟定时器TIM3的2、3、4通道相连。根据该图,配置定时器。打开定时器TIM3,设置时钟源为“Internal Clock”,选择“Channel2-4”,都选择“PWM Generation CH1”,配置定时器PSC = 18,ARR = 65535,即PWM输出频率为61Hz。ARR溢出更新时间为16.3ms。配置PWM输出有效电平为低电平。打开定时器全局中断,配置NVIC。STM32CubeMX配置如下:
在Keil中定义函数“PWM_SetCampare”可传入三个参数,分别配置红灯的CCR,绿灯的CCR,蓝灯的CCR。
void PWM_SetCampare(uint16_t ccr5, uint16_t ccr0, uint16_t ccr1)
{
__HAL_TIM_SetCompare(&htim3, TIM_CHANNEL_2, ccr5);
__HAL_TIM_SetCompare(&htim3, TIM_CHANNEL_3, ccr0);
__HAL_TIM_SetCompare(&htim3, TIM_CHANNEL_4, ccr1);
}
在main函数中打开定时器的3个PWM输出通道,并且开启定时器ARR溢出更新中断。
HAL_TIM_PWM_Start(&htim3, TIM_CHANNEL_2);
HAL_TIM_PWM_Start(&htim3, TIM_CHANNEL_3);
HAL_TIM_PWM_Start(&htim3, TIM_CHANNEL_4);
HAL_TIM_Base_Start_IT(&htim3);
在stm32f1xx_it.c文件中找到定时器中断,找到定时器更新标志位,找到其回调函数,编写该回调函数,实现计数器溢出更新事件。
void TIM3_IRQHandler(void)
{
/* USER CODE BEGIN TIM3_IRQn 0 */
/* USER CODE END TIM3_IRQn 0 */
HAL_TIM_IRQHandler(&htim3);
/* USER CODE BEGIN TIM3_IRQn 1 */
/* USER CODE END TIM3_IRQn 1 */
}
#define TIM_FLAG_UPDATE TIM_SR_UIF /*!< Update interrupt flag */
void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim)
在回调函数中实现彩色流水呼吸灯的功能。在main函数前面定义两个全局变量,分别为time和flag,time来记录定时器进入中断的次数,flag来记录流水呼吸灯的状态。
void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim)
{
switch(flag)
{
case 0:
PWM_SetCampare(255*time,0,165*time);
break;
case 1:
PWM_SetCampare(255*(257-time),0,165*(257-time));
break;
case 2:
PWM_SetCampare(100*time,255*time,165*time);
break;
case 3:
PWM_SetCampare(100*(257-time),255*(257-time),165*(257-time));
break;
case 4:
PWM_SetCampare(255*time,165*time,0);
break;
case 5:
PWM_SetCampare(255*(257-time),165*(257-time),0);
break;
}
if(time==257)
{
time = 0;
flag++;
if(flag==6) flag = 0;
}
time++;
}
例“PWM_SetCampare(100*time,255*time,165*time)”,100为红灯CCR的系数,255为绿灯CCR的系数,165为蓝灯CCR的系数,在我的设定中,255最大,0最小,可以根据自己的设定调整系数最大最小值。通过调整各系数的大小来实现不同的颜色,而通过time的增加和(255-time)的减少来实现呼吸灯功能,最大亮度即为255*257 = 65535为ARR的值。分别设了(255, 0, 165),(100, 255, 165)和(255, 165, 0)三种系数,即实现三种不同的颜色。
根据我时基单元的设定,即每次进入中断的时间为16.3ms,即每16.3秒灯的亮度会变化,根据flag的值,第一种颜色的灯从灭到亮,再从亮到灭,再轮到下一种颜色的灯,这里我设置了三种颜色的灯,可以根据你的需求设置多种。