PWM

该示例通过使用 ENHTIM ,输出 PWM 波形。

将 P0_0(PWM_P) 和 P0_1(PWM_N) 接入逻辑分析仪,在逻辑分析仪内可观察到 PWM 的输出波形。

环境需求

该示例的环境需求,可参考 环境需求

硬件连线

连接 P0_0(PWM_P) 和 P0_1(PWM_N) 至逻辑分析仪。

配置选项

  1. 可配置如下宏修改输出 PWM 的引脚。

    #define PWM_OUT_P_PIN                     P0_0
    #define PWM_OUT_N_PIN                     P0_1
    
  2. 可配置如下宏修改 PWM 的频率和占空比。

    #define PWM_PERIOD                        100                                         /*< Setting this macro to 100 means the output is a PWM wave with a period of 100us. The unit of this macro is microseconds (us). */
    #define PWM_DUTY_CYCLE                    50                                          /*< Setting this macro to 50 means the output is a PWM wave with a 50% duty cycle. */
    #define PWM_MAXCNT                        (PWM_PERIOD * 40)
    #define PWM_CCVALUE                       (((PWM_PERIOD)*(PWM_DUTY_CYCLE*40))/100)
    
  3. 可配置如下宏选择是否可以输出占空比连续变化的波形。

    #define ENHTIM_PWM_MANUAL_MODE            1                                           /*< Setting this macro to 1 means that a PWM waveform with a period of 100us and a duty cycle of 50% can be output. */
    #define ENHTIM_PWM_AUTO_MODE              0                                           /*< Setting this macro to 1 means that a waveform with a period of 100us and continuously varying duty cycle can be output. */
    

编译和下载

该示例的编译和下载流程,可参考 编译和下载

测试验证

  1. 当 EVB 启动后,通过逻辑分析仪看 P0_0 和 P0_1 输出的 PWM 波形。

    a. 如果配置宏 ENHTIM_PWM_MANUAL_MODE1 ,P0_0 输出周期为 100us,占空比为 50% 的 PWM 波形。 P0_1 输出与 P0_0 反相的相同周期和占空比的 PWM 波。

    这里应该是enhtim输出pwm的图片

    Manual 模式下 PWM 的输出波形

    b. 如果配置宏 ENHTIM_PWM_AUTO_MODE1 ,P0_0 输出周期为 100us、占空比依次为 100% 80% 60% 50% 30% 20% 10% 0% 的 PWM 波形,随后输出的 PWM 波形将保持最后一次设置的占空比。 P0_1 输出与 P0_0 反相的相同周期和占空比的 PWM 波。

    这里应该是enhtim输出pwm的图片

    Auto 模式下 PWM 的输出波形

代码介绍

该章节主要介绍示例中的初始化和相应功能实现的代码和流程说明。

源码路径

工程文件和源码路径如下:

  • 工程路径: sdk\samples\peripheral\enhtimer\enhtim_pwm\proj

  • 源码路径: sdk\samples\peripheral\enhtimer\enhtim_pwm\src

初始化

外设的初始化流程可参考 General Introduction 中的 初始化流程 部分。

  1. 调用 Pad_Config()Pinmux_Config(),配置对应引脚的 PAD 和 PINMUX 。

    void board_enhance_pwm_init(void)
    {
        Pad_Config(PWM_OUT_P_PIN, PAD_PINMUX_MODE, PAD_IS_PWRON, PAD_PULL_NONE, PAD_OUT_ENABLE, PAD_OUT_HIGH);
        Pad_Config(PWM_OUT_N_PIN, PAD_PINMUX_MODE, PAD_IS_PWRON, PAD_PULL_NONE, PAD_OUT_ENABLE, PAD_OUT_HIGH);
    
        Pinmux_Config(PWM_OUT_P_PIN, PWM_PINMUX_OUT_P);
        Pinmux_Config(PWM_OUT_N_PIN, PWM_PINMUX_OUT_N);
    }
    
  2. 调用 RCC_PeriphClockCmd() ,开启 ENHTIM 时钟。

  3. 对 ENHTIM 外设进行初始化:

    1. 定义 ENHTIM_InitTypeDef 类型 ENHTIM_InitStruct ,调用 ENHTIM_StructInit()ENHTIM_InitStruct 预填默认值。

    2. 根据需求修改 ENHTIM_InitStruct 参数,选择不同的 ENHTIM Mode 时,初始化配置的参数不同。ENHTIM 的初始化参数配置如下表所示。调用 ENHTIM_Init(),初始化 ENHTIM 外设。

ENHTIM 初始化参数

ENHTIM Hardware Parameters

Setting in the ENHTIM_InitStruct

ENHTIM manual mode

ENHTIM auto mode

Counter mode

ENHTIM_InitTypeDef::ENHTIM_Mode

ENHTIM_MODE_PWM_MANUAL

ENHTIM_MODE_PWM_AUTO

PWM mode

ENHTIM_InitTypeDef::ENHTIM_PWMOutputEn

ENABLE

ENABLE

Toggle output polarity

ENHTIM_InitTypeDef::ENHTIM_PWMStartPolarity

ENHTIM_PWM_START_WITH_HIGH

ENHTIM_PWM_START_WITH_HIGH

Count value

ENHTIM_InitTypeDef::ENHTIM_MaxCount

PWM_MAXCNT

PWM_MAXCNT

Capture/Compare value

ENHTIM_InitTypeDef::ENHTIM_CCValue

PWM_CCVALUE

-

PWM deadzone clock source

ENHTIM_InitTypeDef::ENHTIM_PWMDeadZoneClockSource

ENHTIM_PWM_DZCLKSRCE_32K

ENHTIM_PWM_DZCLKSRCE_32K

PWM deadzone function

ENHTIM_InitTypeDef::ENHTIM_PWMDeadZoneEn

ENABLE

ENABLE

PWM P stop state

ENHTIM_InitTypeDef::ENHTIM_PWMStopStateP

ENHTIM_PWM_STOP_AT_HIGH

ENHTIM_PWM_STOP_AT_HIGH

PWM N stop state

ENHTIM_InitTypeDef::ENHTIM_PWMStopStateN

ENHTIM_PWM_STOP_AT_LOW

ENHTIM_PWM_STOP_AT_LOW

Size of deadzone time

ENHTIM_InitTypeDef::ENHTIM_DeadZoneSize

0x0

0x0

  1. 如果配置宏 ENHTIM_PWM_AUTO_MODE1,调用 ENHTIM_WriteCCFIFO() 来预填充输出波形的占空比。

  2. 调用 ENHTIM_Cmd() 使能 ENHTIM 外设,逻辑分析仪内可观察到 PWM 输出波形。

功能实现

ENHTIM 在 manual mode 和 auto mode 下输出 PWM 的流程如图所示:

这里应该是 enhtim pwm flow

ENHTIM 在不同模式下的 PWM 输出流程

  1. ENHTIM_MODE_PWM_MANUAL 模式下,需要设置 ENHTIM_InitTypeDef::ENHTIM_CCValue,来修改输出 PWM 的占空比。

  2. ENHTIM_MODE_PWM_AUTO 模式下,需要调用 ENHTIM_WriteCCFIFO() 来修改输出 PWM 的占空比值。

    ENHTIM_WriteCCFIFO(Enhance_Timer, 0); //Output high level with a duty cycle of 100%
    ENHTIM_WriteCCFIFO(Enhance_Timer, 800); //Output high level with a duty cycle of 80%
    ENHTIM_WriteCCFIFO(Enhance_Timer, 1600); //Output high level with a duty cycle of 60%
    ENHTIM_WriteCCFIFO(Enhance_Timer, 2000); //Output high level with a duty cycle of 50%
    ENHTIM_WriteCCFIFO(Enhance_Timer, 2800); //Output high level with a duty cycle of 30%
    ENHTIM_WriteCCFIFO(Enhance_Timer, 3200); //Output high level with a duty cycle of 20%
    ENHTIM_WriteCCFIFO(Enhance_Timer, 3600); //Output high level with a duty cycle of 10%
    ENHTIM_WriteCCFIFO(Enhance_Timer, 4000); //Output low level with a duty cycle of 100%
    
    1. 依次预填数据到 CCR FIFO 中,代表 100% 80% 60% 50% 30% 20% 10% 0% 占空比。

    2. 如果没有清空 CCR FIFO 并写入新的值进入,随后输出的 PWM 波形将保持最后一次设置的占空比。