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

2024-06-02 09:36

本文主要是介绍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的方法

这篇关于STC8增强型单片机进阶开发--LED呼吸灯(PWM)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1023600

相关文章

Spring Security 从入门到进阶系列教程

Spring Security 入门系列 《保护 Web 应用的安全》 《Spring-Security-入门(一):登录与退出》 《Spring-Security-入门(二):基于数据库验证》 《Spring-Security-入门(三):密码加密》 《Spring-Security-入门(四):自定义-Filter》 《Spring-Security-入门(五):在 Sprin

这15个Vue指令,让你的项目开发爽到爆

1. V-Hotkey 仓库地址: github.com/Dafrok/v-ho… Demo: 戳这里 https://dafrok.github.io/v-hotkey 安装: npm install --save v-hotkey 这个指令可以给组件绑定一个或多个快捷键。你想要通过按下 Escape 键后隐藏某个组件,按住 Control 和回车键再显示它吗?小菜一碟: <template

Hadoop企业开发案例调优场景

需求 (1)需求:从1G数据中,统计每个单词出现次数。服务器3台,每台配置4G内存,4核CPU,4线程。 (2)需求分析: 1G / 128m = 8个MapTask;1个ReduceTask;1个mrAppMaster 平均每个节点运行10个 / 3台 ≈ 3个任务(4    3    3) HDFS参数调优 (1)修改:hadoop-env.sh export HDFS_NAMENOD

Java进阶13讲__第12讲_1/2

多线程、线程池 1.  线程概念 1.1  什么是线程 1.2  线程的好处 2.   创建线程的三种方式 注意事项 2.1  继承Thread类 2.1.1 认识  2.1.2  编码实现  package cn.hdc.oop10.Thread;import org.slf4j.Logger;import org.slf4j.LoggerFactory

嵌入式QT开发:构建高效智能的嵌入式系统

摘要: 本文深入探讨了嵌入式 QT 相关的各个方面。从 QT 框架的基础架构和核心概念出发,详细阐述了其在嵌入式环境中的优势与特点。文中分析了嵌入式 QT 的开发环境搭建过程,包括交叉编译工具链的配置等关键步骤。进一步探讨了嵌入式 QT 的界面设计与开发,涵盖了从基本控件的使用到复杂界面布局的构建。同时也深入研究了信号与槽机制在嵌入式系统中的应用,以及嵌入式 QT 与硬件设备的交互,包括输入输出设

OpenHarmony鸿蒙开发( Beta5.0)无感配网详解

1、简介 无感配网是指在设备联网过程中无需输入热点相关账号信息,即可快速实现设备配网,是一种兼顾高效性、可靠性和安全性的配网方式。 2、配网原理 2.1 通信原理 手机和智能设备之间的信息传递,利用特有的NAN协议实现。利用手机和智能设备之间的WiFi 感知订阅、发布能力,实现了数字管家应用和设备之间的发现。在完成设备间的认证和响应后,即可发送相关配网数据。同时还支持与常规Sof

活用c4d官方开发文档查询代码

当你问AI助手比如豆包,如何用python禁止掉xpresso标签时候,它会提示到 这时候要用到两个东西。https://developers.maxon.net/论坛搜索和开发文档 比如这里我就在官方找到正确的id描述 然后我就把参数标签换过来

[MySQL表的增删改查-进阶]

🌈个人主页:努力学编程’ ⛅个人推荐: c语言从初阶到进阶 JavaEE详解 数据结构 ⚡学好数据结构,刷题刻不容缓:点击一起刷题 🌙心灵鸡汤:总有人要赢,为什么不能是我呢 💻💻💻数据库约束 🔭🔭🔭约束类型 not null: 指示某列不能存储 NULL 值unique: 保证某列的每行必须有唯一的值default: 规定没有给列赋值时的默认值.primary key:

Linux_kernel驱动开发11

一、改回nfs方式挂载根文件系统         在产品将要上线之前,需要制作不同类型格式的根文件系统         在产品研发阶段,我们还是需要使用nfs的方式挂载根文件系统         优点:可以直接在上位机中修改文件系统内容,延长EMMC的寿命         【1】重启上位机nfs服务         sudo service nfs-kernel-server resta

【区块链 + 人才服务】区块链集成开发平台 | FISCO BCOS应用案例

随着区块链技术的快速发展,越来越多的企业开始将其应用于实际业务中。然而,区块链技术的专业性使得其集成开发成为一项挑战。针对此,广东中创智慧科技有限公司基于国产开源联盟链 FISCO BCOS 推出了区块链集成开发平台。该平台基于区块链技术,提供一套全面的区块链开发工具和开发环境,支持开发者快速开发和部署区块链应用。此外,该平台还可以提供一套全面的区块链开发教程和文档,帮助开发者快速上手区块链开发。