PWM或脉宽调制是一种调制矩形脉冲波宽度的技术,以获得产生的波的平均值的变化。该方法用于在固定频率下对脉冲宽度对应的数据进行编码。但PWM的主要应用是控制输出到负载的功率。通过在电源和负载之间以极高的速率(或取决于负载)切换电压来控制功率。
虽然单独提到了LPC214x系列mcu上的PWM引脚,但它是基于标准的定时器块。LPC2148中的PWM信号分为两类:单边PWM信号和双边PWM信号。在单棱脉宽调制的情况下,脉冲将总是在周期的开始或结束。根据边缘位置的不同,将单边缘PWM又分为后缘PWM和前缘PWM。
在尾缘PWM的情况下,脉冲在周期的开始是固定的,而尾缘的位置是变化的。在前缘PWM的情况下,脉冲在周期结束时是固定的,前缘的位置是可变的。
至于双刃PWM信号,脉冲可以放置在周期的任何位置,前缘或后缘都可以调制。
LPC2148具有基于7个匹配寄存器的6通道PWM块,能够生成6通道单棱PWM信号或3通道双棱PWM信号。LPC2148上的下列引脚用于产生PWM。
输出: | PWM1 | PWM2 | PWM3 | PWM4 | PWM5 | PWM6 |
销的名字: | P0.0 | P0.7 | P0.1 | P0.8 | P0.21 | P0.9 |
当我们讨论PWM输出时,我们实际上是指PWM匹配寄存器的输出,其中6个匹配寄存器固定在LPC2148上。因此,PWM1 - 6输出与PWM匹配寄存器1 - 6相关联。PWM匹配寄存器0不是固定在LPC2148上,而是用来控制PWM输出的占空比或周期。
请注意:为了选择引脚的PWM功能,我们需要设置PINSEL寄存器。PWM 1到4和PWM 6是使用PINSEL0寄存器设置的,PWM 5是使用PINSEL1设置的。
理解LPC2148中的PWM
假设PWM信号的周期为8毫秒。在适当的预刻度值的帮助下,PWM定时器计数器(PWM TC)被设置为每1毫秒增加一次。因此,PWM匹配寄存器0中的值,即PWMMR0必须为8。
下一步是当PWM TC的值达到PWMMR0的值时重置它,开始一个新的周期。
假设我们想要产生两个脉冲宽度分别为3毫秒和5毫秒的PWM输出。为此目的,让我们使用PWM1和PWM2,即PWMMR1和PWMMR2。根据要求,我们需要将PWMMR1指定为3,PWMMR2指定为5,即PWMMR1 = 3, PWMMR2 = 5。
在一个新的周期开始时,PWM1和PWM2引脚将默认设置为HIGH。当PWM TC中的值与PWMMR1或PWMMR2中的值匹配时,对应的引脚将被设置为LOW。引脚将保持LOW直到下一个周期开始。因此,输出的PWM引脚是单边PWM。
单边PWM输出规则
NXP Semiconductors (LPC系列mcu的制造商)在其LPC214x系列mcu的官方用户手册中列出了一些关于单边缘pwm的规则。
- 除非对应的匹配寄存器值为“0”,否则所有单边PWM引脚的输出在周期开始时将为HIGH。
- 当PWM TC达到匹配寄存器值时,相应的PWM输出变为LOW。如果PWM匹配寄存器中的值高于PWM的周期,则PWM将连续为HIGH。
在用户手册中也有关于双刃PWM输出的规则。
LPC2148中的PWM相关寄存器
现在我们将看到LPC2148中与PWM相关的寄存器列表。
PWM定时器控制寄存器(PWMTCR): PWM定时器控制寄存器用于控制PWM定时器计数器。这个定时器计数器是特定于PWM块。PWMTCR寄存器中的位0用于启用或禁用PWM块中的计数器。当该位为1时,PWM TC和PWM预刻度计数器被启用。当此位为0时,两者都被禁用。位1用于重置PWM TC和PWM预刻度计数器。位3用于启用或禁用PWM模式。
PWM预刻度寄存器(PWMPR): PWM预刻度寄存器用于设置PWM输出的分辨率。PWM TC将增加每一个PWMPR + 1 PCLK周期。
PWM匹配寄存器(PWMMR0 - PWMMR6):每个PWM匹配寄存器与每个PWM引脚相关联,即PWM 1到PWM 6分别与PWMMR1到PWMMR6相关联。将PWM匹配寄存器中的值与PWM TC中的值进行比较。
PWM匹配控制寄存器(PWMMCR): PWM匹配控制寄存器用于控制当PWM匹配寄存器和PWM TC寄存器中的值相同时可以执行的操作。每个匹配寄存器有三个位,即PWMMR0的位0、位1和位2,PWMMR1的位3、位4和位5,等等。如果我们考虑的是PWMMR0,那么PWMMCR中的第0位用于使能中断,第1位用于重置PWM TC,第2位用于停止PWM TC和PWM PC。
PWM中断寄存器(PWMIR): PWM中断寄存器是基于PWM匹配寄存器来识别中断的。PWMIR中有7位对应7个PWM匹配寄存器中断。当中断发生时,PWMIR寄存器中的相应位被设置为HIGH。如果手动将位设置为HIGH,则会重置中断。
在PWMIR | 相应的匹配寄存器 |
位0 | PWMMR0 |
位1 | PWMMR1 |
位2 | PWMMR2 |
位3 | PWMMR3 |
位8 | PWMMR4 |
位9 | PWMMR5 |
10位 | PWMMR6 |
PWM锁存使能寄存器:当使用PWM匹配寄存器来生成脉宽调制信号, PWM闩锁使能寄存器用于控制其更新。当PWM激活时,当PWM匹配寄存器的值被更新时,这些值将存储在一个影子寄存器中。当PWMMR0寄存器上发生事件时,只有当PWMLER中的相应位设置为1时,值才会从影子寄存器转移到匹配寄存器。
PWM控制寄存器(PWMPCR): PWM控制寄存器用来使能或禁用PWM输出,也可以选择PWM的模式,即单边或双边。PWMPCR寄存器中的第2位到第6位用于将PWM输出设置为PWM2到PWM6的单边缘或双边缘。位9 ~位14分别用于使能PWM1 ~ PWM6输出或使能PWM1 ~ PWM6输出。
在LPC2148中配置PWM
从上面我们看到的PWM相关寄存器列表中,很明显,配置PWM将类似于LPC2148中的定时器。我们需要做的其他事情是使能PWM输出和选择相应引脚的PWM函数。在配置PWM之前,我们需要使用预刻度值计算PWM的分辨率。
PWM块从60mhz的外围时钟(PCLK)中获得时钟。所以,得到一个时间需要PCLK运行为“X”时钟周期在60兆赫是
X / (60 * 10^6)
如果考虑预尺度,则X = PR + 1。因此,当我们考虑预缩放值为59时,我们得到的延迟为
延时=(59 + 1)/(60 * 10^6)= 1微秒(1µS)。
类似地,如果我们将PR设置为59999,那么我们得到的延迟为
延迟=(59999 + 1)/(60 * 10^6)= 1毫秒(1 mS)。
现在我们已经了解了PWM的预刻度计算,接下来我们将了解需要遵循的步骤,以便初始化PWM。
- 首先我们需要做的是使用PINSEL0和PINSEL1寄存器设置相应引脚的PWM功能。
- 接下来,我们需要选择PWM的模式,即使用PWMPCR寄存器的单边缘或双边缘。默认设置为单边PWM。
- PWM的分辨率由预刻度值定义,设置为预刻度寄存器。
- PWM信号的周期率,即PWM信号的周期是使用PWMMR0寄存器设置的。
- PWM输出的脉冲宽度是使用匹配寄存器设置的,例如PWMMR1到PWMMR6。
- 操作,如重置PWM TC,中断等设置为PWMMR0匹配使用的PWMMCR寄存器。
- 下一个重要步骤是使用PWMLER寄存器将Latch Enable位设置为相应的匹配寄存器。
- 接下来,我们需要启用PWM输出。为此,我们需要使用PWMPCR寄存器。
- 同样,我们需要重置PWM定时器。要重置计时器,我们需要使用PWMTCR寄存器。
- 我们需要做的最后一件事是启用PWM定时器计数器和PWM模式。为此,我们必须再次使用PWMTCR寄存器。
LPC2148中的PWM示例程序
现在我们将在LPC2148中看到一个实时的PWM生成示例。在本例中,我们将通过PWM功能控制发送到LED的功率,即LED的调光操作。为此,我们假设一个LED连接到提供PWM5输出的P0.21。此外,根据我们用于演示的开发板,四个按钮连接到P0.15, P0.16, P1.16和P1.17引脚。
# include < lpc214x.h >
int main ()
{
PINSEL0= 0 x00000000;// PORT0的P0.0到P0.15引脚作为GPIO
PINSEL1 = 0 x00000400;// P0.21 PORT0引脚为PWM
PINSEL2 = 0 x00000000;// PORT1的P1.16 ~ P1.31引脚作为GPIO
/*配置锁相环块,并设置CCLK和PCLK在60 MHz */
PLL0CON = 0 x01;
PLL0CFG = 0 x24;
PLL0FEED = 0 xaa;
PLL0FEED = 0 x55;
而(!(PLL0STAT & 0 x00000400));
PLL0CON = 0 x03;
PLL0FEED = 0 xaa;
PLL0FEED = 0 x55;
VPBDIV = 0 x01;
/*设置并初始化PWM块*/
PWMPCR = 0 x00;//单侧PWM模式
PWMPR = 60000 - 1;// PWM的分辨率设置为1ms
PWMMR0 = 10;// PWM周期为10ms
PWMMR5 = 1;// PWM5的脉宽为1ms
PWMMCR = (1 < < 1);//匹配PWMMR0时重置PWMTC
PWMLER = (1 < < 5) | (1 < < 0);//更新匹配寄存器PWMMR0和PWMMR5
PWMPCR = (1 < < 13);//打开PWM5输出
PWMTCR = (1 < < 1);//重置PWM TC和PWM PR
PWMTCR = (1 < < 0) | (1 < < 3);//使能PWM定时器计数器和PWM模式
而(1)
{
如果(!((IO0PIN) &(1<<15))) //检查P0.15
{
PWMMR5 = 1;
PWMLER = (1 < < 5);// PWMMR5的Update Latch Enable位
}
Else if (!((IO0PIN) &(1<<16))) //检查P0.16
{
PWMMR5 = 2;
PWMLER = (1 < < 5);
}
else if (!((IO1PIN) &(1<<16))) //检查P1.16
{
PWMMR5 = 4;
PWMLER = (1 < < 5);
}
else if (!((IO1PIN) &(1<<17))) //检查P1.17
{
PWMMR5 = 8;
PWMLER = (1 < < 5);
}
}
/ /返回0;
}