使用51单片机的GPIO输出占空比可调节的PWM波

news2024/9/23 9:35:23

一、前言

在一些单片机或微控制器中,通用GPIO可以被配置为产生PWM信号。PWM即脉冲宽度调制,是一种用于模拟输出的技术。它可以通过改变输出信号的脉冲宽度来控制电路中的电平,从而实现对电路的控制。

二、什么是PWM波?

PWM波(Pulse-Width Modulation),即脉宽调制波,是一种用于控制电子电路中电力开关的技术。它通过调节脉冲信号的占空比,即高电平与低电平的时间比例,来控制输出电压或电流的大小。

PWM波可以用于各种场合,例如控制电机的转速和方向、控制LED灯的亮度等。在数字信号处理、嵌入式系统、机器人等领域中都有广泛应用。

PWM波的占空比是指高电平的时间占一个周期时间的比例。具体来说,如果PWM波周期为T,高电平时间为t,那么占空比D的计算公式为:

D = t / T * 100%

其中D是占空比的百分比,t是高电平时间,T是PWM波的周期。例如,如果PWM波的周期为1ms,高电平时间为0.3ms,那么该PWM波的占空比为:

D = 0.3ms / 1ms * 100% = 30%

通常情况下,占空比越大,PWM波的平均电压就越高,所以PWM波的占空比对控制电路的输出电压和电流非常重要。

三、输出PWM波的实现思路

在51单片机中,可以使用定时器/计数器模块和通用IO口结合来实现PWM输出。具体步骤如下:

  • 配置定时器/计数器工作模式:定时器/计数器模块通常包含多种工作模式,如定时器模式、计数器模式、PWM输出模式等。需要选择合适的工作模式,并对其进行相应的配置。比如,对于STC89C52单片机的定时器/计数器模块,可以选择16位定时器模式,并设置计数器初值和重载值。

  • 配置IO口工作模式:需要将通用IO口配置为输出模式,并将其连接到PWM信号输出引脚上。

  • 编写中断服务程序:在定时器/计数器计数完成时,将触发相应的中断请求。需要编写中断服务程序,以便在中断处理程序中更新PWM输出信号的占空比。

  • 更新PWM输出信号的占空比:中断服务程序中需要更新PWM输出信号的占空比。可以通过调整计数器重载值或修改IO口输出状态等方式实现。

通过合理配置定时器/计数器模块和IO口,并编写相应的中断服务程序,就可以在51单片机上实现可调节占空比的PWM输出了。

四、定时器配置

在51单片机中,使用定时器来生成PWM信号需要首先选择定时器,根据具体需要,选择需要使用的定时器,比如定时器0、定时器1等。在确定了我们要使用的定时器后就可以开始配置定时器的模式了,根据具体的PWM波形需要,选择定时器的工作模式。比如,可以选择定时器工作在 定时器/计数器 模式或者 自动重载 模式。

在这里插入图片描述

下面是对一个定时器初始化需要的一些语句:

 	TMOD = 0x01;  // 定时器0设置为模式1,计时器
    TH0 = 0xFC;   // 定时器0初始值
    TL0 = 0x66;   // 定时器0重载值
    ET0 = 1;      // 使能定时器0中断
    TR0 = 1;      // 启动定时器0
    EA = 1;       // 全局中断使能

在这个示例中,定时器0的计时时间为1ms,当定时器计数器达到重载值时,就会触发定时器中断,调用中断服务程序执行相关操作。

五、代码实现

根据上面的知识我们可以编写出以下代码,该代码可以实现51单片机的通用GPIO输出占空比可调节的PWM波:

#include <reg52.h>
#define PWM_OUT P1

// 定义占空比
unsigned char PWM_duty_ratio = 50;  // 50%占空比

void main()
{
    // 设置定时器1的计数初值
    TH1 = 0xFC;
    TL1 = 0x66;
    // 设置定时器1为工作模式2
    TMOD |= 0x10;
    // 启动定时器1
    TR1 = 1;
    // 设置PWM输出的IO口为输出模式
    PWM_OUT = 0;
    // 开始输出PWM波
    while(1)
    {
        if(PWM_OUT >= PWM_duty_ratio)
            PWM_OUT = 0;
        else
            PWM_OUT = 1;
    }
}
👇点击下方公众号卡片获取资料👇

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

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

相关文章

JavaSE-线程池(5)- 建议使用的方式

JavaSE-线程池&#xff08;5&#xff09;- 建议使用的方式 虽然JDK Executors 工具类提供了默认的创建线程池的方法&#xff0c;但一般建议自定义线程池参数&#xff0c;下面是阿里巴巴开发手册给出的理由&#xff1a; 另外Spring也提供了线程池的实现&#xff0c;比如 Thread…

Flink02:Flink快速上手(Streaming WorldCount)

一、Flink快速上手 使用 &#xff08;1&#xff09;先把Flink的开发环境配置好。 &#xff08;2&#xff09;创建maven项目&#xff1a;db_flink &#xff08;3&#xff09;首先在model中将scala依赖添加进来。 &#xff08;4&#xff09;然后创建scala目录&#xff0c;因为针…

Lesson5---NumPy科学计算库

5.1 多维数组 Python拥有出色的第三方库生态系统在机器学习中&#xff0c;需要把所有的输入数据&#xff0c;都转变为多为数组的形式。score[i, j]二维数组i,j都从0开始 score[5] [85, 72, 61, 92, 80] score[2,5] [[85, 72, 61, 92, 80],[85, 72, 61, 92, 80]] score[30,5…

Linux系统之iptables应用SNAT与DNAT

目录 SNAT 一.SNAT的原理介绍 1.应用环境 2.SNAT原理 3.SNAT转换前提条件 二.开启SNAT 1.临时打开 2.永久打开 三.SNAT的转换 1.固定的公网IP地址 2.非固定的公网IP地址(共享动态IP地址) 四.SNAT实验 1.实验环境准备 2.配置web服务器&#xff08;192.168.100.100…

测试3.测试方法的分类

3.测试分类 系统测试包括回归测试和冒烟测试 回归测试&#xff1a;修改了旧的代码后&#xff0c;重新测试功能是否正确&#xff0c;有没有引入新的错误或导致其它代码产生错误 冒烟测试&#xff1a;目的是确认软件基本功能正常&#xff0c;可以进行后续的正式测试工作 按是否…

什么是 RESTful 风格?

一、什么是 REST &#xff1f; REST即表述性状态传递&#xff08;英文&#xff1a;Representational State Transfer&#xff0c;简称REST&#xff09;是Roy Thomas Fielding博士在2000年他的博士论文中提出来的一种软件架构风格。它是一种针对网络应用的设计和开发方式&#…

游戏开发 - 开发流程 - 收集

1.应用场景 主要用于了解&#xff0c;掌握游戏开发的整个流程。 2.学习/操作 1.文档阅读 复习课 | 带你梳理客户端开发的三个重点-极客时间 2.整理输出 2.1 游戏开发流程 -- 参考 按照游戏开发中的三大模块策划、程序、美术&#xff0c;画了一个图。 开发游戏的时候&#xff…

LeetCode171-Excel表列序号(进制转换问题)

LeetCode171-Excel表列序号1、问题描述2、解题思路&#xff1a;进制转换3、代码实现1、问题描述 给你一个字符串columnTitle,表示Excel表格中得列名称。返回该列名称对应得列序号。 例如&#xff1a; A -> 1 B -> 2 C -> 3 ... Z -> 26 AA -> 27 AB -> 28 …

linux shell 入门学习笔记3 shebang

shebang 计算机程序中&#xff0c;shebang指的是出现在文本文件的第一行前两个字符#! 在Unix系统中&#xff0c;程序会分析shebang后面的内容&#xff0c;作为解释器的指令&#xff0c;例如 以#!/bin/sh 开头的文件&#xff0c;程序在执行的时候会调用/bin/sh&#xff0c;也就…

[软件工程导论(第六版)]第5章 总体设计(复习笔记)

文章目录5.1 设计过程5.2 设计原理5.2.1 模块化5.2.2 抽象5.2.3 逐步求精5.2.4 信息隐藏和局部化5.2.5 模块独立5.3 启发规则5.4 描绘软件结构的图形工具5.4.1 层次图5.4.2 HIPO图5.4.3 结构图5.5 面向数据流的设计方法目的 总体设计的基本目的就是回答“概括地说&#xff0c;系…

2.19 索引和事务

一.联合查询面试问题:聚合查询与联合查询的区别聚合查询是行与行之间的数据加工聚合函数 :count,sum,avg...group by 进行分组,指定列的值,相同的记录合并到同一个组,每个组又可以分别进行聚合查询分组还可以指定条件筛选,如果分组之前指定条件 用where,如果对分组之后指定条件…

< CSDN周赛解析:第 28 期 >

CSDN周赛解析&#xff1a;第 27 期&#x1f449; 第一题&#xff1a; 小Q的鲜榨柠檬汁> 题目解析> 解决方案&#x1f449; 第二题&#xff1a; 三而竭> 解析> 解决方案> 拓展知识&#x1f449; 第三题&#xff1a; 隧道逃生> 解析> 解决方案&#x1f449;…

【人工智能AI】四、NoSQL进阶《NoSQL 企业级基础入门与进阶实战》

帮我写一篇介绍NoSQL的技术文章&#xff0c;文章的标题是《四、NoSQL进阶》&#xff0c;不少于3000字。帮我细化到三级目录&#xff0c;使用markdown格式。这篇文章的目录是&#xff1a; 四、NoSQL 进阶 4.1 NoSQL 高可用 4.2 NoSQL 数据安全 4.3 NoSQL 性能优化 4.4 总结 四、…

Vue:extends继承组件复用性

提到extends继承&#xff0c;最先想到的可能是ES6中的class、TS中的interface、面向对象编程语言中中的类和接口概念等等&#xff0c;但是我们今天的关注点在于&#xff1a;如何在Vue中使用extends继承特性。 目录 Vue&#xff1a;创建Vue实例的方式 构造函数方式&#xff1…

3D点云处理:点云聚类--FEC: Fast Euclidean Clustering for Point Cloud Segmentation

文章目录 聚类结果一、论文内容1.1 Ground Surface Removal1.2 Fast Euclidean Clustering题外:欧几里得聚类Fast Euclidean Clustering二、参考聚类结果 原始代码中采用的是pcl中的搜索方式,替换为另外第三方库,速度得到进一步提升。 一、论文内容 论文中给出的结论:该…

java基础学习 day42(继承中构造方法的访问特点,this、super的使用总结)

继承中&#xff0c;构造方法的访问特点 父类的构造方法不会被子类继承&#xff0c;但可以通过super()调用父类的构造方法&#xff0c;且只能在子类调用&#xff0c;在测试类中是不能手动单写构造方法的。子类中所有的构造方法默认先调用父类的无参构造&#xff0c;再执行自己构…

vue3+ts+node个人博客系统(三)

一.主页顶部和中心面板布局 &#xff08;1&#xff09; 首先先去element-plus选择合适的布局el-container (2)在头部处编写相应的菜单栏el-menu,在这里要注意动态绑定路由的问题:default-active"$route.path"。将default-active设置为$route.path&#xff0c;el-me…

Java File类、IO流、Properties属性类

文章目录一、补充二、File类File类的含义创建多级文件File类的常见方法三、IO流IO流分类输入输出流FileOutputStreamInputStreamInputStream与OutputStream的实例ReaderWriterFileReader和FileWriter的实例缓冲流转换流序列化与ObjectInputStream、ObjectOutputStream打印流Pro…

MySQL 10:MySQL事务

MySQL 中的事务是由存储引擎实现的。在 MySQL 中&#xff0c;只有 InnoDB 存储引擎支持事务。事务处理可用于维护数据库的完整性&#xff0c;确保批处理的 SQL 语句要么执行要么根本不执行。事务用于管理 DDL、DML 和 DCL 操作&#xff0c;例如插入、更新和删除语句&#xff0c…