STC8增强型单片机进阶开发--LED呼吸灯(PWM)

知不足而奋进 望远山而前行

文章目录

  • 目录

    文章目录

    前言

    目标

    内容

    PWM基础概念

    STC8H芯片

    PWMA应用

    PWM配置详解

    周期

    占空比

    模式

    使能PWM

    引脚配置

    EAXSFR扩展寄存器

    总结



前言

学习PWM(脉宽调制)是探索数字信号转模拟信号的重要一步,尤其在控制电路输出方面具有广泛的应用。本次学习将聚焦于了解PWM的基础概念、掌握在STC8H芯片上配置PWMA的方法以及应用实践。通过深入学习PWM技术,您将能够控制各种设备的亮度、速度等参数,从而在工程和电子领域中做出更多创新。


目标

  1. 了解PWM基础概念和工作原理
  2. 学习如何在STC8H上配置PWMA
  3. 掌握PWMA的各个配置
  4. 学习如何使用PWMA控制LED亮度
  5. 掌握调试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与引脚对应关系如下图:

PWM

PWM通道

对应引脚

PWMxP

PWMxN

PWMA

PWM1P & PWM1N

P1.0

P1.1

P2.0

P2.1

PWM2P & PWM2N

P5.4

P1.3

P2.2

P2.3

PWM3P & PWM3N

P1.4

P1.5

P2.4

P2.5

PWM4P & PWM4N

P1.6

P1.7

P2.6

P2.7

P3.4

P3.3

PWMB

PWM5

P0.0

P1.7

P2.0

PWM6

P0.1

P2.1

P5.4

PWM7

P0.2

P2.2

P3.3

PWM8

P0.3

P2.3

P3.4

PWMA应用

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

  1. 拷贝所需库文件(其他必备库请自行准备)
    1. STC8H_PWM.cSTC8H_PWM.h
    2. NVIC.cNVIC.h
    3. Switch.h
  1. 导入头文件,初始化宏及全局变量
#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;
  1. 配置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);//初始化
}
  1. 配置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);
}
  1. 编写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();		/* 扩展寄存器访问使能 */

详细可参见STC8手册:

  • 3.1.2 《外设端口切换控制寄存器 2(P_SW2)》
  • 9.2.8 《扩展 SFR 使能寄存器 EAXFR 的使用说明》

总结

通过本次学习,您已经了解了PWM的基本概念和工作原理,掌握了在STC8H上配置PWMA的步骤以及PWM的各种配置参数。此外,您还学会了如何利用PWM控制LED的亮度,并掌握了调试PWM的方法

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

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

相关文章

ad18学习笔记21:焊盘设置Paste Mask Expansion(锡膏层延伸)

在pcb上放置焊盘的时候&#xff0c;可以对焊盘进行设置&#xff0c;可以用默认的规则&#xff0c;可以用自定义的规则&#xff0c;网上很少看到自定义的规则怎么用。 参考了官方的说明文档&#xff0c;我只是稍微补充了一下 paste mask与solder mask有哪些区别_paste mask与s…

终于更新了!时隔一年niushop多商户b2b2c的新补丁v5.0.2终于发布了,一起看看有啥新变化

注意这是最新版的V5.02_多商户V5.0.2版本更新说明 瞧瞧更新了什么内容&#xff0c; 优化功能 优化手机号、身份证等常用验证规则&#xff0c;全局化处理优化商品列表接口查询速度 修复功能修复系统内部分图片上传功能调用接口跨端口问题修复总后台和商家后台订单管理搜索标签在…

一文彻底讲透 PyTorch

节前&#xff0c;我们组织了一场算法岗技术&面试讨论会&#xff0c;邀请了一些互联网大厂朋友、今年参加社招和校招面试的同学。 针对大模型技术趋势、大模型落地项目经验分享、新手如何入门算法岗、该如何准备面试攻略、面试常考点等热门话题进行了深入的讨论。 汇总合集…

JQC-3FF-S-Z 继电器模块使用(arduino)

前言 继电器模块可以控制电流的接通和非接通状态&#xff0c;和开关一样。实际上是用小电流去控制大电流运作的一种“自动开关” 本文只是简单使用继电器模块做一个 led 点亮和熄灭的案例&#xff0c;结合案例可以和 nodemcu 等板子结合做出远程控制开关。 材料准备 杜邦线…

无限可能LangChain——构建一个简单的LLM应用程序

在本快速入门中&#xff0c;我们将向您展示如何构建一个简单的LLM应用程序。该应用程序将文本从英语翻译成另一种语言。这是一个相对简单的LLM应用程序——它只是一个LLM调用加上一些提示。尽管如此&#xff0c;这仍然是开始使用LangChain的好方法——只需一些提示和一个LLM调用…

小波相干性显著性检验(MATLAB R2018A)

交叉小波常被用于检测不同信号之间的相关性&#xff0c;其在时频域建立了不同信号之间的联系。对于两个时域信号&#xff0c;其交叉小波变换和交叉小波尺度谱如下&#xff1a; 以轴承振动信号为例&#xff0c;利用正常轴承与故障轴承的振动信号、故障轴承和故障轴承的振动信号分…

【JavaEE进阶】——Mybatis操作数据库(使用注解和XML方式)

目录 &#x1f6a9;三层架构 &#x1f388;JDBC操作回顾 &#x1f6a9;什么是MyBatis &#x1f6a9;MyBatis⼊⻔ &#x1f388;准备工作 &#x1f4dd;创建⼯程 &#x1f4dd;数据准备 &#x1f388;配置数据库连接字符串 &#x1f388;写持久层代码 &#x1f388;单…

插入排序(直接插入排序、折半插入排序、希尔排序)的性能分析

目录 前言 插入排序 直接插入排序性能分析 折半插入排序性能分析 希尔排序性能分析 前言 本篇文章主要是总结插入排序的性能分析&#xff0c;具体的概念、算法、排序过程&#xff0c;我前面的文章有写&#xff0c;在这里就不再过多赘述了。 插入排序 插入排序是一种简单直…

如何从Windows的硬盘中恢复丢失或删除的照片

你有没有不小心删除了一张你再也找不回来的重要照片&#xff1f;如果是您的公司或家庭照片、婚礼或童年回忆&#xff0c;或亲人的照片怎么办&#xff1f; 根据我们的经验&#xff0c;用户通常会在清理计算机的存储/速度时遇到这样的事故&#xff0c;并最终删除包含重要图片的文…

PVE虚拟机 安装 OpenWrt

1、创建虚拟机 2、操作系统 3、磁盘&#xff0c;先删除 4、网络 5、其它默认 6、在 local 分区上传镜像 7、登录PVE虚拟机 # 切换到镜像目录 cd /var/lib/vz/template/iso/# 把镜像导入磁盘 qm importdisk 102 openwrt-buddha-version-v7_2022_-x86-64-generic-squashfs-uefi…

22 、系统安全

新的服务器到手&#xff0c;部署服务器初始化。 1、配置ip地址 网关dns解析&#xff08;static&#xff09;内网和外网。 2、安装源&#xff0c;外网&#xff08;在线即可&#xff09;&#xff0c;内网&#xff08;只能用源码包编译安装&#xff09;。 3、磁盘分区&#xff…

Nvidia Jetson/Orin +FPGA+AI大算力边缘计算盒子:轨道交通监控系统

株洲中车时代电气股份有限公司&#xff08;下称中车时代电气&#xff09;是中国中车旗下股份制企业&#xff0c;其前身及母公司——中车株洲电力机车研究所有限公司创立于1959年。中车时代电气扎根株洲&#xff0c;走好两条钢轨&#xff0c;走出两条钢轨。中车时代电气秉承“双…

Sentinel与Nacos强强联合,构建微服务稳定性基石的重要实践

一、简介 Sentinel 作为一款强大的流量控制组件&#xff0c;能够对系统入口流量进行精准控制&#xff0c;有效防止服务因突发流量冲击引起服务雪崩&#xff0c;进而导致服务瘫痪&#xff0c;确保服务的稳定性和可靠性。 Nacos 作为配置管理和服务发现平台&#xff0c;实现了配置…

高斯混合模型聚类算法的实现

目录 1. 作者介绍2. 聚类简介2.1 K-Means聚类简介2.2 高斯混合聚类简介 3. 实验过程3.1 数据集介绍3.2 代码思路3.3 算法评价3.4 代码实现3.5 实验结果 4. 参考链接 1. 作者介绍 赵子仪&#xff0c;女&#xff0c;西安工程大学电子信息学院&#xff0c;2023级研究生 研究方向&…

深度网络学习笔记(一)——self-attention机制介绍和计算步骤

self-attention机制介绍及其计算步骤 前言一、介绍和意义二、 计算细节2.1 计算Attention Score2.2 计算value2.3 计算关联结果b2.4 统一计算 三、总结 前言 Transformer是一种非常常见且强大的深度学习网络架构&#xff0c;尤其擅长处理输出为可变长度向量序列的任务&#xf…

网络原理———TCP/IP—网络层IP协议

T04BF &#x1f44b;专栏: 算法|JAVA|MySQL|C语言 &#x1faf5; 今天你敲代码了吗 目录 网络层IP协议4位版本号4位首部长度8位服务类型16位总长度16位标识 3位标志 13位片偏移8位生存时间8位协议16位首部校验和32位源IP地址 和 32位目的IP地址方案1:动态分配IP地址方案2:NAT机…

小白跟做江科大32单片机之旋转编码器计次

原理部分按照下面这个链接理解即可y小白跟做江科大32单片机之对射式红外传感器计次-CSDN博客https://blog.csdn.net/weixin_58051657/article/details/139350487https://blog.csdn.net/weixin_58051657/article/details/139350487 实验过程 1.按照江科大老师给的电路图进行连接…

C语言(内存函数)

Hi~&#xff01;这里是奋斗的小羊&#xff0c;很荣幸各位能阅读我的文章&#xff0c;诚请评论指点&#xff0c;欢迎欢迎~~ &#x1f4a5;个人主页&#xff1a;小羊在奋斗 &#x1f4a5;所属专栏&#xff1a;C语言 本系列文章为个人学习笔记&#xff0c;在这里撰写成文一…

springboot+vue+mybatis博物馆售票系统+PPT+论文+讲解+售后

如今社会上各行各业&#xff0c;都喜欢用自己行业的专属软件工作&#xff0c;互联网发展到这个时候&#xff0c;人们已经发现离不开了互联网。新技术的产生&#xff0c;往往能解决一些老技术的弊端问题。因为传统博物馆售票系统信息管理难度大&#xff0c;容错率低&#xff0c;…

sqoop操作

介绍 sqoop是隶属于Apache旗下的, 最早是属于cloudera公司的,是一个用户进行数据的导入导出的工具, 主要是将关系型的数据库(MySQL, oracle...)导入到hadoop生态圈(HDFS,HIVE,Hbase...) , 以及将hadoop生态圈数据导出到关系型数据库中 操作 将数据从mysql中导入到HDFS中 1.全量…