嵌入式进阶——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();		/* 扩展寄存器访问使能 */

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

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

相关文章

Arduino下载与安装(Windows 10)

Arduino下载与安装(Windows 10) 官网 下载安装 打开官网&#xff0c;点击SOFTWARE&#xff0c;进入到软件下载界面&#xff0c;选择Windows 选择JUST DOWNLOAD 在弹出的界面中&#xff0c;填入电子邮件地址&#xff0c;勾选Privacy Policy&#xff0c;点击JUST DOWNLOAD即可 …

深入解析:Element Plus 与 Vite、Nuxt、Laravel 的结合使用

在现代前端开发中&#xff0c;选择合适的工具和框架来提高开发效率和应用性能是至关重要的。 Element-Plus 是一个基于 Vue.js 3.0 的流行 UI组件库&#xff0c;它可以与多种前端和后端框架结合使用&#xff0c;如 Vite、Nuxt 和 Laravel。本文将深入探讨这三者与 Element Plus…

【脚本篇】---spyglass lint脚本

目录结构 sg_lint.tcl &#xff08;顶层&#xff09; #1.source env #date set WORK_HOME . set REPORT_PATH ${WORK_HOME}/reports puts [clock format [clock second] -format "%Y-%m-%d %H:%M:%S"] #2.generate source filelist #3.set top module puts "##…

qt-C++笔记之QThread使用

qt-C笔记之QThread使用 ——2024-05-26 下午 code review! 参考博文&#xff1a; qt-C笔记之使用QtConcurrent异步地执行槽函数中的内容&#xff0c;使其不阻塞主界面 qt-C笔记之QThread使用 文章目录 qt-C笔记之QThread使用一:Qt中几种多线程方法1.1. 使用 QThread 和 Lambda…

ubuntu server 24.04 网络 SSH等基础配置

1 安装参考上一篇: VMware Workstation 虚拟机安装 ubuntu 24.04 server 详细教程 服务器安装图形化界面-CSDN博客 2 网络配置 #安装 sudo apt install net-tools#查看 ifconfig #修改网络配置 sudo vim /etc/netplan/50-cloud-init.yaml network:version: 2ethernets:en…

课时136:变量进阶_变量实践_高级赋值

2 变量进阶 2.1 变量实践 2.1.1 高级赋值 学习目标 这一节&#xff0c;我们从 基础知识、简单实践、小结 三个方面来学习 基础知识 简介 所谓的高级赋值&#xff0c;是另外的一种变量值获取方法&#xff0c;这里涉及到更多我们学习之外的一些shell内置变量格式,其实这部分…

飞鸡:从小训练飞行的鸡能飞行吗?为什么野鸡能飞吗?是同一品种吗?今天自由思考

鸡的飞行能力在很大程度上受到其生理结构的限制。尽管鸡有翅膀&#xff0c;但与能够长时间飞行的鸟类相比&#xff0c;鸡的翅膀相对较小&#xff0c;且胸部肌肉较弱。再加上鸡的身体较重&#xff0c;这些因素共同限制了鸡的飞行能力。通常&#xff0c;鸡只能进行短暂的、低空的…

【wiki知识库】01.wiki知识库前后端项目搭建(SpringBoot+Vue3)

&#x1f4dd;个人主页&#xff1a;哈__ 期待您的关注 &#x1f33c;环境准备 想要搭建自己的wiki知识库&#xff0c;要提前搭建好自己的开发环境&#xff0c;后端我使用的是SpringBoot&#xff0c;前端使用的是Vue3&#xff0c;采用前后端分离的技术实现。同时使用了Mysql数…

C++ vector,dequeu,list容器中元素的引用失效问题

文章目录 一、std::list不会产生引用失效问题二、std::vector中元素引用失效问题三、std::deque中元素引用失效问题 一、std::list不会产生引用失效问题 在C中&#xff0c;std::list&#xff08;双向链表&#xff09;提供了一种非常灵活的容器类型&#xff0c;其设计使其在插入…

微信小程序的事件对象属性,事件绑定

微信小程序 小程序简介 1 小程序与普通网页开发的区别&#xff1f; 1运行环境的不同&#xff1a;网页运行在浏览器&#xff0c;小程序运行在微信环境&#xff1b; 2.API 不同&#xff1a;小程序无法调用 DOM 和 BOM 的 API&#xff0c;但可以调用微信环境提供的 API&#xff1…

单工无线发射接收系统

1 绪论 随着无线电技术的发展,通讯方式也从传统的有线通讯逐渐转向无线通讯。由于传统的有线传输系统有配线的问题,较不便利,而无线通讯具有成本廉价、建设工程周期短、适应性好、扩展性好、设备维护容易实现等特点,故未来通讯方式将向无线传输系统方向发展。同时,实现系…

mfc140.dll丢失原因和mfc140.dll丢失修复办法分享

mfc140.dll是与微软基础类库&#xff08;Microsoft Foundation Classes, MFC&#xff09;紧密相关的动态链接库&#xff08;DLL&#xff09;文件。MFC是微软为C开发者设计的一个应用程序框架&#xff0c;用于简化Windows应用程序的开发工作。以下是mfc140.dll文件的一些关键属性…

栈的实现(C语言)

文章目录 前言1.栈的概念及结构2.栈的实现3.具体操作3.1.初始化栈(StackInit)和销毁栈(StackDestory)3.2.入栈(StackPush)和出栈(StackPop)3.3.获得栈的个数(StackSize)、获得栈顶元素(StackTop)以及判空(StackEmpty) 前言 前段时间我们学习过了链表和顺序表等相关操作&#x…

go-zero 实战(4)

中间件 在 userapi 项目中引入中间件。go项目中的中间可以处理请求之前和之后的逻辑。 1. 在 userapi/internal目录先创建 middlewares目录&#xff0c;并创建 user.go文件 package middlewaresimport ("github.com/zeromicro/go-zero/core/logx""net/http&q…

经济寒冬下的黄金跳板:方案、活动、竞标一手掌握

推荐策划人必备的宝藏地产策划资源平台&#xff0c; 订阅浩叫&#xff1a;地产营销策划圈。这个平台简直是地产策划人的百宝箱&#xff0c;里面藏着无数的策划秘籍&#xff0c;等着你来挖掘。 这个平台就像是一个大型的方案库&#xff0c;里面收录了众多知名地产企业的内部资料…

leetcode:计数质数

class Solution { public:// 如果 x 是质数&#xff0c;那么大于 x 的 x 的倍数 2x,3x… 一定不是质数int countPrimes(int n) {vector<int> isPrime(n, 1);int ans 0;for (int i 2; i < n; i) {if (isPrime[i]) {ans 1;if ((long long)i * i < n) {for (int j …

leetcode-55 跳跃游戏

leetcode Problem: 55. 跳跃游戏 思路 假设我们是一个小人&#xff0c;从第一个下标开始&#xff0c;每次经过一个位置&#xff0c;我们就可以根据当前位置的数值nums[i]和位置下标i计算出该位置所能到达的后续位置的最大值rnums[i]i。而这个r之前的区域一定都是可以经过的。…

AI 谈“浔川AI翻译机”

在天工AI&#xff0c;天工AI在全网搜索“浔川AI翻译机”。 1 创作助手谈“浔川AI翻译机”&#xff1a; “浔川AI翻译机”是一个利用人工智能技术进行语言翻译的设备或应用程序。它可以将一种语言的文字或口语翻译成另一种语言&#xff0c;以实现不同语言之间的沟通和理解。浔…

08. Redis 缓存穿透和雪崩

文章目录 1. 缓存穿透&#xff08;查不到导致的&#xff09;1.1 概念1.2 解决方案布隆过滤器缓存空对象 2. 缓存击穿&#xff08;量太大、缓存过期&#xff09;2.1 概念2.2 解决方案设置热点数据永不过期加互斥锁 3. 缓存雪崩&#xff08;缓存集体失效或 Redis 宕机&#xff09…