在野火STM32F103ZET6霸道V2开发板上实现多彩流水呼吸灯。

查看野火霸道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的值,第一种颜色的灯从灭到亮,再从亮到灭,再轮到下一种颜色的灯,这里我设置了三种颜色的灯,可以根据你的需求设置多种。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值