PWM
将 P0_0(PWM_P) 和 P0_1(PWM_N) 接入逻辑分析仪,在逻辑分析仪内可观察到 PWM 的输出波形。
环境需求
该示例的环境需求,可参考 环境需求。
硬件连线
连接 P0_0(PWM_P) 和 P0_1(PWM_N) 至逻辑分析仪。
配置选项
可配置如下宏修改输出 PWM 的引脚。
#define PWM_OUT_P_PIN P0_0 #define PWM_OUT_N_PIN P0_1
可配置如下宏修改 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)
可配置如下宏选择是否可以输出占空比连续变化的波形。
#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. */
编译和下载
该示例的编译和下载流程,可参考 编译和下载。
测试验证
当 EVB 启动后,通过逻辑分析仪看 P0_0 和 P0_1 输出的 PWM 波形。
a. 如果配置宏
ENHTIM_PWM_MANUAL_MODE
为1
,P0_0 输出周期为 100us,占空比为 50% 的 PWM 波形。 P0_1 输出与 P0_0 反相的相同周期和占空比的 PWM 波。Manual 模式下 PWM 的输出波形
b. 如果配置宏
ENHTIM_PWM_AUTO_MODE
为1
,P0_0 输出周期为 100us、占空比依次为 100% 80% 60% 50% 30% 20% 10% 0% 的 PWM 波形,随后输出的 PWM 波形将保持最后一次设置的占空比。 P0_1 输出与 P0_0 反相的相同周期和占空比的 PWM 波。Auto 模式下 PWM 的输出波形
代码介绍
该章节主要介绍示例中的初始化和相应功能实现的代码和流程说明。
源码路径
工程文件和源码路径如下:
工程路径:
sdk\samples\peripheral\enhtimer\enhtim_pwm\proj
源码路径:
sdk\samples\peripheral\enhtimer\enhtim_pwm\src
初始化
外设的初始化流程可参考 General Introduction 中的 初始化流程 部分。
调用
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); }
调用
RCC_PeriphClockCmd()
,开启 ENHTIM 时钟。对 ENHTIM 外设进行初始化:
定义
ENHTIM_InitTypeDef
类型ENHTIM_InitStruct
,调用ENHTIM_StructInit()
将ENHTIM_InitStruct
预填默认值。根据需求修改
ENHTIM_InitStruct
参数,选择不同的 ENHTIM Mode 时,初始化配置的参数不同。ENHTIM 的初始化参数配置如下表所示。调用ENHTIM_Init()
,初始化 ENHTIM 外设。
ENHTIM Hardware Parameters |
Setting in the |
ENHTIM manual mode |
ENHTIM auto mode |
---|---|---|---|
Counter mode |
|||
PWM mode |
|||
Toggle output polarity |
|||
Count value |
|
|
|
Capture/Compare value |
|
- |
|
PWM deadzone clock source |
|||
PWM deadzone function |
|||
PWM P stop state |
|||
PWM N stop state |
|||
Size of deadzone time |
0x0 |
0x0 |
如果配置宏
ENHTIM_PWM_AUTO_MODE
为1
,调用ENHTIM_WriteCCFIFO()
来预填充输出波形的占空比。调用
ENHTIM_Cmd()
使能 ENHTIM 外设,逻辑分析仪内可观察到 PWM 输出波形。
功能实现
ENHTIM 在 manual mode 和 auto mode 下输出 PWM 的流程如图所示:

ENHTIM 在不同模式下的 PWM 输出流程
在
ENHTIM_MODE_PWM_MANUAL
模式下,需要设置ENHTIM_InitTypeDef::ENHTIM_CCValue
,来修改输出 PWM 的占空比。在
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%
依次预填数据到 CCR FIFO 中,代表 100% 80% 60% 50% 30% 20% 10% 0% 占空比。
如果没有清空 CCR FIFO 并写入新的值进入,随后输出的 PWM 波形将保持最后一次设置的占空比。