脉冲宽度调制(PWM)是一项强大的技术,其中通过保持频率恒定来更改脉冲宽度。如今,该技术已在许多控制系统中使用。 PWM的应用不受限制,并且被广泛用于诸如电动机速度控制,测量,功率控制和通信等应用中。在PWM技术中,人们可以容易地使用数字信号生成模拟输出信号。本教程将帮助您理解PWM,其术语以及如何使用微控制器实现它。在本教程中,我们将通过改变LED的强度来演示AVR Atmega16微控制器的PWM。
要详细了解PWM的基础知识,请转到我们以前有关各种微控制器的PWM的教程:
- ARM7-LPC2148 PWM教程:控制LED的亮度
- 使用MSP430G2的脉冲宽度调制(PWM):控制LED的亮度
- 使用带有MPLAB和XC8的PIC单片机生成PWM
- STM32F103C8中的脉冲宽度调制(PWM):直流风扇的控制速度
- 在PIC微控制器的GPIO引脚上生成PWM信号
- Raspberry Pi PWM教程
AVR微控制器Atmega16中的PWM引脚
Atmega16具有四个专用的PWM引脚。这些引脚是PB3(OC0),PD4(OC1B),PD5(OC1A),PD7(OC2)。
也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的高电平状态,而75ms的低电平状态,则占空比为25%。请注意,我们仅计算HIGH状态的持续时间。您可以参考下图进行视觉理解。占空比的公式为
占空比(%)=接通时间/(接通时间+断开时间)
因此,通过改变占空比,我们可以改变PWM的宽度,从而导致LED亮度的改变。我们将演示如何使用不同的占空比来控制LED的亮度。查看本教程末尾的演示视频。
选择占空比后,下一步将是选择PWM模式。PWM模式指定您希望PWM如何工作。PWM模式主要有3种类型。这些如下:
- 快速PWM
- 相位校正PWM
- 相位和频率校正PWM
在相位变化无关紧要的地方使用快速PWM。通过使用快速PWM,我们可以快速输出PWM值。在相变影响操作(例如电机控制)的情况下不能使用快速PWM,因此在此类应用中使用其他PWM模式。由于我们将控制相变不会受到太大影响的LED亮度,因此我们将使用快速PWM模式。
现在要生成PWM,我们将控制内部计时器递增计数,然后在特定计数处重新设置为零,因此计时器将递增计数,然后一遍又一遍地重新设置为零。设定时间。现在,我们可以选择控制脉冲,并在定时器上升时以特定计数将脉冲打开。当计数器回到0时,请关闭脉冲。这具有很大的灵活性,因为您始终可以访问计时器的计数,并通过单个计时器提供不同的脉冲。当您要一次控制多个LED时,这非常好。现在,让我们开始将一个LED与Atmega16进行PWM接口。
在此处检查所有与PWM相关的项目。
所需组件
- Atmega16 AVR微控制器IC
- 16Mhz晶体振荡器
- 两个100nF电容器
- 两个22pF电容器
- 按钮
- 跳线
- 面包板
- USBASP v2.0
- 2个LED(任何颜色)
电路原理图
我们将OC2用于PWM,即Pin21(PD7)。因此,在Atmega16的PD7引脚上连接一个LED。
为PWM编程Atmega16
完整的程序如下。 使用JTAG和Atmel studio在Atmega16中刻录该程序,并查看LED上的PWM效果。由于PWM占空比的变化,其亮度将缓慢增加和减小。检查最后给出的视频。
通过设置Timer2寄存器开始对Atmega16进行编程。Timer2寄存器的位如下,我们可以相应地设置或复位位。
现在我们将讨论Timer2的所有位,以便可以使用编写的程序获得所需的PWM。
Timer2寄存器主要有四个部分:
FOC2(定时器2的强制输出比较):当WGM位指定非PWM模式时,FOC2位置1。
WGM2(Timer2的波形产生模式):这些位控制计数器的计数顺序,最大(TOP)计数器值的来源以及要使用的波形产生类型。
COM2(Timer2的比较输出模式):这些位控制输出行为。完整的位描述在下面说明。
TCCR2-=(1 <
将WGM20和WGM21位设置为高电平可激活PWM快速模式。WGM代表波形生成模式。选择位如下。
WGM00 |
WGM01 |
Timer2模式操作 |
0 |
0 |
正常模式 |
0 |
1个 |
CTC(比较匹配时清除计时器) |
1个 |
0 |
PWM,相位校正 |
1个 |
1个 |
快速PWM模式 |
有关波形生成模式的更多详细信息,请参考Atmega16的官方数据表。
TCCR2-=(1 <
另外,我们还没有使用任何预缩放功能,因此我们将时钟源寄存器设置为001。
时钟选择位如下:
CS22 |
CS21 |
CS20 |
描述 |
0 |
0 |
0 |
无时钟源(定时器/计数器停止) |
0 |
0 |
1个 |
clk T2S /(无预缩放) |
0 |
1个 |
0 |
Clk T2S / 8(来自预分频器) |
0 |
1个 |
1个 |
Clk T2S / 32(来自预分频器) |
1个 |
0 |
0 |
Clk T2S / 64(来自预分频器) |
1个 |
0 |
1个 |
Clk T2S / 128(来自预分频器) |
1个 |
1个 |
0 |
Clk T2S / 256(来自预分频器) |
1个 |
1个 |
1个 |
Clk T2S / 1024(来自预分频器) |
通过将COM21位设置为“ 1”并将COM20位设置为“ 0”,也可以在比较匹配时清除OC2。
下面给出了快速PWM模式的比较输出模式(COM)选择选项:
COM21 |
COM21 |
描述 |
0 |
0 |
正常端口操作,OC2断开连接。 |
0 |
1个 |
已预留 |
1个 |
0 |
比较匹配时清除OC2,将OC2设置为TOP |
1个 |
1个 |
将OC2设置为比较匹配,将TOP处的OC2清除 |
将占空比从0%增加到100%,这样亮度会随着时间的推移而增加。取0-255之间的值,并将其发送到OCR2引脚。
for(duty = 0;占空比<255; duty ++)// 0到最大占空比 { OCR2 = duty; //缓慢增加LED的亮度 _delay_ms (10); }
同样,将占空比从100%降低到0%,以逐渐降低LED的亮度。
for(占空比= 0;占空比> 255;占空比-)//占空比最大为0 { OCR2 = duty; //缓慢降低LED亮度 _delay_ms (10); }
至此,我们完成了有关在Atmega16 / 32中使用PWM的教程。