使用STM32进行RGB调光的PWM实现方法

最近看看,买的器材发现还有一个RGB灯,想了一下发现可以用PWM来实现一个RGB的调光

首先就是PWM,PWM就是脉冲调制,是一种控制信号的占空比,是指在一秒内,信号从高电平到低电平在回到高电平的次数表示为一个周期。

下面就是PWM配置的代码

void PWM_Init(u16 arr, u16 psc)
{
	
	
	RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2, ENABLE);

	TIM_InternalClockConfig(TIM2);
	
	TIM_TimeBaseInitTypeDef TIM_TimeBaseInitStructure;
	TIM_TimeBaseInitStructure.TIM_ClockDivision = TIM_CKD_DIV1;
	TIM_TimeBaseInitStructure.TIM_CounterMode = TIM_CounterMode_Up;
	TIM_TimeBaseInitStructure.TIM_Period = arr - 1;		//ARR
	TIM_TimeBaseInitStructure.TIM_Prescaler = psc - 1;		//PSC???
	TIM_TimeBaseInitStructure.TIM_RepetitionCounter = 0;
	TIM_TimeBaseInit(TIM2, &TIM_TimeBaseInitStructure);
	
	TIM_OCInitTypeDef TIM_OCInitStructure;
	TIM_OCStructInit(&TIM_OCInitStructure);
	TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1;
	TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_Low;
	TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;
	TIM_OCInitStructure.TIM_Pulse = 0;		//CCR
	
	TIM_OC2Init(TIM2, &TIM_OCInitStructure);
	TIM_OC2PreloadConfig(TIM2,TIM_OCPreload_Enable);
	TIM_OC3Init(TIM2,&TIM_OCInitStructure);
	TIM_OC3PreloadConfig(TIM2,TIM_OCPreload_Enable);
	TIM_OC4Init(TIM2,&TIM_OCInitStructure);
	TIM_OC4PreloadConfig(TIM2,TIM_OCPreload_Enable);
	TIM_ARRPreloadConfig(TIM2,ENABLE);
	TIM_Cmd(TIM2, ENABLE);
	TIM_ITConfig(TIM2,TIM_IT_Update,ENABLE);
	NVIC_InitTypeDef NVIC_InitStrucure;
	NVIC_InitStrucure.NVIC_IRQChannel=TIM2_IRQn;
	NVIC_InitStrucure.NVIC_IRQChannelPreemptionPriority=0;
	NVIC_InitStrucure.NVIC_IRQChannelSubPriority=3;
	NVIC_InitStrucure.NVIC_IRQChannelCmd=ENABLE;
	NVIC_Init(&NVIC_InitStrucure);
}

通过上述代码配置好当前的PWM,接着就是写入功能PWM颜色为0-255这里我选择几个颜色,一组为30,对应RGB后续可以通过画图工具来改变不同的数组内容来实现不同的颜色

uint16_t RGB_LED[]={30,305,40,450,20,505,60};
static uint16_t pwm_indx=0;
static uint16_t amplitude=0;
static uint16_t sm=0;
const  uint16_t R[]={255,226,198,170,141,113,85,66,28,
                     0,0,0,0,0,0,0,0,0,0,0,0,28,56,85,113,141,170,198,226,255};
const  uint16_t G[]={0,28,56,85,113,141,170,198,226,255
	                ,255,226,198,170,141,113,85,66,28,0,
	                  0,0,0,0,0,0,0,0,0,0};
const  uint16_t B[]={0,0,0,0,0,0,0,0,
	                0,0,0,28,56,85,113,141,170,198,226,255,
	                 255,226,198,170,141,113,85,66,28,0};//表示调色
		
uint8_t i;
uint16_t sum=0;
uint16_t su=0;
void speed();					
					
int main(void)
{
	Serial_Init();
	OLED_Init();
	LED_Init();
	PWM_Init(1000,72);
	Key_Init();

	while (1)
	{
		speed();
	}
			
	}

	
	
void speed(void)
{
	if(GPIO_ReadInputDataBit(GPIOB, GPIO_Pin_4) == 0)//按键按下控制调色
			{
			OLED_Clear();
			OLED_ShowString(1,1,"RGB:");//
			Delay_ms(20);
		   while (GPIO_ReadInputDataBit(GPIOB, GPIO_Pin_4) == 0);
		    Delay_ms(20);
			sum++;
			su++;
			OLED_ShowHexNum(1,5,sum,2);//显示当前按键按下的次数
		}
		if(sum>=8)//大于八次就重置
		{
		su=2;
		sum=0;}
		
		if(su>1){
		if(amplitude>RGB_LED[sum])
		{pwm_indx++;
			if(pwm_indx>(30-1))
			{
				pwm_indx=0;
			}
			amplitude=0;
		}
		else
		{
			TIM2->CCR2=R[pwm_indx];//将数组数据移到定时器
			TIM2->CCR3=G[pwm_indx];
			TIM2->CCR4=B[pwm_indx];
		}
	}

	if(GPIO_ReadInputDataBit(GPIOA, GPIO_Pin_15) == 0)//按键按下开始循环
		{
			OLED_Clear();
			OLED_ShowString(1,1,"speed:");
			Delay_ms(20);
		   while (GPIO_ReadInputDataBit(GPIOA, GPIO_Pin_15) == 0);
		    Delay_ms(20);
			su=0;
			sm++;
			OLED_ShowHexNum(1,7,sm,2);
			if(sm>(30-1))
			{
				sm=0;
			}
			
		
		else
		{
			TIM2->CCR2=R[sm];
			TIM2->CCR3=G[sm];
			TIM2->CCR4=B[sm];
		}
		
	
		}
}	

void TIM2_IRQHandler(void)
{

	if(TIM_GetITStatus(TIM2,TIM_IT_Update)!=RESET)
	{
		TIM_ClearITPendingBit(TIM2,TIM_IT_Update);
		
		amplitude++;
		
	}
}

上述代码实现点亮RGB灯,并有按键控制,

以上是两种灯光颜色,后续可以通过不同色域来实现不同的灯光颜色

作者:瓜瓜码

物联沃分享整理
物联沃-IOTWORD物联网 » 使用STM32进行RGB调光的PWM实现方法

发表评论