PWM寄存器映射
IR 中断寄存器。可以写IR来清除中断。可读取IR来识别8个中断源哪个被挂起 PWM1IR-0x4001 8000
TCR 定时器控制寄存器。TCR用于控制定时器计数器功能。定时器计数器可以通过TCR禁止或复位 PWM1TCP-0x4001 8004
TC 定时器计数器。32位的TC每经过PR+1个PCLK周期加1。TC通过TCR进行控制 PWM1TC-0x4001 8008
PR 预分频寄存器。TC每经过PR+1个PCLK周期加1 PWM1PR-0x4001 800C
PC 预分频计数器。32位的PC是一个计数器,它增加到与PR中保存的值时,TC加1,PC可以通过总线接口进行观察和控制 PWM1PC-0x4001 8010
MCR 匹配控制寄存器。MCR用于控制在匹配出现时是否产生中断和是否复位TC PWM1MCR-0x4001 8014
MR0 匹配寄存器0。MR0可通过MCR使能为在与TC匹配时复位TC、停止TC和PC和/或产生中断。此外,MR0和TC的匹配将清零单边沿模式或双边沿模式下的PWM,并置位双边沿模式下的PWM1输出 PWM1MR0-0x4001 8018
MR1 匹配寄存器1。MR1可通过MCR使能为在与TC匹配时复位TC、停止TC和PC和/或产生中断。此外,MR1和TC的匹配将清零单边沿模式或双边沿模式下的PWM1,并置位双边沿模式下的PWM2输出
MR2
MR3
CCR 捕获控制寄存器。CCR控制捕获输入的哪个边沿加载捕获寄存器以及是否在发生捕获时产生中断 PWM1CCR-0x4001 8028
CR0 捕获寄存器0。当在CAPn.0输入上有事件发生时,使用TC来加载CR0
CR1
CR2
CR3
MR4 匹配寄存器4。MR4可通过MCR使能为在与TC匹配时复位TC、停止TC和PC和/或产生中断。此外,MR4和TC的匹配将清零单边沿模式或双边沿模式下的PWM4,并置位双边沿模式下的PWM5输出
MR5
MR6
PCR PWM控制寄存器。它使能PWM输出并将PWM通道类型选择位单边沿或双边沿控制
LER 加载使能寄存器。使能新PWM匹配值的使用
CTCR 计数控制寄存器。CTCR在定时器和计数中选择一种模式,在计数器模式中设置要计数的信号或边沿
/////////////////////////////////////////////////////////////////////
PWM中断寄存器位描叙 PWM1IR-0x4001_8
000
PWMMR0中断 PWM匹配通道0的中断标志 bit0
PWMMR1中断 PWM匹配通道1的中断标志 bit1
PWMMR2中断 PWM匹配通道2的中断标志 bit2
PWMMR3中断 PWM匹配通道3的中断标志 bit3
PWMMR4中断 PWM匹配通道4的中断标志 bit8
PWMMR5中断 PWM匹配通道5的中断标志 bit9
PWMMR6中断 PWM匹配通道6的中断标志 bit10
#define MR0_INT 1 << 0
#define MR1_INT 1 << 1
#define MR2_INT 1 << 2
#define MR3_INT 1 << 3
#define MR4_INT 1 << 8
#define MR5_INT 1 << 9
#define MR6_INT 1 << 10
PWM定时器控制寄存器
PWM定时器控制寄存器PWM1TCR用来控制PWM定时器计数器的操作。
0 PWM定时器计数器和PWM预分频计数器使能计数
1 PWM定时器计数器和PWM预分频计数器在PCLK的下一个上升沿同步复位。计数器在TCR[1]恢复为0之前保持复位状态
2 NO
3 PWM 使能1
4...7 0 ,不应该是1
表25.8 匹配控制寄存器位描述(PWM1MCR-0x4001 8014)
PWMMR0I 1 PWMMR0与PWMTC的值相匹配时产生中断;0 中断禁止
PWMMR0R 1 PWMMR0与PWMTC的值相匹配时PWMTC复位 0 中断禁止
PWMMR0S 1 PWMMR0与PWMTC的值相匹配,将PWMTC和PWMPC停止,PWMTCR[0]复位为0
PWMMR1I 1 PWMMR1与PWMTC的值相匹配时产生中断;0 中断禁止
PWMMR1R 1 PWMMR1与PWMTC的值相匹配时PWMTC复位 0 中断禁止
PWMMR1S 1 PWMMR1与PWMTC的值相匹配,将PWMTC和PWMPC停止,PWMTCR[0]复位为0
PWMMR2I 1 PWMMR2与PWMTC的值相匹配时产生中断;0 中断禁止
PWMMR2R 1 PWMMR2与PWMTC的值相匹配时PWMTC复位 0 中断禁止
PWMMR2S 1 PWMMR2与PWMTC的值相匹配,将PWMTC和PWMPC停止,PWMTCR[0]复位为0
PWMMR3I 1 PWMMR3与PWMTC的值相匹配时产生中断;0 中断禁止
PWMMR3R 1 PWMMR3与PWMTC的值相匹配时PWMTC复位 0 中断禁止
PWMMR3S 1 PWMMR3与PWMTC的值相匹配,将PWMTC和PWMPC停止,PWMTCR[0]复位为0
PWMMR4I 1 PWMMR4与PWMTC的值相匹配时产生中断;0 中断禁止
PWMMR4R 1 PWMMR4与PWMTC的值相匹配时PWMTC复位 0 中断禁止
PWMMR4S 1 PWMMR4与PWMTC的值相匹配,将PWMTC和PWMPC停止,PWMTCR[0]复位为0
PWMMR5I 1 PWMMR5与PWMTC的值相匹配时产生中断;0 中断禁止
PWMMR5R 1 PWMMR5与PWMTC的值相匹配时PWMTC复位 0 中断禁止
PWMMR5S 1 PWMMR5与PWMTC的值相匹配,将PWMTC和PWMPC停止,PWMTCR[0]复位为0
PWMMR6I 1 PWMMR6与PWMTC的值相匹配时产生中断;0 中断禁止
PWMMR6R 1 PWMMR6与PWMTC的值相匹配时PWMTC复位 0 中断禁止
PWMMR6S 1 PWMMR6与PWMTC的值相匹配,将PWMTC和PWMPC停止,PWMTCR[0]复位为0
PWM启动:
/******************************************************************************
** Function name: PWM_Start
**
** Descriptions: Enable PWM by setting the PCR, PTCR registers
**
** parameters: channel number
** Returned value: None
**
******************************************************************************/
void PWM_Start( uint32_t channelNum )
{
if ( channelNum == 1 )
{
/* All single edge, all enable */
LPC_PWM1->PCR = PWMENA1 | PWMENA2 | PWMENA3 | PWMENA4 | PWMENA5 | PWMENA6;
LPC_PWM1->TCR = TCR_CNT_EN | TCR_PWM_EN; /* counter enable, PWM enable */
}
return;
}
//PWM停止:
/******************************************************************************
** Function name: PWM_Stop
**
** Descriptions: Stop all PWM channels
**
** parameters: channel number
** Returned value: None
**
******************************************************************************/
void PWM_Stop( uint32_t channelNum )
{
if ( channelNum == 1 )
{
LPC_PWM1->PCR = 0;
LPC_PWM1->TCR = 0x00; /* Stop all PWMs */
}
return;
}
//////////////////////////////////////脉宽调制器(PWM)//////////////////////////////////////////////
PCONP寄存器:控制所有外设是否可以使用,要使用到某个外设(比如:定时器0,1,2,3)时,要查看一下用户手册的PCON寄存器说明,看复位状态下,该外设是否可以使用。
PCONP寄存器允许将所有的外设功能关闭一实现节点的目的。这可通过关断特定外设模块的时钟源来实现。有少数外设功能不能被关闭(看门狗定时器、GPIO、管脚连接模块和系统控制模块)。某些外设,特别是包含模拟功能的外设可消耗功率,它们的操作无需时钟。这些外设包含独立的禁使能控制位,通过它们来关闭电路以降低功耗。
1)功率:在PCONP寄存器中置位PCPWM1
bit0 保留;bit1:PCTIM0 定时器/计数器0 功率/时钟控制位;bit2:PCTIM1 定时器/计数器1 功率/时钟控制位
bit3 PCUART0 UART0功率/时钟控制位 bit4 PCUART1 UART1功率/时钟控制位 bit5\bit6 保留
bit7:PCI2C0 I2C0接口功率/时钟控制位 bit8:PCSPI SPI 接口功率/时钟控制位 bit9:PCRTC RTC 功率/时钟控制位
bit10:PCSPI SSP 接口功率/时钟控制位 bit11:保留 bit12:PCAD A/D 转换器0 (ADC0) 功率/时钟控制位。
注:清零该位前先清零ADCR 寄存器的PDN 位,且该位应当在置位PDN前被置位 bit13...bit18 保留
bit19 PCI2C1 I2C1 接口功率/时钟控制位;bit20...bit27:保留;bit28:PCTIM2 定时器/计数器2 功率/时钟控制位
bit29:PCTIM3 定时器/计数器3 功率/时钟控制位;bit30..bit31:保留
注:复位时,PWM使能(PCPWM1=1)
2)外设时钟:在寄存器PCLK_SEL0中,选择PCLK_PWM1;(选择时钟)
3)引脚:通过寄存器PINSEL来选择PWM引脚。通过寄存器PINMODE来选择PWM1引脚模式
4)中断:有关匹配和捕获事件的内容请参考寄存器PWM1MCR和PWM1CCR。利用相应的中断置位使能寄存器来使能NVIC中的中断
PWM匹配控制寄存器:PWM匹配控制寄存器用来控制在PWM匹配寄存器与PWM定时器计数器匹配时所执行的操作。
(1)PWMMR0:此匹配寄存器控制着PWM的频率周期,它是所有PWM输出共用的,所以每增加一路PWM输出,实际只需要增加一个控制占空比的匹配寄存器。
PWMTCR:PWM定时器控制寄存器,控制PWM定时器计数器功能(禁止或复位)
PWMTC:PWM定时器计数器。为32bit计数器,技术频率为PCLK经过分频计数器后的频率值
PWMPR:PWM预分频控制寄存器,用于设定与分频值,为32位寄存器
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
定时器0初始化:
Void Time0Init(void)
{
T0PR=0;//设置预分频值
T0TC=0;//定时器设置为0
T0MCR=0x03;//设置匹配模式,复位并中断
T0MR0=Fpclk/10;//设置匹配值,0.1s
T0TCR=0x01;//启动定时器0
}
//
T0TC=0;//定时器设置为0
T0PR=0;//设置预分频值
while((IO0PIN&0x01)!+0x01));//等待引脚电平变低
T0TCR=0x01;//启动定时器0
while((IO0PIN&0x01)==0);//等待引脚电平变高
T0TCR=0x00;//关闭定时器0
time=T0TC;//读取定时器值,即为脉宽
//要求:将引脚P0.5设置为输出50%的方波,程序设置了MR1匹配后复位定时器,并且MAT0.1输出电平翻转
void MATOut(void)
{
PINSEL0=0x00000800;//设置引脚连接模块
T0TC=0;
T0PR=0;
T0MCR=0x02;//设置匹配后复位TC
T0EMR=0xC0;//设置匹配后MAT0.1输出翻转
T0MR1=5000;//输出频率周期控制
T0TCR=0x01;//启动定时器0
}
P0.19输出的波形占空比为50%,P0.20输出占空比为25%,
#include "config.h"
void Timer1Init(void)
{
T1TCR=0x02;//定时器0复位
T1PR=0;//不设时钟分频
PWM1CON=0x0c;//使能PWM输出
T1MCR=0x02;//设置T0MR0匹配后复位T0TC
T1MR0=Fpclk/2000;//设置PWM输出的周期
T1MR2=(Fpclk/2000)/2; //设置PWM1.2输出占空比为50%
T1MR3=((Fpclk/2000)/4)*3;//设置PWM1.3输出占空比为25%
T1TCR=0x01;//启动定时器0
}
单边沿输出:
使用两个匹配寄存器就可以实现单边沿控制的PWM输出,其中一个匹配寄存器PWMMR0控制PWM周期,另一个匹配寄存器控制
PWM边沿的位置,即占空比;
PWMMR0是所有PWM输出公用的,所以每增加一路PWM输出,实际上之需增加一个控制占空比的匹配寄存器。当PWMMR0发生匹配时,输出都变成高电平
PWM2双边沿控制输出:
void PWM2OUT(uint16 FREQ)//输出频率,单位Hz
{
PINSEL0 &=0xFFFF3FFF//设置引脚连接模块连接PWM1输出
PINSEL0 |=0x00008000;
PWMPCR=0x404;//设置PWM2双边沿输出
PWMMCR=0x02;//MR0匹配后复位定时器
PWMPR=0x00;//设置预分频值为0
PWMMR0=Fpclk/FREQ;//设置PWM周期
PWMMR1=PWMMR0/5;//设置前沿在周期为1/5处
PWMMR2=PWMMR1*2;//设置后沿在周期的2/5处
PWMLER=0x07;//使能PWM匹配锁存
PWMTCR=0x09;//使能PWM,启动定时器
}
图1是由异或门组成的双边沿(上升和下降)检测电路。异或门是在门输人端子逻辑不一致时输出“H”电平,如采用RC电路产生延迟时间,则在上升、下降时检测出边沿,得到微分脉冲输出。
图2是电容C的端子电压波形。74HC86的阈值电压VTH为VDD/2,在此处放人标记线。从对应输人上升开始,到达到C端子电压VTH之前的时间和从输人下降开始,到达到C端子电压yTH之前的时间都可得到输出脉冲。
从这种双边沿检测电路输出波形的时间轴看,频率变为输人频率的2倍,因此,此电路也可作为2倍频电路使用。
图1 上升/下降双边沿检测电路