本文最后修改时间:2023年06月07日
一、本节简介
本文介绍如何使用MT32F006使用PWM控制RGB灯显示白光,再加上扩散膜、导光板、反光纸、遮光纸,即可作为LCD的背光。
二、实验平台
库版本:V1.0.0
编译软件:MDK5.37
硬件平台:MT32F006开发板(主芯片MT32F006)
仿真器:JLINK
三、版权声明
1)作者:甜甜的大香瓜
2)声明:喝水不忘挖井人,转载请注明出处。
3)纠错/业务合作:[email protected]
4)香瓜嵌入式之STM8/STM32群:164311667
5)本文出处:原创连载资料《简单粗暴学MT32F006》
6)完整开源资料下载地址(电脑端打开):opengua.taobao.com
四、实验前提
1、在进行本文步骤前,请先阅读以下章节:
1)《简单粗暴学MT32F006》的“第一章和第二章”章节。
2、在进行本文步骤前,请先实现以下章节:
暂无
五、基础知识
1、什么是RGB灯?
答:普通的白光灯是直接显示白光效果。而RGB灯是通过调整R(red红色)、G(green绿色)、B(blue蓝色)三色的比例,来达到显示白光效果。
但RGB灯的白光效果不如白光灯的效果,一方面是亮度不如、一方面是色温效果不如。
2、RGB灯有哪些重要参数?
答:
1)尺寸
本文采用的是2835型号,28指的是2.8mm宽、35指的是3.5mm长。规格书里可见高是1.1mm。
2)引脚定义
3)供电要求
要注意红色比其他颜色的供电更低,因为人的眼睛对红色更敏感,所以通过降低红色的电压来让RGB看起来不会偏红。
4)光通量
也就是光的亮度,数值越大越亮。
3、什么是背光?
答:LCD是不会发光的,LCD是通过供电和控制来达到透光效果,需要LCD背后有一个发光源,使得人能看到LCD显示的是什么。手机的屏幕就是lcd+背光板。
背光板的颜色,是通过背光板的RGB进行调色。
4、色温是什么?
答:
白光有冷暖色,电子秤上比较理想的白光显示在15000k左右。
六、硬件原理
1、MCU与RGB灯的连接
由上图可知:
MT32F006引脚 |
RGB引脚 |
亮时所需电平 |
PIO2_0 |
BLUE |
高 |
PIO2_1 |
RED |
高 |
PIO0_6 |
GREEN |
高 |
2、RGB灯pcb的原理图
也就是我们为了增加亮度而用了3个RGB灯,分别将R、G、B各自接到了一起。
七、实验步骤
1、编写并添加串口驱动
1)编写驱动GUA_PWM.c(存放在“……\Projects\MT006_StdPeriph_Templates\GUA”)
//********************************************************************** //name: GUA_PWM.c //introduce: PWM驱动 //author: 甜甜的大香瓜 //email: [email protected] //shop: opengua.taobao.com //changetime: 2023.04.11 //********************************************************************** #include "GUA_PWM.h" /*********************宏定义************************/ #define GUA_PWM_PRESCALE 1 //PWM 分频系数 #define GUA_PWM_FREQ 20200 //PWM 频率20.2k /*********************全局变量************************/ GUA_U8 gGUA_PWM_DutyCycle =0; //********************************************************************** //name: GUA_PWM_Set //introduce: PWM的设置 //parameter: nGUA_PWM_Channel:GUA_PWM_CHANNEL_R or GUA_PWM_CHANNEL_G or GUA_PWM_CHANNEL_B // nGUA_PWM_DutyCycle:占空比0~100 // nGUA_NewState:GUA_PWM_ENABLE or GUA_PWM_DISABLE //return: none //author: 甜甜的大香瓜 //email: [email protected] //shop: opengua.taobao.com //changetime: 2023.04.11 //********************************************************************** void GUA_PWM_Set(GUA_U32 nGUA_PWM_Channel, GUA_U16 nGUA_PWM_DutyCycle, GUA_U8 nGUA_NewState) { MCPWM_InitTypeDef MCPWM_InitStructure; uint32_t hclk = RCC_GetClocksFreq(RCC_CLOCKFREQ_SYSAHBCLK);
//通道0和通道1都是用的MCOA,极性相同 if((nGUA_PWM_Channel == MCPWM_CHANNEL_0) || (nGUA_PWM_Channel ==MCPWM_CHANNEL_1)) { MCPWM_InitStructure.MCPWM_Channel = nGUA_PWM_Channel; //通道 MCPWM_InitStructure.MCPWM_Match = hclk/GUA_PWM_PRESCALE / GUA_PWM_FREQ / 2 *(100-nGUA_PWM_DutyCycle)/100 -1; MCPWM_InitStructure.MCPWM_Limit = hclk/GUA_PWM_PRESCALE / GUA_PWM_FREQ /2 - 1; MCPWM_InitStructure.MCPWM_DeadTime = 1; //死区时间为200ns MCPWM_InitStructure.MCPWM_Center = MCPWM_CENTER_CA; //中心对齐模式 MCPWM_InitStructure.MCPWM_Update = MCPWM_Update_EN; //MCPWM运行时可以更新PWM周期、占空比 MCPWM_InitStructure.MCPWM_Polarity = MCPWM_Polarity_ILAH; //无效状态为低电平,有效状态为高电平 MCPWM_Init(&MCPWM_InitStructure); MCPWM_Cmd(nGUA_PWM_Channel, nGUA_NewState); } //通道2是用的MCOB,极性相反 else { MCPWM_InitStructure.MCPWM_Channel = nGUA_PWM_Channel; //通道 MCPWM_InitStructure.MCPWM_Match = hclk/GUA_PWM_PRESCALE / GUA_PWM_FREQ / 2 *(100-nGUA_PWM_DutyCycle)/100 -1; MCPWM_InitStructure.MCPWM_Limit = hclk/GUA_PWM_PRESCALE / GUA_PWM_FREQ /2 - 1; MCPWM_InitStructure.MCPWM_DeadTime = 1; //死区时间为200ns MCPWM_InitStructure.MCPWM_Center = MCPWM_CENTER_CA; //中心对齐模式 MCPWM_InitStructure.MCPWM_Update = MCPWM_Update_EN; //MCPWM运行时可以更新PWM周期、占空比 MCPWM_InitStructure.MCPWM_Polarity = MCPWM_Polarity_IHAL; //无效状态为高电平,有效状态为低电平 MCPWM_Init(&MCPWM_InitStructure); MCPWM_Cmd(nGUA_PWM_Channel, nGUA_NewState); } } //********************************************************************** //name: GUA_PWM_Init //introduce: PWM初始化 //parameter: none //return: none //author: 甜甜的大香瓜 //email: [email protected] //shop: opengua.taobao.com //changetime: 2023.04.11 //********************************************************************** void GUA_PWM_Init(void) { GPIO_InitTypeDef GPIO_InitStructure; uint32_t MCPWM_Prescale = GUA_PWM_PRESCALE; //R PIO2_1 MCOB2 GPIO_InitStructure.GPIO_Pin = GPIO_Pin_1; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_Level_2; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_4; GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL; GPIO_Init(GPIO2, &GPIO_InitStructure); //G PIO0_6 MCOA0 GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_Level_2; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_3; GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL; GPIO_Init(GPIO0, &GPIO_InitStructure);
//B PIO2_0 MCOA1 GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_Level_2; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_2; GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL; GPIO_Init(GPIO2, &GPIO_InitStructure); RCC_APBPeriphClockCmd(RCC_AHBCLKCTRL_MCPWM, ENABLE); MCPWM_DeInit(); MCPWM_SetPrescale(MCPWM_Prescale); //初始化通道 gGUA_PWM_DutyCycle = 99; GUA_PWM_Set(GUA_PWM_CHANNEL_R, gGUA_PWM_DutyCycle, GUA_PWM_ENABLE); GUA_PWM_Set(GUA_PWM_CHANNEL_G, gGUA_PWM_DutyCycle, GUA_PWM_ENABLE); GUA_PWM_Set(GUA_PWM_CHANNEL_B, gGUA_PWM_DutyCycle, GUA_PWM_ENABLE); } |
2)编写驱动头文件GUA_HT1628.h
(存放在“……\Projects\MT006_StdPeriph_Templates\GUA”)
//********************************************************************** //name: GUA_PWM.h //introduce: PWM驱动的头文件 //author: 甜甜的大香瓜 //email: [email protected] //shop: opengua.taobao.com //changetime: 2023.04.11 //********************************************************************** #ifndef _GUA_PWM_H_ #define _GUA_PWM_H_ /*********************头文件************************/ #include "mt006.h" /*********************宏定义************************/ //类型宏 #ifndef GUA_C typedef char GUA_C; #endif #ifndef GUA_U8 typedef unsigned char GUA_U8; #endif #ifndef GUA_8 typedef signed char GUA_8; #endif #ifndef GUA_U16 typedef unsigned short GUA_U16; #endif #ifndef GUA_16 typedef signed short GUA_16; #endif #ifndef GUA_U32 typedef unsigned long GUA_U32; #endif #ifndef GUA_32 typedef signed long GUA_32; #endif //通道 #define GUA_PWM_CHANNEL_R MCPWM_CHANNEL_2 //PWM R通道 #define GUA_PWM_CHANNEL_G MCPWM_CHANNEL_0 //PWM G通道 #define GUA_PWM_CHANNEL_B MCPWM_CHANNEL_1 //PWM B通道 //通道 #define GUA_PWM_ENABLE 1 //PWM 通道开启 #define GUA_PWM_DISABLE 0 //PWM 通道关闭 /*********************外部全局变量声明************************/ extern GUA_U8 gGUA_PWM_DutyCycle; /*********************外部函数声明************************/ extern void GUA_PWM_Set(GUA_U32 nGUA_PWM_Channel, GUA_U16 nGUA_PWM_DutyCycle, GUA_U8 nGUA_NewState); extern void GUA_PWM_Init(void); #endif |
3)工程中添加驱动文件
4)在MDK设置中添加驱动源文件路径
2、添加库的驱动
1)添加库的驱动文件(为了方便一次性都添加进来,已有则不用添加)
2)添加库的驱动头文件(mt006_conf.h 中)(为了方便一次性都添加进来,已有则不用添加)
3、在应用层中调用
1)添加驱动头文件(main.c中)
#include "GUA_PWM.h" |
2)添加驱动初始化代码(main.c的main函数中)
//RGB背光灯初始化 GUA_PWM_Init(); |
3)添加测试代码(main.c的main函数中)
gGUA_PWM_DutyCycle = 50; GUA_PWM_Set(GUA_PWM_CHANNEL_R, gGUA_PWM_DutyCycle, GUA_PWM_ENABLE); GUA_PWM_Set(GUA_PWM_CHANNEL_G, gGUA_PWM_DutyCycle, GUA_PWM_ENABLE); GUA_PWM_Set(GUA_PWM_CHANNEL_B, gGUA_PWM_DutyCycle, GUA_PWM_ENABLE); |
可以自行调整占空比,但100时会出问题,最多到99。原因不详,有可能是pwm的死区,但不影响使用。
八、注意事项
暂无
九、实验结果
暂无