Edit online

计数器功能模块

Read time: 4 minute(s)

计数时钟

计数器的时钟 EPWM_CNT_CLK 由 SYS_CLK 进行分频得出:

EPWM_CNT_CLK = SYS_CLK / (Divisor1 * Divisor2)
  • Divisor1/2 为寄存器 EPWM_CLK_DIV1/2。
    • 除数 Divisor1 的可配置范围为 1/ 2/ 4/ 6/ 8/ 10/ 12/ 14。
    • 除数 Divisor2 的可配置范围为 1/ 2/ 4/ 8/ 16/ 32/ 64/ 128。
  • 开启 EPWM 计数器的计数,需使能全局的控制信号 EPWM_CNT_GLB_EN。

计数方式

寄存器字段 EPWM_CNT_MOD ,可以配置计数器的以下计数方式:
  • 递增计数:计数器从 0 开始递增计数,计数至 EPWM_CNT_PRDV 值时,完成一个周期的计数,并且复位至 0 重新开始计数。
    计数器递增计数图示 中,设置 EPWM_CNT_PRDV = 6 的递增计数,此时开始从 0 到 6 的递增计数:
    • 在计数值为 0 时,信号 EPWM_CNT_Z = 1
    • 在计数值为 EPWM_CNT_PRDV 的时候,信号 EPWM_CNT_PRD = 1
    • 而指示计数方向的信号 EPWM_CNTD 一直为高电平,指示为递增计数。


    1. 计数器递增计数图示
  • 递减计数:计数器从 EPWM_CNT_PRDV 开始递减计数,计数至 0 时,完成一个周期的计数,并且复位至 EPWM_CNT_PRDV 重新开始计数。
    计数器递减计数图示中,设置 EPWM_CNT_PRDV = 6 的递减计数,此时进行从 6 到 0 递减计数:
    • 在计数值为 0 的时候,信号 EPWM_CNT_Z = 1。
    • 在计数值为 EPWM_CNT_PRDV 的时候,信号 EPWM_CNT_PRD = 1。
    • 指示计数方向的信号 EPWM_CNTD 一直为低电平,指示为递减计数。


    2. 计数器递减计数图示
  • 先递增后递减计数:计数器从 0 开始递增计数,计数至 EPWM_CNT_PRDV 后进行递减计数,当计数器计数为 1,完成一个周期的计数。下一个周期继续从 0 开始进行先递增后递减计数。
    计数器先递增后递减计数示例中,设置 EPWM_CNT_PRDV = 6 的先递增再递减计数,此时进行先从 0 到 6 的递增计数再从 6 到 0 的递减计数:
    • 在计数值为 0 的时候,信号 EPWM_CNT_Z = 1。
    • 在计数值为 EPWM_CNT_PRDV 的时候,信号 EPWM_CNT_PRD = 1。
    • 指示计数方向的信号 EPWM_CNTD 在前半周期为高电平指示此时为递增计数,后半周期指示为递减计数。


    3. 计数器先递增后递减计数示例

计数比较

在计数数值达到预设的设定值时,即达到 EPWM_CNT_AV 与 EPWM_CNT_BV 时,计数器可以产生相应的信号 EPWM_CNT_A 与 EPWM_CNT_B。

为了区分计数的方向:
  • 若为递增计数至 EPWM_CNT_AV 产生的信号,记为 EPWM_CNT_UA。
  • 若为递减计数至 EPWM_CNT_AV 产生的信号,记为 EPWM_CNT_DA。
  • 若为递增计数至 EPWM_CNT_BV 产生的信号,记为 EPWM_CNT_UB。
  • 若为递减计数至 EPWM_CNT_BV 产生的信号,记为 EPWM_CNT_DB。

产生的信号输出至 EPWM 生成模块以及 Trigger & Interrupt 模块使用。具体时序图如下:



4. 递增计数产生比较信号示例


5. 递减计数产生比较信号示例


6. 先递增后递减计数产生比较信号示例

计数同步

计数器具有同步的功能,同步信号的使能后,可以使得计数器计数值跳至 EPWM_CNT_PHV 计数同步相位寄存器的数值。

计数器同步信号的来源有两个:
  • IN_SYNC,对于 EPWM 子模块,是外部输入信号,各个 EPWM 子模块的 IN_SYNC 的信号来源可参考同步信号网络示例
  • SW_SYNC,为 EPWM 模块通过寄存器设置 EPWM_SW_FRC_SYNC 位而产生,即由软件控制产生。
  • IN_SYNC 与 SW_SYNC 的信号经过或逻辑后,决定计数器的同步。
  • ETRG0、ETRG1 均可作为相位同步的触发信号,如同步输出信号源所示。

计数器还会产生输出的同步信号 OUT_SYNC,通过寄存器设置可以选择不同的信号作为 OUT_SYNC。同步输出信号源 中展示了 OUT_SYNC 的来源。



7. 同步输出信号源
EPWM 模块利用输入同步信号以及输出同步信号,将所有子模块 EPWM0/1/.../11 进行计数器的相位同步。同步信号网络示例 展示了各个模块的同步连接方式。
  • EPWM0/3/6/9 以及 CAP0 的输出同步信号通过 GPIO_MUX 输出给外部器件,并且进行脉冲的 8*SYS_CLK 的长度延长
  • CPM0_COH 以及 CPM1_COH 分别为 CPM0 和 CPM1 输出的比较信号。


8. 同步信号网络示例

寄存器更新

寄存器 EPWM_CNT_PRDV、EPWM_CNT_AV 以及 EPWM_CNT_BV 支持以下更新模式,且各有独立控制的更新模式的控制位。

  • 立即更新模式:
    • 对寄存器 EPWM_CNT_PRDV、EPWM_CNT_AV 以及 EPWM_CNT_BV 的数值写入,会立即生效,从而影响当前的 EPWM 生成。
    • 可能出现在当前的周期,新写入的数值与计数器的数值错过比较时刻,导致 AV 和 BV 的动作未发生,进而造成当前周期的输出 EPWM 占空比异常,例如 100% 或 0% 占空比。
    • 通过设置寄存器字段 EPWM_CMPA_IMD_UPDT_PULSE_EN = 1、EPWM_CMPB_IMD_UPDT_PULSE_EN = 1,可以避免立即更新带来的错误 EPWM 输出。举例如下图所示,CMPA 的更新采用立即更新,假设 EPWM_A 的输出在 EPWM_CNT_Z 点的动作为拉高动作,而在 EPWM_CNT_DA 的动作为拉低动作,在下图的 T0 时刻,计数器的数值为 8,而此时发生 CMPA 的数值修改,从 5 配置成 10。在 CMPA_IMD_UPDT_PULSE_EN = 0 的情况下(即下图的 Case1),那么 EPWMA 的输出就会持续拉高没有进行拉低的动作;而在 CMPA_IMD_UPDT_PULSE_EN = 1 的情况下(即下图的 Case2),EPWM 会在 T0 的时刻进行输出的拉低动作,避免了出现输出 100%占空比的情况。

  • 影子寄存器更新模式:
    • 对寄存器 EPWM_CNT_PRDV、EPWM_CNT_AV 以及 EPWM_CNT_BV 的数值的写入,暂时存入各自的影子寄存器,不会立即生效,只有当计数器计数值到指定加载点时才进行更新,影子寄存器的数值生效。
    • EPWM_CNT_BV 影子寄存器更新示例中,当对 EPWM_CNT_BV 的数值进行写操作,将数值从 0x2 改变为 0x4 后,并没有立即生效,而是在计数值复位至 0 开始下一个周期的计数后,EPWM_CNT_BV 的数值才生效,从而改变了 EPWM 信号的占空比。


    9. EPWM_CNT_BV 影子寄存器更新示例
  • 多寄存器在同一时刻更新模式:

    通过 EPWM_GLB_CTL 寄存器选择更新时刻,EPWM_GLB_CFG 寄存器选择需要全局更新的寄存器(如下所示),那么即可以实现在同一时刻对下述的并选中的寄存器,进行同时更新寄存器数值的功能。

    • EPWM_CNT_PRD
    • EPWM_CNT_CMPA
    • EPWM_CNT_CMPB
    • EPWMA_ACT
    • EPWMB_ACT
    • EPWM_ACT_SW_CT
    • EPWM_DB_CTL
    • EPWM_CNT_CMPC
    • EPWM_CNT_CMPD
    • HRPWM_VAL
    • HRPWM_PRD_VAL
    • EPWM_RE_DZCTL
    • EPWM_FE_DZCTL
  • 多个 EPWM 模块寄存器同时更新

    EPWM 支持将寄存器链接到其它 EPWM,实现多个 EPWM 同时更新寄存器,支持的链接的寄存器如下所示。现在若需实现 EPWM0 和 EPWM1 的 EPWM_CNT_AV 的寄存器同时修改,只需通过配置寄存器 EPWM_LINK_CTL,将 EPWM1 的 EPWM_CNT_AV 链接到 EPWM0,那么在 EPWM0 修改寄存器 EPWM_CNT_AV 的时候,硬件也会自动对 EPWM1 的 EPWM_CNT_AV 寄存器进行修改。

    • EPWM_CNT_PRD
    • EPWM_CNT_CMPA
    • EPWM_CNT_CMPB
    • EPWM_RE_DZCTL
    • EPWM_FE_DZCTL
    • EPWM_CLB_CTL2
    • HRPWM_PRD_VAL

计数器单次计数模式

单次计数模式,通过寄存器 EPWM_CNT_SIG_EN = 0x1 设置,单次计数的方式如下:

  • 如果是递增计数的方式,从 0 开始递增计数,计数至 EPWM_CNT_PRD 后,计数器不会继续计数,计数器数值维持 EPWM_CNT_PRD。
  • 如果是递减计数的方式,从 EPWM_CNT_PRD 开始递减计数,计数至 0 后,计数器不会继续计数,计数器数值维持 0。
  • 如果是先递增后递减计数的方式,从 0 开始递增计数,计数至 EPWM_CNT_PRD 后,递减计数到 0,然后不再计数,计数器数值维持 0。

计数器计数复位

计数器在连续计数模式和单次计数模式下,均支持计数器的复位,复位信号为 EPWM_ETRG0/1 和软件复位信号。(其中 EPWM_ETRG0/ 1 信号的说明请查阅EPWM 外部触发信号

连续计数模式下,计数器的复位情况如下:



单次计数模式下,计数器的复位情况可通过寄存器选择以下触发类型:
  • 可重复触发(寄存器 EPWM_CNT_RST_TRG = 0x1):



  • 不可重复触发(寄存器 EPWM_CNT_RST_TRG = 0x0):