基于uFUN开发板的RGB调色板
前言
使用uFUN开发板配合Qt上位机,实现任意颜色的混合,Qt上位机下发RGB数值,范围0-255,uFUN开发板进行解析,然后输出不同占空比的PWM,从而实现通过RGB三原色调制出任意颜色。
Qt上位机界面:

演示视频
优酷视频链接:演示视频
如果上面的链接打不开的话,可以下载观看:演示视频.mp4
RGB简介

RGB 模型是目前常用的一种彩色信息表达方式,它使用红、绿、蓝三原色的亮度来定量表示颜色。该模型也称为加色混色模型,是以RGB三色光互相叠加来实现混色的方法,因而适合于显示器等发光体的显示。
可以通过调整RGB三种原色的比例,来混合出任何你想要的颜色。
uFUN开发板的硬件电路
uFUN开发板上的RGB灯硬件电路也很简单,可以通过TIM5/TIM2的通道1、通道2、通道3来控制,通过实际验证,发现PWM_B和PWM_G两个引脚的网络标号反了,如下图:

定时器输出PWM配置
使用TIM5或者TIM2都可以,但是在使用TIM5软件仿真的时候,发现没有PWM波输出,而实际有输出,不知道这是不是Keil的一个BUG,我的是5.16a版本的。
void RGB_LED_Init(void)
{
GPIO_InitTypeDef IO_Init;
TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;
TIM_OCInitTypeDef OC_Init;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM5, ENABLE);
IO_Init.GPIO_Mode = GPIO_Mode_AF_PP;
IO_Init.GPIO_Pin = GPIO_Pin_0 | GPIO_Pin_1 | GPIO_Pin_2;
IO_Init.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOA, &IO_Init);
TIM_DeInit(TIM5);
TIM_TimeBaseStructure.TIM_Period = 256-1;
TIM_TimeBaseStructure.TIM_Prescaler = 71;
TIM_TimeBaseStructure.TIM_ClockDivision = 0;
TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;
TIM_TimeBaseInit(TIM5, &TIM_TimeBaseStructure);
OC_Init.TIM_OCMode = TIM_OCMode_PWM2;//输出模式
OC_Init.TIM_OutputState = ENABLE; //输出使能
OC_Init.TIM_OCPolarity = TIM_OCPolarity_High; //输出极性
// OC_Init.TIM_Pulse = 50;
TIM_OC1Init(TIM5, &OC_Init);
TIM_OC2Init(TIM5, &OC_Init);
TIM_OC3Init(TIM5, &OC_Init);
TIM_OC1PreloadConfig(TIM5, TIM_OCPreload_Enable);
TIM_OC2PreloadConfig(TIM5, TIM_OCPreload_Enable);
TIM_OC3PreloadConfig(TIM5, TIM_OCPreload_Enable);
TIM_Cmd(TIM5, ENABLE);
}
这里的计数周期,设置成了255,即0-255对应占空比0-100,可以通过下面这个函数来设置对应通道的占空比:
//设置LED占空比
void SetDutyCycle(LEDtype LEDn, int dty)
{
switch(LEDn)
{
case R_LED:
TIM_SetCompare2(TIM5, dty);
break;
case G_LED:
TIM_SetCompare1(TIM5, dty);
break;
case B_LED:
TIM_SetCompare3(TIM5, dty);
break;
default:
TIM_SetCompare1(TIM5, 0);
TIM_SetCompare2(TIM5, 0);
TIM_SetCompare2(TIM5, 0);
break;
}
}
串口命令的解析
Qt上位机下发的数据格式如下:
R+数值+G+数值+B+数值+*
如:
R12G123B45*
R155G9B24*
数值有1-3位,STM32接收到数据之后,可以解析出对应的数值,
12 123 45
155 9 24
然后控制对应的PWM输出。
串口中断函数:
uint8_t rx_buf[100];
uint8_t rx_len;
void USART1_IRQHandler(void) //串口1中断服务程序
{
uint8_t dat;
if(USART_GetITStatus(USART1, USART_IT_RXNE) != RESET)
{
dat = USART_ReceiveData(USART1); //读取接收到的数据
// USART_SendData(USART1, dat);
if(dat == '*')
{
//R123G123B213*
// printf("%s %d", rx_buf, rx_len);
ParseCmd(rx_buf, rx_len);
memset(rx_buf, 0, rx_len);
rx_len = 0;
}
else
{
rx_buf[rx_len++] = dat;
}
}
}
串口数据解析,获取到RGB对应的数值:
void ParseCmd(char *rx_buf, size_t len)
{
uint8_t R_Num, G_Num, B_Num;
char R_Str[20], G_Str[20], B_Str[20];
char *R, *G, *B;
len = strlen(rx_buf);
R = strstr(rx_buf, "R");
G = strstr(rx_buf, "G");
B = strstr(rx_buf, "B");
strncpy(R_Str, R+1, G-R-1);
R_Str[G-R-1] = '\0';
strncpy(G_Str, G+1, B-G-1);
G_Str[B-G-1] = '\0';
strncpy(B_Str, B+1, len - (B - rx_buf)-1);
B_Str[len - (B - rx_buf)-1] = '\0';
// printf("R:-%s-,\r\nG:-%s-,\r\nB:-%s-,\r\n", R_Str, G_Str, B_Str);
R_Num = atoi(R_Str);
G_Num = atoi(G_Str);
B_Num = atoi(B_Str);
// printf("%d %d %d", R_Num, G_Num, B_Num);
SetDutyCycle(R_LED, R_Num);
SetDutyCycle(G_LED, G_Num);
SetDutyCycle(B_LED, B_Num);
}
代码下载
- uFUN开发板STM32工程代码下载:RGB_STM32_Prj.rar
- Qt上位机调色软件下载:uFUN_RGB_Ctrl_v1.1.exe

uFUN评测系列文章
- 基于uFUN开发板的心率计(一)DMA方式获取传感器数据
- 基于uFUN开发板的心率计(二)动态阈值算法获取心率值
- 基于uFUN开发板的心率计(三)Qt上位机的实现
- Qt实现软件自动更新的一种简单方法
- 【UFUN开发板评测】小巧而不失精致,简单而不失内涵——uFun开发板开箱爆照
- 如何使用串口来给STM32下载程序
- STM32串口打印输出乱码的解决办法
- Keil报错:cannot open source input file "core_cmInstr.h" 解决办法
欢迎大家关注我的个人博客:www.wangchaochao.top
或微信扫码关注我的公众号

基于uFUN开发板的RGB调色板的更多相关文章
- 基于uFUN开发板和扩展板的联网校准时钟
项目概述 上周在uFUN试用群里看到管理员说试用活动快结束了,要抓紧完成评测总结,看大家的评测总结也都写了,我也不能落后啊!正好最近做的扩展板到手了,于是赶紧进行调试,做了一个不用校准的时钟,时钟这种 ...
- 基于uFUN开发板的心率计(三)Qt上位机的实现
前言 上两周利用周末的时间,分别写了基于uFUN开发板的心率计(一)DMA方式获取传感器数据和基于uFUN开发板的心率计(二)动态阈值算法获取心率值,介绍了AD采集传感器数据和数据的滤波处理获取心率值 ...
- 基于uFUN开发板的心率计(二)动态阈值算法获取心率值
前言 上一篇文章:基于uFUN开发板的心率计(一)DMA方式获取传感器数据,介绍了如何获取PulseSensor心率传感器的电压值,并对硬件电路进行了计算分析.心率计,重要的是要获取到心率值,本篇文章 ...
- 基于uFUN开发板的心率计(一)DMA方式获取传感器数据
前言 从3月8号收到板子,到今天算起来,uFUN到手也有两周的时间了,最近利用下班后的时间,做了个心率计,从单片机程序到上位机开发,到现在为止完成的差不多了,实现很简单,uFUN开发板外加一个Puls ...
- 千呼万唤始出来——uFUN开发板2.0开箱评测
前言 今年3月,我参与了面包板社区组织的第一批uFUN开发板评测活动,并有幸能获得试用机会,那是我第一次了解到uFUN这个项目及背后的故事,4月份,uFUN 2.0版本来了,收到了张工送的一块样板,后 ...
- 【UFUN开发板评测】小巧而不失精致,简单而不失内涵——uFun开发板开箱爆照
关于uFun学习板--"满满的爱和正能量" uFun是由@张进东 张工组织发起的一个开源的学习板,设计初衷是为了帮助学生更好的理解电子知识和开发技巧,同时又能对学生毕业找工作有很明 ...
- 基于 Arduino 开发板,这款插座是可编程且开源的
基于 Arduino 开发板,这款插座是可编程且开源的 https://www.oschina.net/news/74861/open-source-socket https://github.com ...
- 【RTOS】基于V7开发板的uCOS-III,uCOS-II,RTX4,RTX5,FreeRTOS原版和带CMSIS-RTOS V2封装层版全部集齐
RTOS模板制作好后,后面堆各种中间件就方便了. 1.基于V7开发板的最新版uCOS-II V2.92.16程序模板,含MDK和IAR,支持uC/Probe https://www.cnblogs.c ...
- 【基于mini2440开发板的交叉编译环境及内核树配置.
在学习linux驱动开发过程中,交叉编译环境的配置及内核树的生成无疑是对linux不是十分了解的新人面前的一堵墙.高高大大的墙...笔者在初探这一方向时,就在这2个问题上苦恼了很久.查阅无数资料,大多 ...
随机推荐
- 慕学在线网0.2_users表设计(2)
接着上一篇,我们继续对users表进行完善.其中包括邮箱验证码(EmailVerifyRecord)和轮播图(PageBanner)两个model. 1.编写"models.py" ...
- 安装VisualSVN Server 报"Service 'VisualSVN Server' failed to start. Please check VisualSVN Server log in Event Viewer for more details"错误.原因是启动"VisualSVN Server"失败
安装VisualSVN Server 报"Service 'VisualSVN Server' failed to start. Please check VisualSVN Server ...
- asp.net根据参数找不到记录后响应404及显示错误页
在asp.net mvc 中,action方法里根据参数获取数据,假如获取的数据为空,为了响应404错误页,我们可以return HttpNotFound(); 但是在asp.net webform中 ...
- 第六章 键盘(SYSMETS4)
//SYSMETS.H -- System metrics display structure #include <Windows.h> #define NUMLINES ((int) ( ...
- popen()/pclose()阻塞性问题验证
背景: popen()函数通过创建一个管道,调用fork()产生一个子进程,执行一个shell以运行命令来开启一个进程.这个管道必须由pclose()函数关闭,而不是fclose()函数. pclos ...
- VRS的GPS/BDS双系统网元固定存在的问题
问题如下:部分网元固定卫星数少于2个. 另外:北方xinkong的网元组网也存在问题
- 17秋 软件工程 团队第五次作业 Alpha Scrum10
17秋 软件工程 团队第五次作业 Alpha Scrum10 今日完成的任务 世强:Android客户端成员列表完善.APP前端子部门和活动中心界面与数据交互: 港晨:Web前端主页的接口对接: 树民 ...
- Python 使用 xlwings 往 excel 中写入一行数据的两种方法
该方法跟上一篇写入一列的方法相反,代码如下: # -*- coding:utf-8 -*- import xlwings as xw list1 = [1,2,3,4,5] list2 = [[1], ...
- UVA506-System Dependencies(拓扑序)
Problem UVA506-System Dependencies Accept:285 Submit:2824 Time Limit: 3000 mSec Problem Description ...
- 转://oracle字符集
一.oracle字符集基础知识oracle数据库有国家字符集(national character set)与数据库字符集(database character set)之分.两者都是在创建数据库时需 ...