Edit online

计数器功能模块

Read time: 3 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 的信号经过或逻辑后,决定计数器的同步。

计数器还会产生输出的同步信号 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、EPWM_CMPB_IMD_UPDT_PULSE_EN = 1,可以避免立即更新带来的错误 EPWM 输出。
  • 影子寄存器更新模式:
    • 对寄存器 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 影子寄存器更新示例