最近看看,买的器材发现还有一个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灯,并有按键控制,
文章来源:https://www.toymoban.com/news/detail-855769.html
以上是两种灯光颜色,后续可以通过不同色域来实现不同的灯光颜色文章来源地址https://www.toymoban.com/news/detail-855769.html
到了这里,关于通过STM32使用PWM实现的RGB调光的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!