[PWM] 移相方法
概述
在pwm的应用中,需要对波形做一些变化处理。在多相控制的应用中,在保持占空比一定的情况下,生成具有一定相位差的多路波形,如下图所示,两路波形相位相差180度。
下面将介绍如何通过先楫pwm完成移相的操作。
pwm生成
先楫的pwm拥有一个计数器以及若干比较器,每个比较器拥有自己的输出信号OCx,在计数器和比较器的值相匹配后,比较器的输出OCx拉高,当计数器到达所设置的周期值(reload),所有的比较器的输出OCx拉低。
pwm的输出通道能够配置所需的比较器,此输出通道的pwm初始波形由选取的比较器输出所决定。配置的所有比较器输出波形异或后得到pwm初始波形。
\text{CHxREF} = \text{OC}_0 \oplus \text{OC}_1 \oplus ... \oplus \text{OC}_n
原理
-
pwm波每个周期和360度相位对应,那么在reload值确定的情况下,都会有一个数值和相位所对应,例如180度相位对应的值为
reload/2
, 匹配公式如下:\text{value} = \frac{\text{reload} \ * \ \text{degree}}{360}
-
先楫pwm没有提供相位寄存器,用户需要计算修改关联的比较器的数值,通过影子寄存器的同步机制来完成pwm波相位的移动
-
过周期处理。在计算比较器值时,如果关联的比较器数值小于周期值(reload),那么不需要进行过周期处理。如果计算出的比较器值部分大于周期值(reload),需要引入一个新的比较器,来翻转波形。
步骤
-
配置比较器的生效时可,不建议配置为实时生效(0x01)
cmp_config[0].update_trigger = pwm_shadow_register_update_on_shlk;
-
获取参考波形的比较器数值,根据移动的相位值计算新的比较器compare值
-
关联所需的比较器,如果计算出的比较器值出现过周期的情况,需要多关联一个比较器,该比较器的值设置为reload
-
比较器值生效,生成波形
pwm_cmp_update_cmp_value(pwm_x, cmp_start_index, cmp0, 0); pwm_cmp_update_cmp_value(pwm_x, cmp_start_index + 1, cmp1, 0); pwm_cmp_update_cmp_value(pwm_x, cmp_start_index + 2, reload, 0); pwm_issue_shadow_register_lock_event(PWM);