风筝
发表于: 2019-3-7 22:26:44 | 显示全部楼层

脉冲宽度调制(PWM)是一种功能强大的技术,通过保持频率恒定来改变脉冲宽度。该技术目前在许多控制系统中使用。 PWM的应用不受限制,它被广泛应用于电机速度控制、测量、功率控制和通信等。在PWM技术中,可以使用数字信号轻松生成模拟输出信号。本篇文章将帮助您了解PWM,其术语以及如何使用微控制器实现它。在本文中,我们将通过改变LED的强度来演示使用AVR Atmega16微控制器的PWM。


AVR微控制器Atmega16中的PWM引脚

Atmega16有四个专用PWM引脚。这些引脚是PB3(OC0)、PD4(OC1B)、PD5(OC1A)、PD7(OC2)。

PWM-Pins-of-AVR-Microcontroller-Atmega16.png

Atmega16还有两个8位定时器和一个16位定时器。 Timer0和Timer2是8位定时器,而Timer1是16位定时器。为了生成PWM,我们必须先了解定时器,因为定时器用于生成PWM。我们知道频率是定时器运行的每秒周期数。因此,较高的频率将为我们提供更快的计时器。在生成PWM时,更快的PWM频率将更好地控制输出,因为它可以更快地响应新的PWM占空比。


在本篇Atmega16 PWM教程中,我们将使用Timer2。您可以选择任何占空比。如果您不知道PWM中的占空比是什么,那么让我们简单地讨论一下。


什么是PWM信号?

脉冲宽度调制(PWM)是一种数字信号,最常用于控制电路。信号保持高电平的时间称为“接通时间”,信号保持低电平的时间称为“断开时间”。如下所述,PWM有两个重要参数:


PWM的占空比

PWM信号保持高电平(导通时间)的时间百分比称为占空比。


与100ms脉冲信号一样,如果信号为高电平持续50ms,低电平持续50ms,则表示脉冲为有一半时间为高电平以及另一半时间为低电平。所以我们可以说占空比是50%。类似地,如果在100ms时间内,脉冲处于25ms的HIGH状态并且75ms处于LOW状态,则占空比将为25%。请注意,我们只计算HIGH状态的持续时间。您可以参考下面的图片更好的理解。那么占空比的公式是:

  1. Duty Cycle (%) = On Time/(On Time + Off Time)
复制代码

pulse-width-modulation-duty-cycle.gif

因此,通过改变占空比,我们可以改变PWM的宽度,从而导致LED亮度的变化。我们将演示使用不同的占空比来控制LED的亮度。选择占空比后,下一步将选择PWM模式。


PWM模式指定您希望PWM如何工作。主要有3种PWM模式。这些如下:

1.   快速PWM

2.   相位修正PWM

3.   相位和频率校正PWM


在相位变化无关紧要的情况下使用快速PWM。通过使用快速PWM,我们可以快速输出PWM值。在相位变化影响电机控制等操作的地方不能使用快速PWM,因此在这种应用中使用其他PWM模式。由于我们将控制LED的亮度,相位变化不会对其产生太大影响,因此我们将使用快速PWM模式。


现在要生成PWM,我们将控制内部定时器计数,然后在特定计数时设置回零,这样定时器将计数,然后一遍又一遍地重新设置为零。这设定了周期。我们现在可以选择控制脉冲,在定时器上升时以特定计数开启脉冲。当计数器返回0时,关闭脉冲。这有很多灵活性,因为您可以随时访问计时器的计数并使用单个计时器提供不同的脉冲。当您想要同时控制多个LED时,这非常棒。现在让我们开始将一个LED与Atmega16接口连接到PWM。


所需的组件

●    Atmega16 AVR微控制器

●    16Mhz晶体振荡器

●    按钮

●    跳线

●    面包板

●    USBASP v2.0


电路原理图

Circuit-Diagram-for-using-PWM-with-AVR-Microcontroller-Atmega16.png

我们使用OC2作为PWM,即Pin21(PD7)。因此,在Atmega16的PD7引脚上连接一个LED。

Circuit-Hardware-for-using-PWM-with-AVR-Microcontroller-Atmega16.jpg


编程Atmega16用于PWM

在本文的末尾处给出了完整的程序。使用JTAG和Atmel studio在Atmega16中烧录程序,查看LED上的PWM效果。由于PWM的占空比不同,其亮度会缓慢增加和减少。


通过设置Timer2寄存器开始编程Atmega16。 Timer2寄存器位如下所示,我们可以相应地设置或复位位。

Atmega16-Registers.png


现在我们将讨论Timer2的所有位,以便我们可以使用编写的程序获得所需的PWM。


Timer2寄存器主要有四个部分:

●    FOC2(Timer2的强制输出比较):当WGM位指定非PWM模式时,FOC2位置1。

●    WGM2(Timer2的波生成模式):这些位控制计数器的计数序列,最大(TOP)计数器值的来源以及要使用的波形生成类型。

●    COM2(比较Timer2的输出模式):这些位控制输出行为。完整的位描述解释如下。

  1. TCCR2 |= (1<<WGM20)|(1<<WGM21);
复制代码

将WGM20和WGM21位设置为高电平以激活PWM快速模式。 WGM代表波形生成模式。选择位如下。

WGM00
WGM01
Timer2模式操作
0
0
正常模式
0
1
CTC(比较匹配时清除定时器)
1
0
PWM,相位校正
1
1
快速PWM模式

有关波形生成模式的更多详细信息,请参阅Atmega16的官方数据表

  1. TCCR2 |=(1<<COM21)|(1<<CS20)|(0<<CS21)|(0<<CS22);
复制代码

我们还没有使用任何预分频,因此我们将时钟源寄存器设置为'001'。


将占空比从0%增加到100%,因此亮度会随着时间的推移而增加。取值0-255并将其发送到OCR2引脚。

  1. for(duty=0; duty<255; duty++)   // 0 to max duty cycle
  2. {
  3. OCR2=duty;     //slowly increase the LED brightness
  4. _delay_ms(10);
  5.        }
复制代码

同样将占空比从100%降低到0%,逐渐降低LED的亮度。

  1. for(duty=0; duty>255; duty--)   // max to 0 duty cycle
  2. {
  3. OCR2=duty;     //slowly decrease the LED brightness
  4. _delay_ms(10);
  5.   }
复制代码

PWM-with-AVR-Microcontroller-Atmega16.jpg

以上就是我们在Atmega16 / 32中使用PWM的全部内容。


本文使用的完整代码: main.rar (566 Bytes, 下载次数: 27)

跳转到指定楼层
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

主题 32 | 回复: 41



手机版|

GMT+8, 2024-4-25 18:24 , Processed in 0.045534 second(s), 8 queries , Gzip On, MemCache On. Powered by Discuz! X3.5

YiBoard一板网 © 2015-2022 地址:河北省石家庄市长安区高营大街 ( 冀ICP备18020117号 )

快速回复 返回顶部 返回列表