基于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个问题上苦恼了很久.查阅无数资料,大多 ...
随机推荐
- mysql索引类型 normal, unique, full text
问题1:mysql索引类型normal,unique,full text的区别是什么? normal:表示普通索引 unique:表示唯一的,不允许重复的索引,如果该字段信息保证不会重复例如身份证号用 ...
- LeetCode题解之 Find Mode in Binary Search Tree
1.题目描述 2.问题分析 使用map记录元素出现的次数. 3.代码 vector<int> v; map<int,int> m; vector<int> find ...
- JVM内核优化
1.垃圾回收器 JVM垃圾回收器有串行和并行两种. 1.1 Serial收集器(串行,单线程),现在使用较少 Serial一般收集新生代 SerialOld一般收集老年代(采用标记压缩算法) 1.2 ...
- weblogic系列漏洞整理 -- 3. weblogic 后台提权
目录 三. weblogic 后台提权 0. 思路分析 1. 利用过程 2. 提示和技巧 一.weblogic安装 http://www.cnblogs.com/0x4D75/p/8916428.ht ...
- 18LaTeX学习系列之---LaTeX的参考文献
目录 目录 前言 (一)简单的参考文献 1.说明 2.源代码 3.输出效果 (二)以文件管理的方式 1.说明: 2.源代码: 3.输出效果 (三)直接从源网站获取 1.说明 2.操作 目录 本系列是有 ...
- Categories VS Extensions (分类 vs 扩展)
转载翻译自:http://rypress.com/tutorials/objective-c/categories 一.Categories(分类) Categories是一个把单个类定义分 ...
- 对数组的操作splice() 和slice() 用法和区别
JavaScript splice() 方法 定义和用法 splice() 方法向/从数组中添加/删除项目,然后返回被删除的项目. 注释:该方法会改变原始数组. 语法 arrayObject.spli ...
- PyCharm设置Python版本
PyCharm默认会使用虚拟的Python解释器,即使没有安装也能够运行Python代码,但有强迫症的程序员一定不能忍受Project中存在这么多的文件目录 设置Python版本 File->S ...
- 洛谷P1144 最短路计数
题目描述 给出一个N个顶点M条边的无向无权图,顶点编号为1-N.问从顶点1开始,到其他每个点的最短路有几条. 输入输出格式 输入格式: 输入第一行包含2个正整数N,M,为图的顶点数与边数. 接下来M行 ...
- mysql 中sql的执行顺序
文章转自 https://www.cnblogs.com/annsshadow/p/5037667.html https://www.cnblogs.com/yyjie/p/7788428.html ...