【MT32F006】MT32F006之PWM控制RGB背光灯

本文最后修改时间: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)尺寸

【MT32F006】MT32F006之PWM控制RGB背光灯_第1张图片

本文采用的是2835型号,28指的是2.8mm宽、35指的是3.5mm长。规格书里可见高是1.1mm。

2)引脚定义

【MT32F006】MT32F006之PWM控制RGB背光灯_第2张图片

3)供电要求

【MT32F006】MT32F006之PWM控制RGB背光灯_第3张图片

要注意红色比其他颜色的供电更低,因为人的眼睛对红色更敏感,所以通过降低红色的电压来让RGB看起来不会偏红。

4)光通量

【MT32F006】MT32F006之PWM控制RGB背光灯_第4张图片

也就是光的亮度,数值越大越亮。

3、什么是背光?

答:LCD是不会发光的,LCD是通过供电和控制来达到透光效果,需要LCD背后有一个发光源,使得人能看到LCD显示的是什么。手机的屏幕就是lcd+背光板。

背光板的颜色,是通过背光板的RGB进行调色。

【MT32F006】MT32F006之PWM控制RGB背光灯_第5张图片

【MT32F006】MT32F006之PWM控制RGB背光灯_第6张图片

4、色温是什么?

答:

【MT32F006】MT32F006之PWM控制RGB背光灯_第7张图片

白光有冷暖色,电子秤上比较理想的白光显示在15000k左右。

六、硬件原理

1、MCU与RGB灯的连接

【MT32F006】MT32F006之PWM控制RGB背光灯_第8张图片

由上图可知:

MT32F006引脚

RGB引脚

亮时所需电平

PIO2_0

BLUE

PIO2_1

RED

PIO0_6

GREEN

2、RGB灯pcb的原理图

【MT32F006】MT32F006之PWM控制RGB背光灯_第9张图片

也就是我们为了增加亮度而用了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)工程中添加驱动文件

【MT32F006】MT32F006之PWM控制RGB背光灯_第10张图片  【MT32F006】MT32F006之PWM控制RGB背光灯_第11张图片

4)在MDK设置中添加驱动源文件路径

【MT32F006】MT32F006之PWM控制RGB背光灯_第12张图片

2、添加库的驱动

1)添加库的驱动文件(为了方便一次性都添加进来,已有则不用添加)【MT32F006】MT32F006之PWM控制RGB背光灯_第13张图片

2)添加库的驱动头文件(mt006_conf.h 中)(为了方便一次性都添加进来,已有则不用添加)

【MT32F006】MT32F006之PWM控制RGB背光灯_第14张图片

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的死区,但不影响使用。

八、注意事项

暂无

九、实验结果

暂无

你可能感兴趣的:(MT32F006,单片机)