PWMV2故障保护和强制输出

摘要

本文就pwmv2的一些功能做出叙述,主要包括:

  • 故障保护fault相关
  • 强制输出force相关

故障保护


在pwmv2中,故障保护为pwm波输出链的最后一个模块,用来在发生故障时阻止pwm波输出,将输出变为预设的电平。

同步fault

选择来自triggermux的信号作为输入,当信号来临时将输出电平变为预设的电平。
注意,fault的触发输入不同于reloadcompare值等从8个通用触发输入中选择,而是通道和通用触发输入固定搭配,pwmv2的输出P0P1对应通用触发输入0,pwmv2的输出P2P3对应通用触发输入1,pwmv2的输出P4P5对应通用触发输入2,pwmv2的输出P6P7对应通用触发输入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);
0
0
发表回复 0

Your email address will not be published. Required fields are marked *