[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度相位效果图。