news 2026/10/10 5:32:45

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

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
【MT32F006】MT32F006之PWM控制背光灯(RGB)

本文最后修改时间:2026年09月17日

一、本节简介

本文介绍如何使用MT32F006使用PWM控制RGB灯显示白光,再加上扩散膜、导光板、反光纸、遮光纸,即可作为LCD的背光。

二、实验平台

库版本:V1.0.0

编译软件:MDK5.37

硬件平台:MT32F006开发板(主芯片MT32F006)

仿真器:JLINK

三、版权声明

1)作者:甜甜的大香瓜

2)声明:喝水不忘挖井人,转载请注明出处。

3)本文出处:原创连载资料《简单粗暴学MT32F006》

四、实验前提

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: 897503845@qq.com

//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: 897503845@qq.com

//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: 897503845@qq.com

//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_PWM.h

(存放在“……\Projects\MT006_StdPeriph_Templates\GUA”)

//**********************************************************************

//name: GUA_PWM.h

//introduce: PWM驱动的头文件

//author: 甜甜的大香瓜

//email: 897503845@qq.com

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

八、注意事项

暂无

九、实验结果

暂无

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/10/10 5:30:37

Python shlex 完全指南:从词法原理到命令行安全解析

第一次在别人的工具源码里看到import shlex时,我第一反应是:这名字是故意的吧?后来翻了文档才知道,它全称是shell lexical analyzer,也就是“Shell 词法分析器”。当时我正好在写一个需要解析命令行字符串的工具&#…

作者头像 李华