首页

LPC2148 PWM编程

PWM或脉宽调制是一种调制矩形脉冲波宽度的技术,以获得产生的波的平均值的变化。该方法用于在固定频率下对脉冲宽度对应的数据进行编码。但PWM的主要应用是控制输出到负载的功率。通过在电源和负载之间以极高的速率(或取决于负载)切换电压来控制功率。

虽然单独提到了LPC214x系列mcu上的PWM引脚,但它是基于标准的定时器块。LPC2148中的PWM信号分为两类:单边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;

留下一个回复

您的电邮地址将不会公布。

Electronicshub图标
Baidu
map