0%

PWM波形输出

PWM波输出

PWM(Pulse Width Modulation)控制——脉冲宽度调制技术。通过对一系列脉冲的宽度进行调制,来等效的获得所需的波形(包括形状和赋值),对模拟信号进行数字编码。

基本原理

占空比:输出波形中,高电平保持的时间与时钟周期之比。
例如,一个单片机频率1000Hz,时钟周期就是1ms,如果高电平出现时间是500毫秒,那么占空比就是50%
分辨率:最小能达到的占空比,如8位的PWM,理论的分辨率就是1:255(单斜率), 16位的的PWM理论就是1:65535(单斜率)。
单斜率/双斜率
假设一个PWM从0计数到80,之后又从0计数到80……. 这个就是单斜率。

假设一个PWM从0计数到80,之后是从80计数到0……. 这个就是双斜率。
理论基础
冲量相等而形状不同的窄脉冲加在具有惯性的环节上时,其效果基本相同。冲量指窄脉冲的面积。效果基本相同,是指环节的输出响应波形基本相同。低频段非常接近,仅在高频段略有差异。
面积等效原理:

在这里插入图片描述

分别将如图1所示的电压窄脉冲加在一阶惯性环节(R-L电路)上,如图2a所示。其输出电流i(t)对不同窄脉冲时的响应波形如图2b所示。从波形可以看出,在i(t)的上升段,i(t)的形状也略有不同,但其下降段则几乎完全相同。脉冲越窄,各i(t)响应波形的差异也越小。如果周期性地施加上述脉冲,则响应i(t)也是周期性的。用傅里叶级数分解后将可看出,各i(t)在低频段的特性将非常接近,仅在高频段有所不同。

在这里插入图片描述

用一系列等幅不等宽的脉冲来代替一个正弦半波,正弦半波N等分,看成N个相连的脉冲序列,宽度相等,但幅值不等;用矩形脉冲代替,等幅,不等宽,中点重合,面积(冲量)相等,宽度按正弦规律变化。SPWM波形——脉冲宽度按正弦规律变化而和正弦波等效的PWM波形。

在这里插入图片描述

如何实现PWM波形输出

1.可以直接通过芯片内部模块输出PWM信号,前提是这个I/O口要有集成模块,只需要简单几步操作即可,这种自带有PWM输出的功能模块在程序设计更简便,同时数据更精确。如下图,一般的IC口都会标明这个是否是PWM口;

在这里插入图片描述

2.如果内部没有PWM功能模块,或者功能要求不是很高的话,可以通过I/O口配置一些参数实现PWM信号输出。
这里用第二种方式。
假设我们要频率为f的PWM波形,那么算出f对应的周期t,然后用定时器定时时间间隔为t/nn是一个整数,如果需要占空比为 p%,那么就在中断子程序内设置,当计数到p*t/n以上次数时,输出高电平,反之低电平。
假设我们需要1000Hz的波形,那么周期就是1ms,我们可以用定时器设置时间间隔为0.01ms,中断100次就是1ms。在中断子程序内设置一个变量count用以计数,当count>=100时清零,当count>p时输出高电平。

代码如下

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
#include<reg52.h>

#define uchar unsigned char
#define uint unsigned int

uint num;
sbit PWM=P2^0;

void pre(){ //定时器初始化
EA=1;
ET0=1;
TR0=1;
TMOD=0x01;
TH0=0xff;
TL0=0xF7;
}

int main(){
pre();
while(1){
if(num>=100){ //控制周期
num=0;
}
if(num>50){ //控制占空比为50%
PWM=1;
}
else
{
PWM=0;
}
}
}

void time0() interrupt 1{ //定时器
TH0=0xff;
TL0=0xF7;
num++;
}