Arduino与Proteus仿真实例-使用计时器实现PWM仿真

使用计时器实现PWM仿真

1、什么是PWM

PWM(Pulse Width Modulation)称为脉冲宽度调制。PWM 是一种根据给定频率和占空比振荡的数字(即方波)信号。

  • 频率(以赫兹表示)描述了输出脉冲重复的频率。
  • 周期是每个周期所花费的时间,是频率的倒数。
  • 占空比(以百分比表示)描述了该频率窗口内的脉冲宽度。

在这里插入图片描述

PWM使用矩形脉冲波,其脉宽被调制导致波形平均值的变化。 如果我们考虑一个脉冲波形

f

(

t

)

{f(t)}

f(t),周期为

T

T

T,低值

y

m

i

n

{y_{min}}

ymin​,高值

y

m

a

x

{y_{max}}

ymax​和占空比

D

D

D,如下图所示,波形的平均值为:

在这里插入图片描述

生成的波形如下图所示:

在这里插入图片描述

由于

f

(

t

)

f(t)

f(t)是一个脉冲波,因此

y

m

a

x

y_{max}

ymax​的取值范围为

0

<

t

<

D

×

T

0 < t < D \times T

0<t<D×T,

y

m

i

n

y_{min}

ymin​的取值范围为

D

×

T

<

t

<

T

D \times T < t < T

D×T<t<T,上面的表达式可以推导为:

在这里插入图片描述

因此,信号的的平均值

y

\over{y}

y​直接取决于占空比

D

D

D。那么占空比D如何计算呢?

假设一个脉冲周期由一个 ON 周期 (5V) 和一个 OFF 周期 (0V) 组成。 信号在一段时间内开启的部分称为占空比,即该频率窗口内的脉冲宽度。

在这里插入图片描述

例如,一个周期为 10ms 的脉冲将保持 ON(高)2ms。因此,占空比将为:




D

2


m


s


/


10


m


s

20

D = 2ms / 10ms = 20%

D=2ms/10ms=20

通过 PWM 技术,我们可以使用 ON-OFF 信号来控制输送到负载的功率。 PWM 信号可用于控制直流电机的速度和改变 LED 的亮度。不同占空比的脉宽调制信号如下图所示:

在这里插入图片描述

Arduino可以提供05v范围的信号,通过analogWrite(pin, value)函数实现,其中 参数value为占空比,其取值范围为0255,对应的电压范围为0-5V 。

在这里插入图片描述

Arduino UNO提供了6个PWM端口,如下图所示:

在这里插入图片描述

Timer output Arduino output Chip pin Pin name
OC0A 6 12 PD6
OC0B 5 11 PD5
OC1A 9 15 PB1
OC1B 10 16 PB2
OC2A 11 17 PB3
OC2B 3 5 PD3

2、仿真电路原理图

在这里插入图片描述

3、仿真代码实现

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
int x, y;
int steps = 1023;
int inc = 102;

void setup(){

cli();
TCCR1A = B10100010;
TCCR1B = B00011001;
ICR1 = steps;
sei();

pinMode(10,OUTPUT);
x = steps;
y = 0;
}

void loop(){
x += inc;
if (x > steps) x = 0;
y -= inc;
if (y < 0) y = steps;

OCR1A = x;
OCR1B = y;

delay (50);
}

4、仿真结果

在这里插入图片描述

文章来源: https://iotsmart.blog.csdn.net/article/details/120842114