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

news2025/1/21 15:31:08

本文最后修改时间:2023年06月07日

一、本节简介

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

二、实验平台

库版本:V1.0.0

编译软件:MDK5.37

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

仿真器:JLINK

三、版权声明

1)作者:甜甜的大香瓜

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

3)纠错/业务合作:897503845@qq.com

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

八、注意事项

暂无

九、实验结果

暂无

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/895410.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【24择校指南】齐鲁工业大学计算机考研考情分析

齐鲁工业大学 考研难度(☆) 内容:23考情概况(拟录取和复试分析)、院校概况、23专业目录、23复试详情、各专业考情分析、各科目考情分析。 正文1140字,预计阅读:3分钟。 2023考情概况 齐鲁工…

将eNSP Pro部署在华为云是什么体验

eNSP Pro简介 eNSP Pro 是华为公司数据通信产品线新推出的数通设备模拟器,主要应用在数据通信技能培训,为使用者提供华为数据通信产品设备命令行学习环境。 具备的能力 多产品模拟能力:支持数据通信产品线NE路由器、CE交换机、S交换机、AR…

Streamlit 讲解专栏(十):数据可视化-图表绘制详解(上)

文章目录 1 前言2 st.line_chart:绘制线状图3 st.area_chart:绘制面积图4 st.bar_chart:绘制柱状图5 st.pyplot:绘制自定义图表6 结语 1 前言 在数据可视化的世界中,绘制清晰、易于理解的图表是非常关键的。Streamlit…

算法笔记:A*算法

A*算法是一种很常用的路径查找和图形遍历算法。它有较好的性能和准确度 1 中心思路 A*算法通过下面这个函数来计算每个节点n的优先级 f(n)g(n)h(n) f(n)是节点n的综合优先级。当选择下一个要遍历的节点时,总会选取综合优先级最高(f(n)值最小&#xff0…

算法通关村第三关【黄金】| 数组元素出现次数问题

1.数字出现的次数超过数组长度的一半 方法一、使用Map键值对来记录每个元素出现的次数&#xff0c;返回次数大于一半的 class Solution {public int majorityElement(int[] nums) {Map<Integer,Integer> map new HashMap<>();for(int i 0;i<nums.length;i){m…

解决跨时区跨语言的国外大文件传输问题

随着信息技术的飞速发展和全球化的深入推进&#xff0c;跨国团队、跨国公司之间的合作变得越来越普遍。在这种背景下&#xff0c;大文件的传输成为了一个经常遇到的挑战。跨语言、跨时区的国外大文件传输&#xff0c;由于涉及到复杂的网络环境、不同国家法律法规等多方面的问题…

苹果iOS16曝出新漏洞:飞行模式下依旧可连接网络

近日&#xff0c;网络安全研究人员发现iOS 16存在一种新的漏洞利用后持久化技术&#xff0c;即使受害者的苹果设备处于离线状态&#xff0c;也可以利用该技术悄无声息地访问该设备。 Jamf Threat Labs 的研究人员 Hu Ke 和 Nir Avraham 在与 The Hacker News 分享的一份报告中…

八、Linux下,grep/wc/管道符/echo/重定向符/tail如何使用?

1、grep命令 &#xff08;1&#xff09;主要用于文件 &#xff08;2&#xff09;主要作用是“通过关键字&#xff0c;过滤文件行” &#xff08;3&#xff09;示例&#xff1a; 2、wc命令 &#xff08;1&#xff09;统计文件的行数、单词数等 &#xff08;2&#xff09;示例…

开源数据库Mysql_DBA运维实战 (总结)

开源数据库Mysql_DBA运维实战 &#xff08;总结&#xff09; SQL语句都包含哪些类型 DDL DCL DML DQL Yum 安装MySQL的配置文件 配置文件&#xff1a;/etc/my.cnf日志目录&#xff1a;/var/log/mysqld.log错误日志&#xff1a;/var/log/mysql/error.log MySQL的主从切换 查看主…

Docker部署php运行环境(php-fpm+nginx)

前言 如果使用docker去部署一套php的运行环境&#xff0c;我们需要构建出nginx、php-fpm两个容器&#xff0c;nginx通过fast_cgi协议去转发php-fpm中的端口&#xff0c;从而实现web server的搭建&#xff0c;接下来以php的laravel框架为演示例子。 部署php-fpm 第一步 编写ph…

「UG/NX」Block UI 面收集器FaceCollector

✨博客主页何曾参静谧的博客📌文章专栏「UG/NX」BlockUI集合📚全部专栏「UG/NX」NX二次开发「UG/NX」BlockUI集合「VS」Visual Studio「QT」QT5程序设计「C/C+&#

Java虚拟机(JVM):引用计数算法

一、引言 我们学习了Java内存运行时区域的各个部分&#xff0c;其中程序计数器、虚拟机栈、本地方法栈3个区域随线程而生&#xff0c;随线程而灭。栈中的栈帧随着方法的进入和退出而有条不紊地执行着出栈和入栈操作。每一个栈帧中分配多少内存基本上是在类结构确定下来就已知的…

Eclipse使用插件时提示Plugin Error loading shared libraries

项目场景: 使用Eclipse的过程中,依赖openCONFIGURATOR插件进行新建项目时,弹出如下的错误: Plugin Error loading shared libraries 以及具体的信息为: Can’t find dependent libraries 这里我使用的插件为openCONFIGURATOR插件 问题描述 如上场景,提示缺少动态链接库…

Python - 协程基本使用详解【demo】

一. 前言 协程&#xff08;Coroutine&#xff09;是一种轻量级的线程&#xff0c;也被称为用户级线程或绿色线程。它是一种用户态的上下文切换方式&#xff0c;比内核态的线程切换更为轻量级&#xff0c;能够高效的支持大量并发操作。 2. 使用协程的好处 Python 中的协程是通…

外卖福利来了,以后都10元以下了,还有机会赚钱,你信吗

怎么实现的点外卖赚钱 在外卖返现平台抢单&#xff0c;用信用卡支付订单&#xff0c;上传好评返现 外卖返现平台是看订单金额&#xff0c;信用卡满减不计入其中&#xff0c;这样就有机会实现赚钱 外卖返现平台 用了半年多返现5000多了&#xff0c;也是一笔开支了 扫最后面的…

快递打单系统使用教程

旅游旺季游客太多怎么办&#xff1f; 相信不少景区特产店都有这种“甜蜜的困扰”。一方面游客多了&#xff0c;自然销售量见长&#xff0c;另一面人流多了&#xff0c;如何服务好顾客&#xff0c;也是特产店的一大难题。 客户询价&#xff0c;太忙没能第一时间回复&#xff1…

Linux15 消息队列 线程

目录 1、进程间通信IPC&#xff1a; 2、多线程 3、向消息队列中写入数据 4、从消息队列中读取数据 5、多线程&#xff1a; 6、将多线程的数据返回给主…

js实现瀑布流布局

jquery.masonry.min.js&#xff1a;https://download.csdn.net/download/weixin_45791806/88224671 jQeasing.js&#xff1a; https://download.csdn.net/download/weixin_45791806/88224673 jquery.lazyload.js这个js可以自己百度下载 直通车&#xff1a;https://download.csd…

【JAVA】我们该如何规避代码中可能出现的错误?(一)

个人主页&#xff1a;【&#x1f60a;个人主页】 系列专栏&#xff1a;【❤️初识JAVA】 文章目录 前言三种类型的异常异常处理JAVA内置异常类Exception 类的层次 前言 异常是程序中的一些错误&#xff0c;但并不是所有的错误都是异常&#xff0c;并且错误有时候是可以避免的&…

设计模式之中介者模式(Mediator)的C++实现

1、中介者模式的提出 在软件组件开发过程中&#xff0c;如果存在多个对象&#xff0c;且这些对象之间存在的相互交互的情况不是一一对应的情况&#xff0c;这种功能组件间的对象引用关系比较复杂&#xff0c;耦合度较高。如果有一些新的需求变化&#xff0c;则不易扩展。中介者…