PWMV2故障保护和强制输出
摘要
本文就pwmv2的一些功能做出叙述,主要包括:
- 故障保护fault相关
- 强制输出force相关
故障保护
在pwmv2中,故障保护为pwm波输出链的最后一个模块,用来在发生故障时阻止pwm波输出,将输出变为预设的电平。
同步fault
选择来自triggermux
的信号作为输入,当信号来临时将输出电平变为预设的电平。
注意,fault的触发输入不同于reload
、compare
值等从8个通用触发输入中选择,而是通道和通用触发输入固定搭配,pwmv2的输出P0
、P1
对应通用触发输入0,pwmv2的输出P2
、P3
对应通用触发输入1,pwmv2的输出P4
、P5
对应通用触发输入2,pwmv2的输出P6
、P7
对应通用触发输入3。
- 调试模式
调试模式是特殊的同步fault,用于调试芯片的过程,在芯片达到断点、暂停的时候,pwmv2使能了同步fault的通道都会输出预设的电平。 -
配置步骤:
- 配置
triggermux
,将fault信号连接到通用触发输入 - 配置输出极性。
PWM_CFG0.FAULT_MODE
- 使能同步fault。
PWM_CFG0.FAULT_EN_SYNC = 1
- 若开启调试模式,还需
GLB_CTRL2.DEBUG_IN_EN = 1
pwmv2_set_fault_mode(PWM, pwm_channel_0, pwm_fault_output_1); pwmv2_enable_fault_from_trigmux(PWM, pwm_channel_0); /* 开启调试模式,在core halt时,停止输出pwm */ pwmv2_enable_debug_mode(PWM);
- 配置
异步fault
异步fault不同于同步fault需要pwmv2的时钟,异步fault在pwmv2缺失时钟的情况下仍能正常工作。当选中的引脚为相应极性电平时,pwmv2输出预设的电平。
- 配置步骤
- 选择异步fault引脚, `PWM_CFG0.FAULT_SEL_ASYNC`
- 选择输入有效极性 `PWM_CFG0.FAULT_POL_ASYNC`
- 配置输出极性 `PWM_CFG0.FAULT_MODE`
- 使能异步fault `PWM_CFG0.FAULT_EN_ASYNC = 1`
pwmv2_async_fault_source_config_t fault_cfg;
fault_cfg.async_signal_from_pad_index = BOARD_APP_PWM_FAULT_PIN;
fault_cfg.fault_async_pad_level = pad_fault_active_high;
pwmv2_config_async_fault_source(PWM, PWM_OUTPUT_PIN1, &fault_cfg);
pwmv2_set_fault_mode(PWM, pwm_channel_0, pwm_fault_output_0);
pwmv2_enable_fault_from_pad(PWM, pwm_channel_0);
故障消除
pwmv2有多种方式进行故障消除,恢复pwmv2的输出,通过`PWM_CFG1.FAULT_REC_TIME`进行配置。
- 0x00, 当无引发故障的信号或者电平后,立刻恢复输出,
- 0x01,当无引发故障的信号或者电平后,在计数器下一次达到reload值时恢复输出。
- 0x02, 当无引发故障的信号或者电平后,`PWM_CFG1.FAULT_REC_SEL`选中的通用触发输入的信号来临后恢复输出。
- 0x03,当无引发故障的信号或者电平后, `GLB_CTRL2.FAULT_CLEAR`置位恢复。
pwmv2_set_fault_recovery_time(PWM, pwm_channel_0, pwm_fault_recovery_immediately);
强制输出
强制输出在pwmv2的输出链中,处于互补模块之后,死区模块之前。
更新时机
强制输出有两个更新时机,分别为`FORCE_MODE`模式更新时机以及输出更新时机,前者为将force_mode影子寄存器的值更新到工作寄存器中时机,后者为force_mode生效到输出中的时机。
软件强制输出
软件强制输出,通过软件更新force_mode工作寄存器的方式,向外输出预设的电平,需要注意生效时刻的选择。
- 配置步骤
- 设置通道强制输出极性,`FORCE_MODE.FORCE_MODE`
- 设置force_mode更新到工作寄存器的时机为软件更新,`PWM_CFG1.FORCE_UPDATE_TIME = 0x00`
- 设置force_mode输出更新时机为立刻更新,`PWM_CFG1.FORCE_TIME = 0x00`
- 由软件管理强制输出,`PWM_CFG1.SW_FORCE_EN = 1`
- 开始软件强制输出, `GLB_CTRL.SW_FORCE`
/* 配置通道0 force_mode输出为立刻生效 */
pwmv2_set_force_update_time(PWM, pwm_channel_0, pwm_force_immediately);
/* 配置通道0 force_mode参数更新至工作寄存器为立刻生效 */
pwmv2_force_update_time_by_shadow(PWM, pwm_channel_0, pwm_force_update_shadow_immediately);
/* 配置软件管理强制输出 */
pwmv2_enable_force_by_software(PWM, pwm_channel_0);
/* 开始软件强制输出 */
pwmv2_enable_software_force(PWM, pwm_channel_0);
pwmv2_force_output(PWM, pwm_channel_0, pwm_force_output_1, false);
硬件强制输出
硬件强制输出,在选择的通用触发输入信号到来时,向外输出预设的电平。
- 配置步骤
- 完成force_mode的更新配置,在工作寄存器中有所需的强制输出模式
- 设置force_mode输出更新时机为硬件更新,`PWM_CFG1<n>.FORCE_TIME = 0x02`
- 由硬件管理强制输出,`PWM_CFG1<n>.SW_FORCE_EN = 0`
/* 配置强制更新时机为触发输入 */
pwmv2_set_force_update_time(PWM, pwm_channel_0, pwm_force_at_trigmux);
pwmv2_enable_force_by_hardware(PWM, pwm_channel_0);
pwmv2_force_output(PWM, pwm_channel_0, pwm_force_output_1, false);
翻转输出
在整个pwmv2的链路中,取反模块在强制输出模块之后,因此强制输出支持翻转功能。
- 当不使用影子寄存器更新翻转极性时
pwmv2_disable_invert_by_shadow(PWM, pwm_channel_0); pwmv2_enable_output_invert(PWM, pwm_channel_0);
- 当使用影子寄存器更新翻转极性时
pwmv2_enable_invert_by_shadow(PWM, pwm_channel_0, pwm_shadow_register_output_polarity_on_shlk); pwmv2_force_output(PWM, pwm_channel_0, pwm_force_output_1, true);