[PWMv2] 同步方法

前言

先楫pwmv2支持多通道的同步输出,输出多条具有固定相位差的pwm波。
为方便叙述,将下列图示链路描述为通道。每个通道包含一个独立的计数器。

功能概述

实现多通道的同步输出,实际是统一每个通道的计数器数值。pwmv2提供了对通道计数器的多种操作,包括重置计数器数值,将固定数值写入计数器,计数器停止。

硬件实现

硬件实现需要来自pwmv2外部的信号。
每个pwmv2外设支持8个来自triggermux的触发输入,在triggermux上的对应PWM[x]_TRIG_IN[0-7],具体拓扑如下

在先楫的电机系统中,一般使用synt外设作为整个系统的时间基准。如果需要多个芯片同步,也可以将synt产生的触发信号通过triggermux路由到芯片引脚上,作为另一芯片的同步信号。

使用外部触发能够同步片上所有的pwmv2通道时基,多通道的同步可以使用下面两种方式:

  • 选择外部触发到来的时刻重置计数器的值。
  • 选择外部触发到来的时刻为reload值更新时刻,当触发到来时,reload值从0更新到预设的reload值。

软件实现

pwmv2提供了软件重置通道计数器的方式。软件方式最多一次同步pwmv2外设自有的四个通道。不支持软件写入计数器数值。

实现方法

触发实现重置计数器

触发信号到来时,相关通道的计数器清零,如下图所示:

代码实现

  • 配置triggermux,选择synt的输出为pwmv2的触发输入。

    trgm_output_t trgm0_io_config0 = {0};
    trgm0_io_config0.invert = 0;
    trgm0_io_config0.type = trgm_output_pulse_at_input_rising_edge;
    trgm0_io_config0.input = HPM_TRGM0_INPUT_SRC_SYNT_CH00;
    trgm_output_config(HPM_TRGM0, HPM_TRGM0_OUTPUT_SRC_PWM1_TRIG_IN0, &trgm0_io_config0);
    
    trgm_output_t trgm0_io_config1 = {0};
    trgm0_io_config1.invert = 0;
    trgm0_io_config1.type = trgm_output_pulse_at_input_rising_edge;
    trgm0_io_config1.input = HPM_TRGM0_INPUT_SRC_SYNT_CH00;
    trgm_output_config(HPM_TRGM0, HPM_TRGM0_OUTPUT_SRC_PWM1_TRIG_IN1, &trgm0_io_config1);
  • 配置通道的计数器,选择pwmv2的触发输入0、1作为两个通道的重载触发。

    /* 配置reload更新为触发更新 */
    pwmv2_counter_enable_reload_by_trig(PWM, pwm_counter_0);
    pwmv2_counter_enable_reload_by_trig(PWM, pwm_counter_1);
    /* 关联计数器和通用触发输入 */
    pwmv2_set_counter_reload_trigmux_index(PWM, pwm_counter_0, 0);
    pwmv2_set_counter_reload_trigmux_index(PWM, pwm_counter_1, 1);

触发更新reload值

触发信号到来时,将reload值更新到工作寄存器,输出波形。

代码实现

  • 配置triggermux,选择synt不同时刻输出为pwmv2的触发输入。

    trgm_output_t trgm0_io_config0 = {0};
    trgm0_io_config0.invert = 0;
    trgm0_io_config0.type = trgm_output_pulse_at_input_rising_edge;
    trgm0_io_config0.input = HPM_TRGM0_INPUT_SRC_SYNT_CH00;
    trgm_output_config(HPM_TRGM0, HPM_TRGM0_OUTPUT_SRC_PWM1_TRIG_IN0, &trgm0_io_config0);
    
    trgm_output_t trgm0_io_config1 = {0};
    trgm0_io_config1.invert = 0;
    trgm0_io_config1.type = trgm_output_pulse_at_input_rising_edge;
    trgm0_io_config1.input = HPM_TRGM0_INPUT_SRC_SYNT_CH01;
    trgm_output_config(HPM_TRGM0, HPM_TRGM0_OUTPUT_SRC_PWM1_TRIG_IN1, &trgm0_io_config1);
    
    trgm_output_t trgm0_io_config2 = {0};
    trgm0_io_config2.invert = 0;
    trgm0_io_config2.type = trgm_output_pulse_at_input_rising_edge;
    trgm0_io_config2.input = HPM_TRGM0_INPUT_SRC_SYNT_CH02;
    trgm_output_config(HPM_TRGM0, HPM_TRGM0_OUTPUT_SRC_PWM1_TRIG_IN2, &trgm0_io_config2);
  • 为每个通道的reload值更新时机选择触发信号。
    /* 关联计数器和通用触发输入 */
    pwmv2_reload_select_input_trigger(PWM, pwm_counter_0, 0);
    pwmv2_reload_select_input_trigger(PWM, pwm_counter_1, 1);
    pwmv2_reload_select_input_trigger(PWM, pwm_counter_2, 2);
    /* 配置reload值更新时机为触发到来时 */
    pwmv2_set_reload_update_time(PWM, pwm_counter_0, pwm_reload_update_on_trigger);
    pwmv2_set_reload_update_time(PWM, pwm_counter_1, pwm_reload_update_on_trigger);
    pwmv2_set_reload_update_time(PWM, pwm_counter_2, pwm_reload_update_on_trigger);

软件同步

pwmv2可以通过软件配置同时停止最多4个通道的计数,在修改完相应配置之后,在原有计数上继续执行。

代码实现

/* 同时暂停4个计数器计数 */
pwmv2_disable_multi_counter_sync(PWM, 0x0F);
// Configure expected parameters.
/* 同时开启4个计数器计数 */
pwmv2_enable_multi_counter_sync(PWM, 0x0F);

效果

粉色线为参考,分别为同相位输出和前移45度相位差和后移90度相位效果图。

0
0
发表回复 0

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