整体思路
将整个PWM周期分为若干个小循环周期。划分的目的就是在任意小循环周期中,任何一相都不会发生0 --> 1 --> 0或1 --> 0 --> 1 电平变化超过两次的情况。
至少需要两个定时器,一个通用/高级定时器具有输出比较功能,另一个基本定时器负责在固定的时间(每个小循环周期结束后)修改输出比较值和极性。
具体实现过程
波形相位差决定输出比较定时器和另一个定时器的计时周期。两个周期时间要设置一致。
一般相位差的倍数N是360度。
定时器的周期就是 相位差 / 360 * 整个PWM周期 分为倍数N个小循环周期
占空比决定输出比较通道各个循环周期的比较值和极性。
在N个小循环周期中,不改极性(极性可设为低于比较值输出1,高于比较值输出0),设置特定的比较值(或者改变极性,设置特定的比较值)。
改变比较值/极性一般是影子寄存器起作用,改完后要保证比较值和极性可以生效。
占空比的时间如果小于小循环周期时间
例如有3个小循环周期(极性如上)
CCR1 CCR2 CCR3
CH1: X 0 0
CH2: 0 X 0
CH3: 0 0 X
占空比时间大于小循环周期时间(特别计算)
例如有3个小循环周期(极性如上)
CCR1 CCR2 CCR3
CH1: X1 X2 X3
CH2: X3 X1 X2
CH3: X2 X3 X1
实例
用英飞凌TLE9871产生频率为10kHz,相位差为120度,频率为1Hz,占空比为10%的波形。(使用CCU6产生波形)
错误方案
由于前期也没画图,想当然的写了一下程序,后面感觉不对,又改了一下,又整理了解决这类问题的思路。
英飞凌插件设置
GPT1_timer3中断处理函数
纠正方案
GPT1_timer3中断处理函数
给大家留个问题:如果相位差 * 整数不等于360度,产生三相任意相位差和任意相同占空比的PWM波形,应该怎么得到呢?