zoukankan      html  css  js  c++  java
  • 2012.03.14(PWM)

    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 上升/下降双边沿检测电路

    上升/下降双边沿检测电路

  • 相关阅读:
    DynamicObject
    ABP文档
    ABP文档
    ABP文档
    ABP文档
    ABP文档
    ABP文档
    第1张 Maven简介 学习笔记
    lambda表达式10个示例——学习笔记
    对象在内存中初始化的过程?
  • 原文地址:https://www.cnblogs.com/itxiaocaiyidie/p/2351205.html
Copyright © 2011-2022 走看看