51单片机-直流电机(PWM:脉冲宽度调制)实验-会呼吸的灯直流电机调速

作者:Whappy(菜的扣脚)

脉冲宽度调制(Pulse Width Modulation,PWM)是一种通过调节信号的占空比来控制功率输出的技术。它主要通过改变脉冲信号的高电平持续时间相对于低电平的时间来调节功率传递给负载的量。PWM 技术可以实现以下功能:

1. 电机速度控制

  • 直流电机调速:通过改变PWM信号的占空比,可以控制电机的输入电压,进而控制电机的转速。占空比越高,电机转速越快;占空比越低,转速越慢。
  • 步进电机控制:PWM 也可以用于精确控制步进电机的速度和方向。

2. 灯光亮度调节

  • LED亮度调节:通过改变PWM信号占空比,调节LED灯的平均电流,从而控制LED的亮度。占空比越高,亮度越高;占空比越低,亮度越低。

3. 音频信号产生

  • 声音输出:PWM可以用来生成音频信号。例如,PWM可以用于音频合成,生成不同频率的方波信号,通过扬声器产生不同音调的声音。
  • 音量控制:通过调节PWM信号的占空比,可以控制音频信号的强度,从而调节声音的音量。

4. 加热器功率控制

  • 加热元件控制:通过调节加热器的PWM信号占空比,可以控制传递给加热器的能量,从而调节温度。

5. 开关电源的调节

  • DC-DC 转换器:PWM广泛应用于开关模式电源(如DC-DC转换器),通过调节占空比来控制输出电压。
  • 逆变器和整流器:在电源中,PWM用于逆变和整流,以实现高效的电能传输和转换。

6. 无线通信调制

  • 数据传输调制:在某些无线通信系统中,PWM可以用于调制数据,例如红外通信中的信号编码。

7. 伺服系统控制

  • 位置控制:在伺服电机控制中,PWM信号用于精确控制伺服电机的角度位置。PWM信号的脉冲宽度决定伺服电机的旋转角度。

8. 电池充电控制

  • 充电控制器:PWM用于控制电池的充电过程,调节电流和电压,防止电池过度充电,并延长电池寿命。

9. 信号生成与调制

  • 信号生成:通过调整PWM信号的占空比和频率,PWM可以用于产生不同频率和波形的信号,如方波、锯齿波等。
  • 模拟信号生成:PWM可以通过低通滤波器生成模拟电压,用于数模转换。

10. 机器人控制

  • 机器人运动控制:PWM常用于机器人的电机速度控制、舵机控制等,确保机器人运动的精准和稳定。

H桥驱动可以控制电机的正反转。电机是一个感性元件,带有电感效应,在用mos管和三级管驱动时,要加上一个耳机管保护电路。

现象:

51单片机!定时器实现PWM呼吸灯&直流电机调速

1.呼吸灯-延时实现(控制占空比)软件模拟PWM实现(通过控制一个周期内高电平所持续的时间:即高电平持续时间越久,亮度持续的就越久)

#include <REGX52.H>
#include "intrins.h"#define LED		P2void Delay(unsigned int xms)		//@11.0592MHz
{while(xms--);
}void main(void)
{unsigned char Time,i;while(1){for(Time=0; Time<100; Time++){for(i=0; i<20; i++){LED = 0X00;Delay(Time);LED = 0XFF;Delay(100-Time);}			}for(Time=100; Time>0; Time--){for(i=0; i<20; i++){LED = 0X00;Delay(Time);LED = 0XFF;Delay(100-Time);}			}}		}

2.呼吸灯(定时器实现)(控制占空比):

#include <REGX52.H>/****配置LED****/
sbit LED = P2^0;
bit Direct_flag = 0; 	//LED的呼吸方向的开关
/****函数声明****/
void T0init();
/****全局变量****/
unsigned int PWM_wanttime=0;			//想要多长时间改变的占空比一次
unsigned int Breath_wanttime=0;		//想要多长时间改变呼气或者吸气的值时间
unsigned int  PWM_value = 0;				//占空比的大小void main()
{T0init();while(1){}	
}
/*********************************************************
* 函数说明 :1ms定时
* 入口参数 :void
* 返回值   :void
*********************************************************/
void T0init()
{TMOD |= 0x01;	//设置定时器为工作方式1  TH0=0XFC;   //1ms定时,装入初值TL0=0X66;ET0 = 1;    //开定时器的中断TR0 = 1;    //开定时器EA = 1;     //开总中断
}void Time0(void) interrupt 1
{TH0=0XFC;   //1ms定时,装入初值TL0=0X66;PWM_wanttime++;			//改变的占空比一次的标志Breath_wanttime++;		//呼气或者吸气的时间改变的标志if(PWM_wanttime == PWM_value)      	//判断是否到了点亮LED的时候LED = 0;                    	//点亮LEDif(PWM_wanttime == 10)            	//当前周期结束{LED = 1;                    	//熄灭LEDPWM_wanttime = 0;              	//重新计时,去改变占空比}if((Breath_wanttime == 200) && (Direct_flag == 0))	  //200ms 改一次占空比,占空比每次增加10%{                               Breath_wanttime = 0;PWM_value++;				//改变占空比的值if(PWM_value == 9)          //占空比更改方向Direct_flag = 1; }if((Breath_wanttime == 200) && (Direct_flag == 1))	 //200ms 改一次占空比,占空比每次减少10%{                               Breath_wanttime = 0;PWM_value--;				//改变占空比的值if(PWM_value == 1)          //占空比更改方向Direct_flag = 0; }
}

3.直流电机(定时器实现)(控制占空比):(其余代码模块在主页其他实验通用-用16位重装值,初始值设置100us)

#include <REGX52.H>
#include "Nixie.h"
#include "Timer.h"
#include "Key.h"
#include "Delay.h"sbit Motor = P1^0;unsigned char Counter,Compare;
unsigned char KeyNum,Speed;void main(void)
{Timer0_Init();Compare = 50;while(1){	KeyNum = Key();if(KeyNum == 1){Speed++;Speed %= 7;if(Speed == 0) {Compare=0;}if(Speed == 1) {Compare=40;}if(Speed == 2) {Compare=50;}if(Speed == 3) {Compare=60;}if(Speed == 4) {Compare=70;}if(Speed == 5) {Compare=80;}if(Speed == 9) {Compare=90;}if(Speed == 10 ) {Compare=100;}}Nixie(1,Speed);}
}void Timer0_Rountine(void)  interrupt 1
{static unsigned int T0Count ;  //Timer0_Rountine(void) 函数结束之后T0Count保留其原来的值TL0 = 0xA4;		//设置定时初值TH0 = 0xFF;		Counter++;Counter %= 100;if(Counter < Compare){Motor = 1;}else{Motor = 0;}}

本实验到此!就告一段路了,因此,我来进行总结一下,PWM说白了,就是控制占空比的大小来控制高电平持续的时间,简单的说也就是控制PWM模拟我们的模拟电信号的变化!在这里可通过延时函数或定时器来实验PWM的调制,就是改变占空比。

原理很简单!但是PWM有一个算法很好用!自己查(控制算法)

PWM原理 PWM频率与占空比详解-CSDN博客(可参考PWM)

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

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

相关文章

影刀RPA实战:网页爬虫之携程酒店数据

1.实战目标 大家对于携程并不陌生&#xff0c;我们出行定机票&#xff0c;住酒店&#xff0c;去旅游胜地游玩&#xff0c;都离不开这样一个综合性的网站为我们提供信息&#xff0c;同时&#xff0c;如果你也是做旅游的公司&#xff0c;那携程就是一个业界竞争对手&#xff0c;…

git 生成和查看密钥

项目场景&#xff1a; 在前端项目开发中&#xff0c;经常会用到git。一般的小公司很少去设置git令牌或者密钥&#xff1b;而在一些大公司&#xff0c;会用到这个。今天主要整理下git如何生成和查看密钥。 密钥 1、生成密钥 cat ~/.ssh/id_rsa.pub 2、查看密钥 ssh-keygen…

Istio下载及安装

Istio 是一个开源的服务网格&#xff0c;用于连接、管理和保护微服务。以下是下载并安装 Istio 的步骤。 官网文档&#xff1a;https://istio.io/latest/zh/docs/setup/getting-started/ 下载 Istio 前往Istio 发布页面下载适用于您的操作系统的安装文件&#xff0c;或者自动…

前端动画库大比拼:为何选择Velocity.js

前端动画库大比拼&#xff1a;为何选择Velocity.js 前言 在现代网页设计中&#xff0c;动画效果是提升用户体验的重要手段。 Velocity.js: 一个与 jQuery 动画 API 兼容的动画引擎&#xff0c;以其卓越的性能和丰富的功能&#xff0c;成为了开发者的好工具。 本文将详细介绍…

数字逻辑电路-加法器

目录 半加器和全加器 半加器 ​全加器 集成全加器 利用全加器实现二进制的乘法功能 加法器 半加器和全加器 半加器 不考虑低位进位的加法。 本位为s&#xff0c;进位为c。 全加器 多了一个相邻低位来的进位数。 集成全加器 左上角和右下角那两个是不用的。 利用全加器…

「iOS」——单例模式

iOS学习 前言单例模式的概念单例模式的优缺点单例模式的两种模式懒汉模式饿汉模式单例模式的写法 总结 前言 在一开始学习OC的时候&#xff0c;我们初步接触过单例模式。在学习定时器与视图移动的控件中&#xff0c;我们初步意识到单例模式的重要性。对于我们需要保持的控件&a…

Python基础(七)——PyEcharts数据分析(面向对象版)

四、使用PyEcharts数据分析案例&#xff08;面向对象版&#xff09; 【前言&#xff1a;为了巩固之前的Python基础知识&#xff08;一&#xff09;到&#xff08;五&#xff09;&#xff0c;并为后续使用Python作为数据处理的好帮手&#xff0c;我们一起来用面向对象的思想来理…

基于ESP32S3的链接大语言模型对话模块

本实物模块从实物外观、模块组成、API申请及功能说明四部分来介绍这款基于ESP32S3的大语言模型对话模块。 1、实物外观 2、模块介绍 本硬件平台主要由三个模块组成&#xff0c;包括MAX9814录音模块、MAX98357音频功放模块和ESP32S3模块。如下图所示。 MAX9814录音模块&#…

C#程序员的堕落从nuget开始:将自己的代码发布到nuget

初级代码游戏的专栏介绍与文章目录-CSDN博客 我的github&#xff1a;codetoys&#xff0c;所有代码都将会位于ctfc库中。已经放入库中我会指出在库中的位置。 这些代码大部分以Linux为目标但部分代码是纯C的&#xff0c;可以在任何平台上使用。 源码指引&#xff1a;github源…

【Android 13源码分析】WindowContainer窗口层级-2-构建流程

在安卓源码的设计中&#xff0c;将将屏幕分为了37层&#xff0c;不同的窗口将在不同的层级中显示。 对这一块的概念以及相关源码做了详细分析&#xff0c;整理出以下几篇。 【Android 13源码分析】WindowContainer窗口层级-1-初识窗口层级树 【Android 13源码分析】WindowCon…

房产销售系统:SpringBoot技术应用案例

第二章关键技术的研究 2.1相关技术 房产销售系统是在Java MySQL开发环境的基础上开发的。Java是一种服务器端脚本语言&#xff0c;易于学习&#xff0c;实用且面向用户。全球超过35&#xff05;的Java驱动的互联网站点使用Java。MySQL是一个数据库管理系统&#xff0c;因为它的…

代理导致的git错误

问题&#xff1a; 今天在clone时出现如下错误&#xff1a; fatal: unable to access https://github.com/NirDiamant/RAG_Techniques.git/: Failed to connect to 127.0.0.1 port 10089 after 2065 ms: Couldnt connect to server真是让人感到奇怪&#xff01;就在前天&#…

伪工厂模式制造敌人

实现效果 1.敌人方实现 敌人代码 using UnityEngine; using UnityEngine.UI;public class EnemyBasics : MonoBehaviour {public int EnemySpeed { get; internal set; }public int EnemyAttackDistance { get; internal set; }public int EnemyChaseDistance { get; interna…

初识 C++ ( 1 )

引言&#xff1a;大家都说c是c的升级语言。我不懂这句话的含义后来看过解释才懂。 一、面向过程语言和面向对象语言 我们都知道C语言是面向过程语言&#xff0c;而C是面向对象语言&#xff0c;说C和C的区别&#xff0c;也就是在比较面向过程和面向对象的区别。 1.面向过程和面向…

WebGL系列教程九(动画)

目录 1 前言2 绘制立方体并进行纹理映射3 动画思路4 开始绘制4.1 在顶点着色器中声明旋转矩阵4.2 获取旋转矩阵变量并进行赋值4.3 计算角度4.4 每一帧都去绘制4.5 效果4.6 完整代码 5 总结 1 前言 上一篇我们讲了WebGL中的基础语法&#xff0c;现在我们已经讲过了三维物体的绘制…

TDengine 与 SCADA 强强联合:提升工业数据管理的效率与精准

随着时序数据库&#xff08;Time Series Database&#xff09;的日益普及&#xff0c;越来越多的工业自动化控制&#xff08;工控&#xff09;人员开始认识到其强大能力。然而&#xff0c;时序数据库在传统实时数据库应用领域&#xff0c;特别是在过程监控层的推广仍面临挑战&a…

【数据结构】排序算法---冒泡排序

文章目录 1. 定义2. 算法步骤3. 动图演示4. 性质5. 算法分析6. 代码实现C语言PythonJavaCGo 结语 1. 定义 冒泡排序&#xff08;英语&#xff1a;Bubble sort&#xff09;是一种简单的排序算法。它重复地走访过要排序的数列&#xff0c;一次比较两个元素&#xff0c;如果它们的…

Android 13 固定systemUI的状态栏为黑底白字,不能被系统应用或者三方应用修改

目录 一.背景 二.思路 三.代码流程 1.colos.xml自定义颜色 2.设置状态栏的背景颜色 3.对View进行操作 ①.对Clock(状态栏左侧的数字时钟)进行操作 ②.对电池(BatteryMeterView)进行操作 4.锁屏状态栏 5.patch汇总 一.背景 客户需求将状态栏固定成黑底白字,并且不能让系…

ipython里如何用?快速查阅帮助

1、&#xff1f;用于查询函数帮助文档&#xff0c;??用于查询带源码的帮助文档 ?用于搜索内容&#xff0c;*作为通配符。

C++调用C# DLL之踩坑记录

C是非托管代码&#xff0c;C#则是托管代码&#xff0c;无法直接调用 CLR的介绍见CLR简介 MSDN提到了两种非托管-托管的交互技术&#xff1a;CLR Interop和COM Interop 后者要将C# 类库注册为COM组件&#xff0c;本文只探讨CLR&#xff0c;要通过C CLR写中间层代码 方式一&…