通过STM32使用PWM实现的RGB调光

这篇具有很好参考价值的文章主要介绍了通过STM32使用PWM实现的RGB调光。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

最近看看,买的器材发现还有一个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灯,并有按键控制,

stm32设计实现rgb灯的不同色彩显示。由于rgb灯没有接在定时器有pwm波输出的管脚上,stm32,嵌入式硬件,单片机

stm32设计实现rgb灯的不同色彩显示。由于rgb灯没有接在定时器有pwm波输出的管脚上,stm32,嵌入式硬件,单片机

以上是两种灯光颜色,后续可以通过不同色域来实现不同的灯光颜色文章来源地址https://www.toymoban.com/news/detail-855769.html

到了这里,关于通过STM32使用PWM实现的RGB调光的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包赞助服务器费用

相关文章

  • STM32L4 HAL库通过串口通信改变PWM占空比

    STM32L4 HAL库通过串口通信改变PWM占空比

    使用串行通信的目的是为了让上位机能控制STM32来改变PWM的输出 这里用的是定时器TIM4的3通道,当然也可以改为其他的定时器,具体请参考手册 偷下懒,直接拿正点原子的例子程序修改了一下。 示例用的是UART1 引脚是PA9(TX),PA10(RX) 主要修改的地方在接收数据的部分,我用l

    2024年02月15日
    浏览(15)
  • RT-Thread使用PWM实现灯亮度调节——STM32F407

    RT-Thread使用PWM实现灯亮度调节——STM32F407

    提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 RT-Thread使用PWM实现灯亮度调节——STM32F407ZG 作为新入门的嵌入式选手,最近在学习RT-Thread操作系统,鉴于自己健忘的记性,打算记录下来后面好回顾学习。 今天要总结的是RT-Thread使用PWM实现灯亮度调节

    2024年02月15日
    浏览(9)
  • STM32使用PWM

    STM32使用PWM

    1.定义:PWM,就是脉冲宽度调制,也就是占空比可变的脉冲波形。 2.适用条件:PWM所应用的场景必须为惯性系统,像led,当立即变为低电平时,led并不会瞬间熄灭,而是具有惯性,在短时间内为逐渐熄灭。 3.应用:智能车,机器人等项目。呼吸灯、驱动电机等。 频率为Ts的倒

    2024年02月09日
    浏览(10)
  • AP51656 电流采样降压恒流驱动IC RGB PWM深度调光 LED电源驱动

    AP51656 电流采样降压恒流驱动IC RGB PWM深度调光 LED电源驱动

    产品描述 AP51656是一款连续电感电流导通模式的降压恒流源,用于驱动一颗或多颗串联LED 输入电压范围从 5 V 到 60V,输出电流 可达 1.5A 。根据不同的输入电压和 外部器件, 可以驱动高达数十瓦的 LED。 内置功率开关,采用电流采样设置 LED 平均电流,通过 DIM 引脚可以接受模

    2024年02月14日
    浏览(40)
  • STM32产生PWM实现正弦输出

    STM32产生PWM实现正弦输出

    本文使用 STM32-G070RB的定时器TIM1产生PWM波,并外接一阶低通滤波器,实现DAC效果,最终在示波器上显示正弦输出。主要分为两步:实现 PWM 输出,实现DAC功能。 实验用具 STM32-G070RB STM32CubeMX STM32CubeIDE PWM输出正弦波原理 1 个 PWM 波形假设为 500Hz(目标定时器频率) ,等效正弦波

    2024年02月06日
    浏览(5)
  • STM32使用PWM(脉冲宽度调制)

    STM32使用PWM(脉冲宽度调制)

    脉冲宽度调制(PWM),是英文“Pulse Width Modulation”的缩写,简称脉宽调制,是利用微处理器的数字输出(1或0)来对模拟电路进行控制的一种非常有效的技术。 PWM应用场景如下: 占空比:占空比是指在一个脉冲循环内,通电时间(可能是高电平,可能是低电平)相对于总时间所

    2024年02月13日
    浏览(8)
  • STM32 通过PWM输出一个方波并通过定时器输入捕获模式测量方波的周期(cubeMX+keil配置)

    STM32 通过PWM输出一个方波并通过定时器输入捕获模式测量方波的周期(cubeMX+keil配置)

    前言:本文章用cubeMX和keil来进行代码编写,实现STM32的相应功能 本文章使用的STM32核心板是STM32H743VIT6,如果使用的是其他的核心板操作过程类似,可以尝试使用此教程。 (1)首先点击左侧的Timers  (2)选择一个定时器配置PWM 我选择的是TIM5,如上图 点击TIM5 Mode的配置如下

    2024年02月19日
    浏览(9)
  • PWM在STM32中使用指南

    PWM在STM32中使用指南

    PWM(脉冲宽度调制)是一种常用来控制模拟电路的技术,通过修改脉冲的宽度(即在固定周期内的高电平持续时间)来调控输出信号的平均电压。 一个PWM信号主要包括两个部分:一个是 占空比 ,它决定了信号高电平状态的时间比例;另一个是 频率 ,它决定了PWM周期的长短

    2024年02月22日
    浏览(9)
  • STM32CubeMX | 使用STM32定时器的PWM输入模式测量脉冲宽度和周期

    STM32CubeMX | 使用STM32定时器的PWM输入模式测量脉冲宽度和周期

    本篇博客以STM32F103C8为例,其他系列MCU可能稍有不同,但原理一样。 相关链接博文: STM32CubeMX | STM32使用HAL库实现定时器PWM输出 STM32CubeMX | STM32使用HAL库进行脉冲宽度和周期测量 1、介绍 以前写过一篇博文,介绍的是如何使用定时器的输入捕获功能测量脉冲的宽度以及周期,适

    2024年02月13日
    浏览(6)
  • STM32自学历程——PWM呼吸灯的实现(下)

    STM32自学历程——PWM呼吸灯的实现(下)

    成功实现LED灯的呼吸效果,先由暗到亮,再由亮到暗,以此循环往复。 VID20240116160256 因为,PWM部分是挂靠在定时器里面的,所以代码必须要先初始化定时器,当然初始化定时器就可以直接用之前的定时器初始化,这里不再需要中断NVIC模块,所以可以直接去掉。 定时器初始化

    2024年01月23日
    浏览(5)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包