【小黑嵌入式系统第九课】PSoC 5LP第一个实验——LED、字符型LCD显示实验

news2024/11/15 10:44:18

上一课:
【小黑嵌入式系统第八课】初识PSoC Creator™开发——关于PSoC Creator&下载、创建项目、单片机中的hello world(点亮一个led)

文章目录

    • 1 实验目的
    • 2 实验要求
    • 3 实验设备
    • 4 实验原理
      • 1. 基于 PWM 原理的 LED 亮度控制
      • 2. 时间的计量
      • 3. 按键抖动影响的消除
    • 5 设计实现
      • (1)硬件连接:
      • (2) 软件设计
    • 6 测试与分析


1 实验目的

  • 掌握PSoC 5LP入门项目开发的基本流程;
  • 熟悉PSoC 5LP I/O系统的主要结构;
  • 熟悉PSoC 5LP GPIO的结构,掌握其输入输出控制方法;
  • 熟悉字符型LCD模块的基本显示控制方法;
  • 实现由独立按键、LED、字符型LCD构造的基本人机接口。

2 实验要求

(1)结合LED流水灯示例项目,学习并熟悉PSoC 5LP I/O系统的基本结构,特别是GPIO的结构,并掌握GPIO的输入输出控制实现方法;
(2)结合Creator软件自带的HelloWorld_Blinky示例项目,学习并熟悉HD44780型字符LCD模块的基本显示控制实现方法;
(3)设计一个PSoC 5LP项目,实现以下功能

  • a.能够正确判断按键SW2、SW3的按下和松开的状态(并通过软件延时再判的方式消除按键动作时抖动的影响);
  • b. LED3 ~ LED2同时闪烁(亮度可以调整。提示:基于PWM原理实现);
  • c. 用SW2调整LED3的亮度,每按下一次增加或减少1挡亮度。用LED4亮指示LED3当前处于最低亮度或最高亮度,其它亮度时LED4灭;
  • d. 用SW3调整LED2的亮度,每按下一次增加或减少1挡亮度。用LED1亮指示LED2当前处于最低亮度或最高亮度,其它亮度时LED1灭;
  • e. LCD的第一行显示LED3的亮度百分比值,第二行显示LED2的亮度百分比值。

(4)以上功能可以全软件实现,也可以考虑部分功能使用硬件方式实现,如按键消抖(参考应用笔记AN60024)、LED显示。
更多的显示效果:
(5)使LCD内容的显示更加友好

3 实验设备

CY8CKIT-050实验板
安装了PSoC Creator软件的PC机

4 实验原理

1. 基于 PWM 原理的 LED 亮度控制

本实验要求使用数字 I/O 口来连接控制 LED,由于数字输出口只能输出高低两种电平,并不能输出中间电压,因此不能直接控制 LED 的亮度,故采用 PWM 方式来实现亮度控制。

如果让 LED 全亮一段时间,接着灭一段时间,这个过程周而复始重复进行,若重复频率足够高(>60Hz),由于人眼的视觉暂留现象,人眼辨别不出有闪烁,看到的现象就是 LED 以一个中间亮度一直亮着。全亮占整个周期的比例越大,LED 就越亮,这个比例称为占空比(假定高电平时亮),其值范围为 0~100%。显然,占空比为 0 时 LED 为灭,100%时 LED 全亮度。

我们在需要 LED 亮时,让连接到它的数字输出口输出 PWM 波形,这样 LED 看起来就以某种亮度亮着;在需要 LED 灭时,则让数字输出口输出低电平(假定低电平时灭)。在需要 LED 闪烁时,让这两个过程交替的重复进行,重复频率设置得足够低(如 1Hz),人眼就能看到 LED 在闪烁了。

亮度受控的 LED 闪烁原理示意图:
在这里插入图片描述
亮度受控的 LED 闪烁波形图(左图 1 个闪烁周期,右图为其中一部分 PWM 波形的放大):

在这里插入图片描述

2. 时间的计量

要计量所经过的一段时间的时长,总需要有一个时间粒度较细的参考时钟(如 1ms 为周期的时钟)。

(1)如果用硬件定时器(Creator 提供了定时器组件)来实现计时,把这个参考时钟提供给硬件定时器,定时器里的计数值会随参考时钟同步递增(或递减),那么 t1、t2 时刻的计数值差值,乘以参考时钟周期,就是 t1 到 t2 时刻所经历的时长。时间计量的需求非常普遍,所有的处理器芯片内部都会包含至少一个硬件定时器。

(2)如果单纯用软件的方法来实现计时,则必然会想到用软件延时函数,Creator 提供了CyDelay()CyDelayUs()函数,这些延时函数是通过让 CPU 执行无意义的指令单纯消耗时间的方式实现的。如果 CPU 仅执行这些延时函数,期间也没有被中断打断,那么延时是准确的。

对于本实验的要求,一方面的 LED 亮(亮度受控),PWM 波形什么时候输出高,什么时候输出低,需要计时;另一方面的 LED 闪烁效果,什么时候 LED 亮,什么时候灭,也需要计时。软件如何利用延时函数实现各种计时需求?程序不能总是在做各种不同的延时,因为延时期间是不能处理其它事情的,而是应该仿照硬件定时器构造一个周期性的参考时钟。一种合理的实现方式如图 3所示,在 main()函数主循环中,串行地加入软件延时、任务 1、任务 2、……任务 m 的代码,如果所有任务的执行耗时都比延时代码的耗时少很多,则主循环一次的耗时(一个主循环周期)约等于延时代码的耗时。这样,主循环就可以作为计时的参考时钟,若程序运行经历了 n 轮主循环,则经历的时长即为:n * 主循环周期。

当然,需要提醒也容易看出的是,这个方案的计时准确性不能做到很高。即使想把各任务的执行时间考虑进来提高计时精度也是难以做到的,因为实现某任务时,经常难以做到任务执行时间等时,而是会随任务流程的不同分支而波动。如果有中断,计时会被中断处理延长并且发生波动。总之,这个方案适用于不那么精确的计时需求。

在这里插入图片描述
因此,对于 LED 亮(亮度受控)方面的计时,需要设置一个变量来数经过的主循环次数,可将其命名为tmr_pwm3(与硬件定时器里的计数值等效);对于 LED 闪烁效果方面的计时,也需要设置一个变量来数经过的主循环次数,可将其命名为 tmr_led3blink

此外,如图 1,PWM 波形高→低的转换时刻决定了占空比,程序中需要调整,因此需要设置一个变量,可将其命名为 tmout_pwm3comp。PWM 波形周期、LED 闪烁周期,一般固定不变即可,图 1 中因此分别用宏 TMOUT_PWMPRDTMOUT_LED3BLINKPRD 定义,单位为主循环周期。

3. 按键抖动影响的消除

机械按键在发生按下或松开动作的短时间内,由于接触片的接触不良,会出现反复通-断的现象,称为按键抖动。按键抖动期间的时长一般**<20ms**,然后按键才处于稳定的通或断状态。如图 4 所示的按键状态波形图。

为了消除按键抖动的影响,一种简单而有效的方法是对按键状态定时采样(采样周期需大于抖动时长,一般可取 20ms),这种方法既可以用软件实现也可以用硬件实现。如图 4 所示,波形每格为 10ms,箭头处代表采样时刻及采样值,很明显,图中的各种采样值序列都只出现了一次 1→0,对应到有一次按键按下(假设按键松开时为高电平)动作,从而消除了按键抖动的影响。

在这里插入图片描述
从以上可以得出,只要记录按键的当前采样值(sw2_cur)和上一采样值(sw2_prev),便可以判定当前的按键状态,包括持续松开(sw2_prev=1sw2_cur=1)、有按下动作发生(sw2_prev=1sw2_cur=0)、持续按下(sw2_prev=0sw2_cur=0)、有松开动作发生(sw2_prev=0sw2_cur=1)。

什么时候需要进行按键采样读取按键状态,需要计时。如果单纯用软件的方法来实现这个计时,如“一. 2.(2)”节所述,也需要设置一个变量来数经过的主循环次数,可将其命名为 tmr_debouncer,采样周期固定不变则可以用宏 TMOUT_DEBOUNCER 定义之(单位为主循环周期)。

5 设计实现

(1)硬件连接:

TopDesign:

在这里插入图片描述
在这里插入图片描述

PWM1 和 PWM2 分别控制LED2和LED3的亮度和闪烁,当按键按下,按键通过引脚 SW2 或 SW3 输出中 断,中断程序调整 PWM 输出的占空比输出到 LED3 和 LED2 的引脚,实现 LED3 和 LED2 亮度改变,同时 LCD 显示 LED 亮度相关的字符。

(1)输出端口

配置4个相同的输出端口,分别对应四个LED灯,两个提供外部物理连接,对应连接PWM输出(LED_2、LED_3)调节亮度,两个端口悬空,对应两个指示灯(LED_1、LED_4),设置初始状态为低电平,为了后面给LED从外部灌电流增大。

在这里插入图片描述

(2)输入端口

配置两个输入端口对应两个按钮(SW_2、SW_3),连接两个中断,中断源为按钮是否按下,此处要进行软件消抖,可以增加按钮动作的识别准确度,当检测到按钮按下时,产生中断,反馈到PWM中进行动作。

在这里插入图片描述

(3)PWM模块

配置两个PWM模块(PWM1、PWM2),pwm1 和 pwm2 分别控制 LED2 和 LED3 的亮度以及闪烁,因为我后面要实现LED亮度逐级从低到高,所以初始占空比设置为0,程序中以25%四级增加,增加时钟为PWM进行计数和计时。

在这里插入图片描述

(2) 软件设计

1 总体设计

在这里插入图片描述

  1. CyGlobalIntEnable;
    启用全局中断,允许中断事件触发处理函数。
    2.uint8_t led3_brightness = 0;
    uint8_t led2_brightness = 0;
    初始化LED3和LED2的亮度为0,即初始状态下LED灯是关闭的。
  2. LCD_Char_Start();
    LCD_Char_Position(0, 0);
    LCD_Char_PrintString(“LED3 Bright:”);
    LCD_Char_Position(1,0);
    LCD_Char_PrintString(“LED2 Bright:”);
    启动LCD显示,并在第一行显示"LED3 Bright:“,在第二行显示"LED2 Bright:”。
  3. PWM_1_Start();
    PWM_2_Start();
    启动PWM模块,用于控制LED的亮度。
  4. if(!SW_2_Read()) // 如果按下SW2
    检测SW2按钮是否被按下。
  5. led3_brightness+=25;
    PWM_1_WriteCompare(led3_brightness);
    增加LED3的亮度,并将新的亮度值设置为PWM的占空比,从而控制LED3的 亮度。
    7.while(!SW_2_Read());
    等待按键释放,避免按键抖动。
  6. if(led3_brightness == 100)
    {
    LED_4_Write(1);
    }
    在LED3的亮度达到100%时,点亮另一个LED(LED4)。
  7. 同样的操作和逻辑也适用于LED2和SW3。
  8. LCD_Char_Position(0, 12);
    LCD_Char_PrintNumber(led3_brightness);
    LCD_Char_PrintString(“%”);
    用于更新LCD显示,显示LED3的亮度百分比。
  9. CyDelay(100); // 延时消除按键抖动
    引入延时,以消除按键抖动。

2 详细设计

#include <project.h>
#include <stdio.h>

int main()
{
    CyGlobalIntEnable; /* Enable global interrupts. */

    uint8_t led3_brightness = 0; // 初始化LED3亮度为50%
    uint8_t led2_brightness = 0; // 初始化LED2亮度为50%
    
    LCD_Char_Start(); // 启动LCD
    LCD_Char_Position(0, 0);
    LCD_Char_PrintString("LED3 Bright:");
    LCD_Char_Position(1,0);
    LCD_Char_PrintString("LED2 Bright:");

    PWM_1_Start();
    PWM_2_Start();
    for(;;)
    {
        if(!SW_2_Read()) // 如果按下SW2
        {
            if(led3_brightness < 100) // 增加LED3亮度
            {
                led3_brightness+=25;
                PWM_1_WriteCompare(led3_brightness); // 设置PWM占空比
            }
            while(!SW_2_Read()); // 等待按键释放
            if(led3_brightness == 100)
            {
                LED_4_Write(1);
            }
        }
        
        if(!SW_3_Read()) // 如果按下SW3
        {
            if(led2_brightness < 100) // 增加LED2亮度
            {
                led2_brightness+=25;
                PWM_2_WriteCompare(led2_brightness); // 设置PWM占空比
            }
            while(!SW_3_Read()); // 等待按键释放
            if(led2_brightness == 100)
            {
                LED_1_Write(1);
            }
            
        }
        
        // 更新LCD显示
        LCD_Char_Position(0, 12);
        LCD_Char_PrintNumber(led3_brightness);
        LCD_Char_PrintString("%");
        
        LCD_Char_Position(1, 12);
        LCD_Char_PrintNumber(led2_brightness);
        LCD_Char_PrintString("%");
        
        CyDelay(100); // 延时消除按键抖动
    }
}

6 测试与分析

(1)初始状态:四个LED灯都处于关闭状态,LCD上显示LED2和LED3的亮度都为0%。

在这里插入图片描述
(2)亮度增加阶段:SW2和SW3分别控制LED3和LED2的亮度,每按一次亮度增加25%,下面两张照片可以看出亮度的不一样。

在这里插入图片描述
在这里插入图片描述
(3)亮度最大阶段:当LED2的亮度达到最大时,LED1提示灯会亮起,当LED3的亮度达到最大时,LED4提示灯会亮起。

在这里插入图片描述

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

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

相关文章

FPGA_IIC代码-正点原子 野火 小梅哥 特权同学对比写法(2)

FPGA_IIC代码-正点原子 野火 小梅哥 特权同学对比写法&#xff08;2&#xff09; 工程目的I2C 单字节写操作I2C 随机读操作EEPROM 字节读写整体框图模块功能简介I2C 驱动模块模块框图跨时钟域处理状态转移图 波形分析单字节写操作局部波形图&#xff08;一&#xff09;单字节写…

IP地址的分包与组包:网络通信的关键技术解析

在计算机网络中&#xff0c;IP地址的分包与组包是网络通信过程中关键的技术环节&#xff0c;分别涉及将数据拆分为适当大小的包以及在接收端重新组装这些包的过程。这两个过程对于确保高效、可靠的数据传输至关重要。以下将深入探讨IP地址的分包与组包的概念、原理以及在网络通…

进程管理(三)

生产者—消费者问题及初步解决方案 放了数据后,有通知消费者的义务。 空缓冲区、满缓冲区作为资源,设计为信号量 关于生产者—消费者初步解决方案的反思 秘诀:资源信号量wait在前,互斥信号量wait在后 关于生产者—消费者初步解决方案的改进

Linux常见命令手册

目录 文件命令 文件和目录命令 文件的权限命令 文件搜索命令 进程命令 查看进程命令 关闭进程命令 用户和群组命令 网络命令 firewall-cmd 网络应用命令 高级网络命令 网络测试命令 网络安全命令 网络配置命令 软件管理命令 系统信息命令 vi编辑器 关机命令…

2023年中国位置服务(LBS)产业链及市场规模分析[图]

卫星导航系统的高技术、高成本、高效益属性使其成为国家经济实力与科技实力的标志之一。卫星导航系统由空间段、地面段和用户段三个部分组成&#xff0c;已广泛用于交通运输、农林牧渔、航空航海等领域&#xff0c;服务载体包括手机、汽车、无人机、导弹等&#xff0c;对人们生…

Dubbo快速实践

文章目录 架构相关概念集群和分布式架构演进 Dubbo概述Dubbo快速入门前置准备配置服务接口配置Provider配置Consumer Dubbo基本使用总结 本文参考https://www.bilibili.com/video/BV1VE411q7dX 架构相关概念 集群和分布式 集群&#xff1a;很多“人”一起 &#xff0c;干一样…

数据结构与算法-生成树与最小生成树

生成树与最小生成树 &#x1f388;1.生成树与最小生成树&#x1f52d;1.1生成树与最小生成树的概念&#x1f52d;1.2最小生成树的生成准则&#x1f52d;1.3两种最小生成树算法&#x1f3c6;1.3.1Kruskal算法&#x1f3c6;1.3.2Prim算法 &#x1f388;2.有向无环图及其应用&…

unity 打包exe设置分辨率

unity在2019以上版本不支持在打开的时候弹出分辨率设置的窗口&#xff0c;但是因为有些需求需要可以设置分辨率进行操作&#xff0c;我在查了好多办法后找到了解决方案&#xff0c;废话不多说开始干货。 1.先去百度云上下载这个文件 链接&#xff1a;https://pan.baidu.com/s/1…

MATLAB常用绘图函数的使用

文章目录 绘制一图一线绘制一图多线用法一&#xff1a;plot用法二&#xff1a;hold on 绘制一图多图其他形式的坐标图分段函数绘制方法一&#xff1a;分段写函数的定义域值域方法二&#xff1a;判断定义域方法三&#xff1a;if else 判断 横纵坐标范围设置标题、轴标签、图例、…

如何去云服务器申请环境跑深度学习模型

我的研究方向是显著性目标检测&#xff0c;虽然对比目标检测来说&#xff0c;数据集和模型的尺寸已经降低很多了&#xff0c;然后我们实验室也有一台公用服务器&#xff0c;但是那台服务器好多人使用&#xff0c;每个人能分配到的容量就很小&#xff0c;而且有时候会宕机&#…

测试和验证有什么区别,怎么划分测试集和验证集

测试集和验证集是在机器学习中用于评估模型性能的两个不同的数据集。它们有不同的目的和使用方式。 验证集&#xff08;Validation Set&#xff09;&#xff1a; 目的&#xff1a; 用于调整模型的超参数&#xff08;例如&#xff0c;学习率、正则化参数等&#xff09;和进行模型…

软件工程第十一周

面向对象 面向对象编程&#xff08;Object-Oriented Programming, OOP&#xff09;不仅仅是一种程序设计方法&#xff0c;它更是一种深刻的软件工程开发思想。这种思想的核心在于通过抽象和封装来模拟现实世界中的对象和概念&#xff0c;以便更好地管理和解决复杂的软件工程问…

005 OpenCV直方图

目录 一、环境 二、直方图原理概述 三、代码 一、环境 本文使用环境为&#xff1a; Windows10Python 3.9.17opencv-python 4.8.0.74 二、直方图原理概述 OpenCV是一个广泛使用的开源计算机视觉库&#xff0c;它提供了许多用于图像处理和分析的函数和算法。其中&#xff…

设置 wsl 桥接模式

一、环境要求 Win10/Win11 专业版&#xff0c;并已安装 Hyper-V 二、具体步骤 打开 Hyper-V 管理器 创建虚拟交换机 WSL Bridge 修改wsl配置文件 .wslconfig .wslconfig 文件所在路径如下&#xff1a; C:\Users\<UserName>\.wslconfig若 .wslconfig 文件不存在&am…

Sam Altman 或回归 OpenAI;格力 1.3 万研发人员没有海归派 外国人丨 RTE 开发者日报 Vol.86

开发者朋友们大家好&#xff1a; 这里是 「RTE 开发者日报」 &#xff0c;每天和大家一起看新闻、聊八卦。我们的社区编辑团队会整理分享 RTE &#xff08;Real Time Engagement&#xff09; 领域内「有话题的 新闻 」、「有态度的 观点 」、「有意思的 数据 」、「有思考的 文…

《Python数据科学项目实战》:开启数据科学之旅的实战指南!

《Python数据科学项目实战》是一本内容丰富且组织结构严谨的书籍&#xff0c;它旨在帮助读者通过实际案例研究掌握使用Python进行数据科学工作的必要知识。本书的案例研究涵盖了在线广告分析、使用新闻数据跟踪疾病暴发等多个现实世界的场景&#xff0c;使读者能够将所学知识应…

NOSQL----redis的安装和基础命令

redis是什么 1.redis-------非关系型数据库 redis是非关系数据库的一种&#xff0c;也称为缓存型数据库。 非关系型数据库和关系型数据库 1.关系型数据库 关系型数据库是一个结构化的数据库&#xff0c;记录方式是行和列&#xff08;列&#xff1a;声明对象&#xff0c;行&am…

【unity实战】unity3D中的PRG库存系统和换装系统(附项目源码)

文章目录 先来看看最终效果前言素材简单绘制库存UI前往mixamo获取人物模型动画获取一些自己喜欢的装备物品模型库存系统换装系统装备偏移问题添加消耗品最终效果源码完结 先来看看最终效果 前言 之前2d的换装和库存系统我们都做过不少了&#xff0c;这次就来学习一个3d版本的&…

有哪些相见恨晚的stm32学习的方法?

有哪些相见恨晚的stm32学习的方法&#xff1f; 单片机用处这么广&#xff0c;尤其是STM32生态这么火&#xff01;如何快速上手学习呢&#xff1f; 你要考虑的是&#xff0c;要用STM32实现什么&#xff1f;为什么使用STM32而不是用8051&#xff1f;是因为51的频率太低&#xff…

五分钟搭建开源ERP:Odoo,并实现公网远程访问

文章目录 前言1. 下载安装Odoo&#xff1a;2. 实现公网访问Odoo本地系统&#xff1a;3. 固定域名访问Odoo本地系统 前言 Odoo是全球流行的开源企业管理套件&#xff0c;是一个一站式全功能ERP及电商平台。 开源性质&#xff1a;Odoo是一个开源的ERP软件&#xff0c;这意味着企…