当前位置: 首页 > news >正文

嵌入式进阶——LED呼吸灯(PWM)

🎬 秋野酱:《个人主页》
🔥 个人专栏:《Java专栏》《Python专栏》

⛺️心若有所向往,何惧道阻且长

文章目录

    • PWM基础概念
    • STC8H芯片
    • PWMA应用
    • PWM配置详解
    • 占空比

PWM基础概念

PWM全称是脉宽调制(Pulse Width Modulation),是一种通过改变信号的脉冲宽度来控制电路输出的技术。PWM技术在工业自动化、电机控制、LED调光等领域广泛应用。
PWM是一种将数字信号转换为模拟信号的技术,它通过改变信号的占空比来控制输出的电平。在STC8H中,PWM输出的频率和占空比可以由程序控制,因此可以用来控制各种电机、灯光和其他设备的亮度、速度等参数。

STC8H芯片

STC8H 系列的单片机内部集成了8 通道 16 位高级PWM 定时器,分成两周期可不同的 PWM,分别命名为 PWMA 和PWMB ,可分别单独设置。
第一组 PWMA 可配置成4 组互补/对称/死区控制的PWM 或捕捉外部信号。
第二组 PWMB 可配置成4 路PWM 输出或捕捉外部信号。
两组 PWM 的时钟频率可分别独立设置。
在这里插入图片描述
PWM与引脚对应关系如下图:
在这里插入图片描述

PWMA应用

控制引脚P2.7实现LED灯1的呼吸效果。

  1. 拷贝所需库文件(其他必备库请自行准备)
    a. STC8H_PWM.cSTC8H_PWM.h
    b. NVIC.cNVIC.h
    c. Switch.h
  2. 导入头文件,初始化宏及全局变量
#include "Config.h"
#include "GPIO.h"
#include "Delay.h"
#include "NVIC.h"
#include "Switch.h"
#include "STC8H_PWM.h"#define LED_SW	P45#define LED1		P27
#define LED2		P26
#define LED3		P15#define FREQ		1000#define PERIOD 	((MAIN_Fosc / FREQ) - 1)	// 周期PWMx_Duty dutyA;

配置GPIO

void GPIO_config(void) {GPIO_InitTypeDef	GPIO_InitStructure;		//结构定义// LED_SWGPIO_InitStructure.Pin  = GPIO_Pin_5;		//指定要初始化的IO,GPIO_InitStructure.Mode = GPIO_OUT_PP;	//指定IO的输入或输出方式,GPIO_PullUp,GPIO_HighZ,GPIO_OUT_OD,GPIO_OUT_PPGPIO_Inilize(GPIO_P4, &GPIO_InitStructure);//初始化// P2GPIO_InitStructure.Pin  = GPIO_Pin_6 | GPIO_Pin_7;		//指定要初始化的IO,GPIO_InitStructure.Mode = GPIO_PullUp;	//指定IO的输入或输出方式,GPIO_PullUp,GPIO_HighZ,GPIO_OUT_OD,GPIO_OUT_PPGPIO_Inilize(GPIO_P2, &GPIO_InitStructure);//初始化
}

配置PWM

void	PWM_config(void)
{PWMx_InitDefine		PWMx_InitStructure;// 配置PWM4PWMx_InitStructure.PWM_Mode    =	CCMRn_PWM_MODE2;	//模式,		CCMRn_FREEZE,CCMRn_MATCH_VALID,CCMRn_MATCH_INVALID,CCMRn_ROLLOVER,CCMRn_FORCE_INVALID,CCMRn_FORCE_VALID,CCMRn_PWM_MODE1,CCMRn_PWM_MODE2PWMx_InitStructure.PWM_Duty    =  0;								//PWM占空比时间, 0~PeriodPWMx_InitStructure.PWM_EnoSelect  = ENO4P | ENO4N;	//输出通道选择,	ENO1P,ENO1N,ENO2P,ENO2N,ENO3P,ENO3N,ENO4P,ENO4N / ENO5P,ENO6P,ENO7P,ENO8PPWM_Configuration(PWM4, &PWMx_InitStructure);// 配置PWMAPWMx_InitStructure.PWM_Period   = PERIOD;					//周期时间,   0~65535PWMx_InitStructure.PWM_DeadTime = 0;					//死区发生器设置, 0~255PWMx_InitStructure.PWM_MainOutEnable= ENABLE;			//主输出使能, ENABLE,DISABLEPWMx_InitStructure.PWM_CEN_Enable   = ENABLE;			//使能计数器, ENABLE,DISABLEPWM_Configuration(PWMA, &PWMx_InitStructure);			//初始化PWM通用寄存器,  PWMA,PWMB// 切换PWM4选择PWM4_SW_P26_P27PWM4_SW(PWM4_SW_P26_P27);			//PWM4_SW_P16_P17,PWM4_SW_P26_P27,PWM4_SW_P66_P67,PWM4_SW_P34_P33// 初始化PWMA的中断NVIC_PWM_Init(PWMA,DISABLE,Priority_0);
}

编写Main函数


void main() {char direction = 1;u8 duty_percent = 0;// 0 -> 100EAXSFR();		/* 扩展寄存器访问使能, 必写! */GPIO_config();PWM_config();EA = 1;// 总开关LED_SW = 0;LED1 = 0; // P2.7 PWM4LED2 = 0;LED3 = 0;// 循环之前,设置一次pwm(可选)dutyA.PWM4_Duty = PERIOD * duty_percent / 100;UpdatePwm(PWM4, &dutyA);// 0 -> 100while(1) {duty_percent += direction;// 让duty_percent一直在0-100来回往返if(duty_percent >= 100) {duty_percent = 100;direction = -1;} else if(duty_percent <= 0) {duty_percent = 0;direction = 1;}// 修改PWM4的dutydutyA.PWM4_Duty = PERIOD * duty_percent / 100;UpdatePwm(PWM4, &dutyA);delay_ms(10);}
}

PWM配置详解

周期
系统主频:1秒钟计数多少次。
代码中的PWM周期(PWM Period),指的是按N等份切分1秒钟,每个等份的计数值。
在这里插入图片描述
例如上图,我们按照8等份切分1秒钟的总计数值MAIN_Fosc(主频),每个PWM周期的计数值为:
PWM_Period = MAIN_Fosc / 8 = 24M / 8 = 3M = 3 000 000 单位为次。
即如果将这个3M作为Period参数,可以得到PWM方波每个周期的时长为:
1 / 8 = 0.125s

代码中的配置:

#define PERIOD 	(MAIN_Fosc / FREQ)	// 周期
PWMx_InitStructure.PWM_Period   		= PERIOD - 1;

配置的是周期中的计数值。
我们的理解策略:通常我们不关心计数值,关心的是1秒钟执行多少次(即频率Hz),也就是一秒钟多少个周期。
因此在代码MAIN_Fosc / 1000中的1000表示的是1秒钟多少个周期(即频率Hz)。
MAIN_Fosc / 1000表示的是每个周期的计数值。那为什么要-1呢?因为计数器是从0开始计数的。

占空比

在一个PWM的周期计数中,高电平的计数时长百分比。
在这里插入图片描述
模式
● 冻结: CCMRn_FREEZE
● 匹配时设置通道 n 的输出为有效电平: CCMRn_MATCH_VALID
● 匹配时设置通道 n 的输出为无效电平: CCMRn_MATCH_INVALID
● 翻转: CCMRn_ROLLOVER
● 强制为无效电平: CCMRn_FORCE_INVALID
● 强制为有效电平: CCMRn_FORCE_VALID
● PWM 模式 1: CCMRn_PWM_MODE1
● PWM 模式 2: CCMRn_PWM_MODE2
常用的为PWM 模式 1PWM 模式 2
PWM 模式 1和PWM 模式 2是反向的,一个占空比越大越亮,一个是越小越亮。
使能PWM

PWMx_InitStructure.PWM_MainOutEnable= ENABLE;			//主输出使能, ENABLE,DISABLE
PWMx_InitStructure.PWM_CEN_Enable   = ENABLE;			//使能计数器, ENABLE,DISABLE
PWM_Configuration(PWMA, &PWMx_InitStructure);			//初始化PWM通用寄存器,  PWMA,PWMB

引脚配置

PWM4_SW(PWM4_SW_P26_P27);

使能配置成功后,pwm才能工作。
如果运行中pwm想停止掉,也可以通过配置使能来停止。

EAXSFR扩展寄存器
由于PWM的配置相关特殊功能寄存器位于扩展RAM区域,访问这些寄存器,需先将P_SW2的BIT7设置为1,才可正常读写。

EAXSFR();		/* 扩展寄存器访问使能 */

相关文章:

嵌入式进阶——LED呼吸灯(PWM)

&#x1f3ac; 秋野酱&#xff1a;《个人主页》 &#x1f525; 个人专栏:《Java专栏》《Python专栏》 ⛺️心若有所向往,何惧道阻且长 文章目录 PWM基础概念STC8H芯片PWMA应用PWM配置详解占空比 PWM基础概念 PWM全称是脉宽调制&#xff08;Pulse Width Modulation&#xff09…...

一文读懂:http免费升级https

背景&#xff1a; 随着现在全民网络安全意识的日益提升&#xff0c;各个网站需要实现的https数量也随之提升&#xff0c;那么如何将原本网站的http访问方式升级为https呢&#xff1f; 该内容为如何免费将网站的http访问升级为https访问 论https的加密逻辑&#xff1a; 步骤 …...

算法刷题笔记 高精度除法(C++实现)

文章目录 题目描述求解思路实现代码 题目描述 给定两个非负整数&#xff08;不含前导0&#xff09;A&#xff0c;B&#xff0c;请你计算 A/B 的商和余数。 输入格式 共两行&#xff0c;第一行包含整数A&#xff0c;第二行包含整数B。 输出格式 共两行&#xff0c;第一行输…...

按月爬取天气数据可视化展示

从天气网分析,可以查询每个月的天气情况,这里按照url规则,传入年月,获取数据,最后进行可视化展示,最终效果: 下面是获取过程: 第一步: import requestsdef get_weather(month):url = f"https://lishi.tianqi.com/nanning/{month}.html"response = reques…...

VMware安装Ubuntu系统(超详细)

一.Ubuntu官网下载镜像 Ubuntu官网&#xff1a;Enterprise Open Source and Linux | Ubuntu 二.安装Ubuntu系统 选择文件->创建虚拟机新建虚拟机&#xff08;ControlN&#xff09;&#xff0c;这里直接选择典型即可 选择稍后安装系统 选择linux Ubuntu 64位 填写虚拟机名称…...

数据清洗操作及众所周知【数据分析】

各位大佬好 &#xff0c;这里是阿川的博客 &#xff0c; 祝您变得更强 个人主页&#xff1a;在线OJ的阿川 大佬的支持和鼓励&#xff0c;将是我成长路上最大的动力 阿川水平有限&#xff0c;如有错误&#xff0c;欢迎大佬指正 前面的博客 数据分析—技术栈和开发环境搭建 …...

炫酷gdb

在VS里面调试很方便对吧&#xff1f;&#xff08;F5直接调试&#xff0c;F10逐过程调试--不进函数&#xff0c;F11逐语句调试--进函数&#xff0c;F9创建断点&#xff09;&#xff0c;那在Linux中怎么调试呢&#xff1f; 我们需要用到一个工具&#xff1a;gdb 我们知道VS中程…...

windows 7 10 11快捷键到启动页面

1.快速打开用户启动文件夹 shell:startup 方式2&#xff1a;快速打开系统启动文件夹 shell:Common Startup shell:Common Startup...

[处理器芯片]-6 超标量CPU实现之浮点运算

1 浮点运算单元FPU 超标量CPU中的浮点运算单元是专门处理浮点数运算的关键组件。浮点运算单元的设计涉及多个复杂的子模块和技术&#xff0c;以保证高效、准确地执行浮点数的加减法、乘法、除法、平方根等操作。 1&#xff09;浮点数术语 浮点数通常采用IEEE 754标准表示&…...

又有人叫嚣:AI取代前端,来给你几张图,看能不能憋死AI。

总有自媒体人&#xff0c;为了些许流量&#xff0c;在大放厥词&#xff0c;说截个图给AI&#xff0c;AI就能输出前端代码&#xff0c;这是啥都敢说&#xff0c;吹牛不上税。 我来给你几张贝格前端工场日常接的大数据项目相关的图&#xff0c;你让AI生成代码&#xff0c;取代前…...

ISCC2024个人挑战赛WP-WEB

&#xff08;非官方解&#xff0c;以下内容均互联网收集的信息和个人思路&#xff0c;仅供学习参考&#xff09; 还没想好名字的塔防游戏 GET /world.js HTTP/1.1 Host: 101.200.138.180:17345 Accept: text/html,application/xhtmlxml,application/xml;q0.9,image/avif,i…...

Android 使用 adb 列出设备上所有危险权限

步骤1&#xff1a;确定 Android SDK 位置 打开 Android Studio 的设置&#xff0c;并来到 Languages & Frameworks › Android SDK 处&#xff1a; 这里可以看到 Android SDK 目录的位置&#xff1a; 例如&#xff1a;/Users/admin/Library/Android/sdk。 复制这个路径&am…...

Spring AOP源码分析

#### AOP&#xff08;面向切面编程&#xff09;作用及其优势 作用&#xff1a;在程序运行期间&#xff0c;在不修改源码的情况下对方法进行功能增强&#xff08;通知&#xff09; 优势&#xff1a;减少重复代码&#xff0c;提高代码复用性&#xff0c;提高代码可维护性&#xf…...

[LLM]从GPT-4o原理到下一代人机交互技术

一 定义 GPT-4o作为OpenAI推出的一款多模态大型语言模型&#xff0c;代表了这一交互技术的重要发展方向。 GPT-4o是OpenAI推出的最新旗舰级人工智能模型&#xff0c;它是GPT系列的一个重要升级&#xff0c;其中的"o"代表"Omni"&#xff0c;中文意思是“全…...

【Spring】AOP——通知(Advice)

1、通知&#xff08;Advice&#xff09; 1.1简介 在AOP中&#xff0c;通知&#xff08;Advice&#xff09;是切面&#xff08;Aspect&#xff09;中的一部分&#xff0c;用于定义在连接点&#xff08;Joinpoint&#xff09;处应该执行的操作。通知类型可以在AOP框架中配置和使…...

python中的一些基础概念

在python中整型数据可以和浮点型数据相加&#xff0c;在python中字符串数据可以进行相加&#xff0c; 在python中整型数据可以和布尔类型进行算术运算。此时True当做1&#xff0c;False当做0但是这样的操作是没有意义的&#xff0c; python中只有字符串类型没有字符类型&…...

8.Redis之hash类型

1.hash类型的基本介绍 哈希表[之前学过的所有数据结构中,最最重要的] 1.日常开发中,出场频率非常高. 2.面试中,非常重要的考点, Redis 自身已经是键值对结构了Redis 自身的键值对就是通过 哈希 的方式来组织的 把 key 这一层组织完成之后, 到了 value 这一层~~ value 的其中…...

Edge浏览器

微软 Edge 是由微软开发的网络浏览器&#xff0c;它是 Windows 10 操作系统的默认浏览器&#xff0c;取代了之前的 Internet Explorer。Edge 浏览器在设计上注重性能、安全性和易用性&#xff0c;同时也提供了许多实用的功能&#xff0c;如内置笔记、阅读视图、集成的语音助手等…...

springboot项目中图片上传之后需要重启工程才能看到图片?

需求背景 最近在做一个用户自定义上传头像的小需求&#xff0c;用户上传头像然后需要立马回显。 需求是很常见的、正当的需求。如果不使用到对象存储这类服务&#xff0c;我们把用户头像的图片文件仅存在本地就可以了。我们在开发的过程中为了工程管理方便通常下意识会将图片…...

打卡信奥刷题(20)用Scratch图形化工具信奥B3756 [信息与未来 2021] 幸运数字

本题的基础是进制转换&#xff0c;关于2进制转换可以参考打卡信奥刷题&#xff08;19&#xff09;用Scratch图形化工具信奥B3972 [语言月赛 202405] 二进制 题解 知道了2进制&#xff0c;来实现5进制、7进制、9进制是一样的。 [信息与未来 2021] 幸运数字 题目描述 如果⼀个…...

第19节 Node.js Express 框架

Express 是一个为Node.js设计的web开发框架&#xff0c;它基于nodejs平台。 Express 简介 Express是一个简洁而灵活的node.js Web应用框架, 提供了一系列强大特性帮助你创建各种Web应用&#xff0c;和丰富的HTTP工具。 使用Express可以快速地搭建一个完整功能的网站。 Expre…...

【Python】 -- 趣味代码 - 小恐龙游戏

文章目录 文章目录 00 小恐龙游戏程序设计框架代码结构和功能游戏流程总结01 小恐龙游戏程序设计02 百度网盘地址00 小恐龙游戏程序设计框架 这段代码是一个基于 Pygame 的简易跑酷游戏的完整实现,玩家控制一个角色(龙)躲避障碍物(仙人掌和乌鸦)。以下是代码的详细介绍:…...

循环冗余码校验CRC码 算法步骤+详细实例计算

通信过程&#xff1a;&#xff08;白话解释&#xff09; 我们将原始待发送的消息称为 M M M&#xff0c;依据发送接收消息双方约定的生成多项式 G ( x ) G(x) G(x)&#xff08;意思就是 G &#xff08; x ) G&#xff08;x) G&#xff08;x) 是已知的&#xff09;&#xff0…...

Docker 运行 Kafka 带 SASL 认证教程

Docker 运行 Kafka 带 SASL 认证教程 Docker 运行 Kafka 带 SASL 认证教程一、说明二、环境准备三、编写 Docker Compose 和 jaas文件docker-compose.yml代码说明&#xff1a;server_jaas.conf 四、启动服务五、验证服务六、连接kafka服务七、总结 Docker 运行 Kafka 带 SASL 认…...

Leetcode 3577. Count the Number of Computer Unlocking Permutations

Leetcode 3577. Count the Number of Computer Unlocking Permutations 1. 解题思路2. 代码实现 题目链接&#xff1a;3577. Count the Number of Computer Unlocking Permutations 1. 解题思路 这一题其实就是一个脑筋急转弯&#xff0c;要想要能够将所有的电脑解锁&#x…...

电脑插入多块移动硬盘后经常出现卡顿和蓝屏

当电脑在插入多块移动硬盘后频繁出现卡顿和蓝屏问题时&#xff0c;可能涉及硬件资源冲突、驱动兼容性、供电不足或系统设置等多方面原因。以下是逐步排查和解决方案&#xff1a; 1. 检查电源供电问题 问题原因&#xff1a;多块移动硬盘同时运行可能导致USB接口供电不足&#x…...

unix/linux,sudo,其发展历程详细时间线、由来、历史背景

sudo 的诞生和演化,本身就是一部 Unix/Linux 系统管理哲学变迁的微缩史。来,让我们拨开时间的迷雾,一同探寻 sudo 那波澜壮阔(也颇为实用主义)的发展历程。 历史背景:su的时代与困境 ( 20 世纪 70 年代 - 80 年代初) 在 sudo 出现之前,Unix 系统管理员和需要特权操作的…...

WEB3全栈开发——面试专业技能点P2智能合约开发(Solidity)

一、Solidity合约开发 下面是 Solidity 合约开发 的概念、代码示例及讲解&#xff0c;适合用作学习或写简历项目背景说明。 &#x1f9e0; 一、概念简介&#xff1a;Solidity 合约开发 Solidity 是一种专门为 以太坊&#xff08;Ethereum&#xff09;平台编写智能合约的高级编…...

(转)什么是DockerCompose?它有什么作用?

一、什么是DockerCompose? DockerCompose可以基于Compose文件帮我们快速的部署分布式应用&#xff0c;而无需手动一个个创建和运行容器。 Compose文件是一个文本文件&#xff0c;通过指令定义集群中的每个容器如何运行。 DockerCompose就是把DockerFile转换成指令去运行。 …...

OpenLayers 分屏对比(地图联动)

注&#xff1a;当前使用的是 ol 5.3.0 版本&#xff0c;天地图使用的key请到天地图官网申请&#xff0c;并替换为自己的key 地图分屏对比在WebGIS开发中是很常见的功能&#xff0c;和卷帘图层不一样的是&#xff0c;分屏对比是在各个地图中添加相同或者不同的图层进行对比查看。…...