51单片机 (十二)PWM
什么是PWM
脉冲宽度调制(PWM),是英文“Pulse Width Modulation”的缩写,简称脉宽调制,是利用微处理器的数字输出来对模拟电路进行控制的一种非常有效的技术,广泛应用在从测量、通信到功率控制与变换的许多领域中。
pwm的频率:
是指1秒钟内信号从高电平到低电平再回到高电平的次数(一个周期);
也就是说一秒钟PWM有多少个周期
单位: Hz
表示方式: 50Hz 100Hz
pwm的周期:
T=1/f
周期=1/频率
50Hz = 20ms 一个周期如果频率为50Hz ,也就是说一个周期是20ms 那么一秒钟就有 50次PWM周期
占空比:
是一个脉冲周期内,高电平的时间与整个周期时间的比例
单位: % (0%-100%)
表示方式:20%
周期: 一个脉冲信号的时间 1s内测周期次数等于频率
脉宽时间: 高电平时间
上图中 脉宽时间占总周期时间的比例,就是占空比
比方说周期的时间是10ms,脉宽时间是8ms 那么低电平时间就是2ms 总的占空比 8/(8+2)= 80%
这就是占空比为80%的脉冲信号
而我们知道PWM就是脉冲宽度调制 通过调节占空比,就可以调节脉冲宽度(脉宽时间) 而频率 就是单位时间内脉冲信号的次数,频率越大
以20Hz 占空比为80% 举例 就是1秒钟之内输出了20次脉冲信号 每次的高电平时间为40ms
我们换更详细点的图
上图中,周期为T
T1为高电平时间
T2 为低电平时间假设周期T为 1s 那么频率就是 1Hz 那么高电平时间0.5s ,低电平时间0.5s 总的占空比就是 0.5 /1 =50%
PWM原理
以单片机为例,我们知道,单片机的IO口输出的是数字信号,IO口只能输出高电平和低电平
假设高电平为5V 低电平则为0V 那么我们要输出不同的模拟电压,就要用到PWM,通过改变IO口输出的方波的占空比从而获得使用数字信号模拟成的模拟电压信号
我们知道,电压是以一种连接1或断开0的重复脉冲序列被夹到模拟负载上去的(例如LED灯,直流电机等),连接即是直流供电输出,断开即是直流供电断开。通过对连接和断开时间的控制,理论上来讲,可以输出任意不大于最大电压值(即0~5V之间任意大小)的模拟电压
比方说 占空比为50% 那就是高电平时间一半,低电平时间一半,在一定的频率下,就可以得到模拟的2.5V输出电压 那么75%的占空比 得到的电压就是3.75V
pwm的调节作用来源于对“占周期”的宽度控制,“占周期”变宽,输出的能量就会提高,通过阻容变换电路所得到的平均电压值也会上升,“占周期”变窄,输出的电压信号的电压平均值就会降低,通过阻容变换电路所得到的平均电压值也会下降
也就是,在一定的频率下,通过不同的占空比 即可得到不同的输出模拟电压
接下来我们接开始使用51单片机来实现PWM吧
本次使用了定时器0,方式一(16位),设置成每100us就中断一次,并执行中断函数。所以如果我们想定时器100us产生一次中断的话就需要给定时器你设置初值为FC18,当定时器从FC18追加到FFFF时,经过了FFFF-FC18+1=1000*us时溢出触发中断,因为机器使用的时钟是12MHZ,每1us产生一个计数脉冲。
代码部分:
#include "reg52.h" //此文件中定义了单片机的一些特殊功能寄存器 typedef unsigned int u16; //对数据类型进行声明定义
typedef unsigned char u8;#define LED P2 //总线法点灯void delay(u16 i) //延时函数
{while(i--);
}void Timer0Init()
{TMOD|=0X01; //选择为定时器0模式,工作方式1,仅用TR0打开启动。TH0=0XFC; //给定时器赋初值,定时1msTL0=0X18; ET0=1; //打开定时器0中断允许EA=1; //打开总中断TR0=1; //打开定时器
}void main()
{ Timer0Init(); //定时器0初始化while(1);
}void Timer0() interrupt 1
{static u16 out_time, bright_time;static u16 i;TH0=0XFC; //给定时器赋初值,定时1msTL0=0X18;i++;if(i==1000) //1s{i=0;for(bright_time=0;bright_time<=500;bright_time++){ //暗的时间减少,亮的时间增加out_time=500-bright_time;//暗LED=0xff;delay(out_time);//亮LED=0x00;delay(bright_time);}for(out_time=0;out_time<=500;out_time++){//暗的时间增加,亮的时间减少bright_time=500-out_time;//亮LED=0x00;delay(bright_time);//暗LED=0xff;delay(out_time);}}
}
51单片机 (十二)PWM相关推荐
- 51单片机(二十五)—— 独立按键控制LED
在51单片机的前面的文章中,我们主要讲述了单片机IO口的输出功能的应用,如LED控制.数码管控制等.这篇文章我们来讲解如何用单片机的IO口读取按键的状态,并根据按键的状态来控制LED.关于51单片机按 ...
- AS608指纹模块于51单片机的二次开发
AS608指纹模块于51单片机的二次开发 前言提要 一.初识AS608: 二.设计 1.思路 2.上原理图: 3.程序设计中需要注意的几个点: 串口: 总结 前言提要 记得好久之前听老师说:你们有一个 ...
- 基于51单片机可调PWM发生器
源码:基于51单片机可调PWM发生器 一.设计任务 PWM信号频率范围为20Hz ~ 100kHz 占空比为5%~95% 键盘设置PWM频率和占空比 液晶模块显示输出频率和占空比 二.硬件设计 1.硬 ...
- 51单片机的直流电机PWM调速控制系统(附Proteus仿真+C程序等全套资料)
设计思路 直流电机PWM控制系统的主要功能包括:很实现对直流电机的加速.减速以及电机的正转.反转和急停,并且可以调整电机的转速,能够方便的实现电机的智能控制. 主体电路:即直流电机PWM控制模块.这部 ...
- 51单片机声控语音PWM风扇可自动温控定时调速风扇转速显示
实践制作DIY- GC0017-声控语音PWM风扇 一.功能说明: 基于51单片机设计-声控语音PWM风扇 功能介绍: 1.基于51(AT89C52.STC89C52)单片机,DS18B20温度传感器 ...
- 51单片机(二十二)—— 定时器2功能测试
在本文中,我们对51单片机的定时器2的功能进行测试.包含两个实验,一个是定时器2递增计数功能的测试,另一个是定时器2递减计数功能的测试. 实验1:递增计数 这个实验使用了定时器2的16位自动重装模式的 ...
- 【51单片机学习】PWM电机调速
简单的PWM电机调速--基于51单片机 (一)51单片机需要用到的寄存器 (二)PWM波的产生及调速原理 (三)电机调速的实现 (一)51单片机需要用到的寄存器 中断允许寄存器,详情可以看STC51单 ...
- 104、基于51单片机智能风扇pwm调速红外遥控无线遥控风扇温控风扇系统设计
毕设帮助.开题指导.技术解答(有偿)见文末. 目录 摘要 一.硬件方案 二.设计功能 三.实物图 四.原理图 五.Protues仿真 六.流程图 七.程序源码 八.资料包括 摘要 随着气温的逐渐上升, ...
- 51单片机生成二维码
最近搞了个单片机生成二维码,步骤如下 1.下载QRCode生成的驱动源代码,这个驱动是c语言编写的可以移植到各种c语言写的工程上去,下面附上下载链接: https://download.csdn.ne ...
- 51单片机(二十七)—— 蜂鸣器播放音乐
1.实验原理介绍 蜂鸣器是电路中经常使用的发声器件,我们一般使用蜂鸣器发出"嘀嘀"的声音,用它作为提示音.有没有想过用蜂鸣器还可以播放音乐呢?这显然是件很有意思的事情. 本文使用蜂 ...
最新文章
- iOS 开发之 pdf 文档的加载与浏览的 4 种方式
- 【ACM】杭电OJ 1181
- Makefile —— 如何在文件内使用变量?
- Codeforces 755B. PolandBall and Game 贪心
- 使用Maven构建Dubbo服务的可运行jar包
- 4天学会python_学习python第四天
- “逃离大厦”游戏的破解
- Scrum方法论(四)
- 线程WAITING--BlockingQueueDemo
- 手眼标定eye-to-hand 示例:handeye_stationarycam_calibration
- (Deep learning)深度卷积网络实战——第四部分
- Intel酷睿前世今生(二)
- 分享在工作生活中更好地运用思维导图使用攻略
- 算法篇-----粒子群算法
- 2022-3-26JavaSE试卷-答案
- NATS中文开发文档:连接
- 基于Java的网上作业批改系统
- 我的创作纪念日---祈愿
- 五十四、HBase的协处理器
- Android应用识别支付宝收款二维码直接跳转支付宝转账界面