一、扇区判断
wUAlpha = Valfa_beta.qV_Component1 * ( int32_t )pHandle->hT_Sqrt3;//hT_Sqrt3为2/√3
wUBeta = -( Valfa_beta.qV_Component2 * ( int32_t )( pHandle->hPWMperiod ) ) * 2;
wX = wUBeta;
wY = ( wUBeta + wUAlpha ) / 2;
wZ = ( wUBeta - wUAlpha ) / 2;
ST官方扇区如下所示:
通过反Park变换得到矢量\(V_{\alpha }\)和\(V_{\beta }>0\),首先要知道二者合成的矢量处于哪个扇区。以待合成的矢量在第一扇区为例,当\(V_{\alpha }>0\)且\(V_{\beta }<0\)时,矢量可能处于I或II扇区,只需求tan角度即可判断合成的矢量在那个扇区。
最终总结出的规律如下:
由上表可知,判断\(V_{\beta }\)、\(\sqrt{3}V_{\alpha }-V_{\beta}\)、\(-\sqrt{3}V_{\alpha }-V_{\beta}\)与0的大小关系即可,后续还要根据该变量算三相占空比,所以这里乘以了周期T。
\(\large{wX=-V_{\beta }T}\)
\(\large{wY= \frac{\sqrt{3}V_{\alpha }T-V_{\beta }T}{2}}\)
\(\large{wZ= \frac{-V_{\beta }T-\sqrt{3}V_{\alpha }T}{2}}\)
1、wY<0:即\(\sqrt{3}V_{\alpha }<V_{\beta}\),目标矢量在3、4、5扇区
(1)wZ<0,则在扇区5
(2)wZ≥0:①wX≤0时,在扇区4 ②wX>0时,则在扇区3
2、wY>0:即\(\sqrt{3}V_{\alpha }>V_{\beta}\),目标矢量在1、2、6扇区
(1)wZ≥0,则在扇区2
(2)wZ<0:①wX≤0时,在扇区6 ②wX>0时,则在扇区1
二、矢量时间计算
这里以第一扇区为例进行解释。
(1)首先需要确保相邻矢量合成的矢量在正六边形边界内,否则逆变器的电压输出波形将要失真。
基本空间向量的幅值,即相电压的值,大小为\(\large{\frac{2V_{dc}}{3}}\),当非零矢量作用时间为0时,相邻基本空间向量合成矢量大小为\(\large{\frac{2V_{dc}}{3}\times sin60^{\circ}}\)。二者相除,即为归一化处理后的基本空间向量的幅值:\(\large{\frac{1}{sin60^{\circ}}= \frac{2}{\sqrt{3}}}\)。
(2)接下来就是计算矢量作用时间了
\(\large{V_{out}\times \cos\theta= |V_{4}|\times\frac{T_{4}}{T}+ |V_{6}|\times \frac{T_{6}}{T} \times\cos60^{\circ} = V_{\alpha }}\)
\(\large{V_{out}\times \sin\theta= |V_{6}|\times \frac{T_{6}}{T} \times\sin60^{\circ} = -V_{\beta }}\)(ST官方以第四象限为基准,所以有负号)
\(\large{|V_{4}|=|V_{6}|= \frac{2}{\sqrt{3}}}\)
最终可求出:
\(\large{T_{4}= \frac{\sqrt{3}V_{\alpha }T+V_{\beta }T}{2}}\), \(\large{T_{6}= -V_{\beta }T}\)
发现\(T_{4}= -wZ\),\(T_{6}= wX\),而零矢量作用时间\(T_{0}=T-T_{4}-T_{6}\)。
接下来分析一下代码中占空比:
第一扇区的七段式SVPWM的发波顺序为:0-4-6-7-6-4-0
现在我们要求出A、B、C三相的CCR值 wTimePhA、 wTimePhB和wTimePhC,而TIM设置为中央对齐模式,最终可以得出:
\(\large{wTimephA= (T - \frac{T+Z-X}{2})\times \frac{1}{2} = \frac{T-Z+X}{4}}\)
\(\large{wTimephB= wTimephA - T_{4}\times \frac{1}{2} = wTimephA+\frac{Z}{2}}\)
\(\large{wTimephC= wTimephB-T_{6}\times \frac{1}{2}= wTimephB-\frac{X}{2}}\)
- 同理可得其它扇区的七段式SVPWM的占空比和发波波形:
- 表中的tA、tB、tC表示整个高电平时间,和CCR值不同。
- 为何不同扇区A、B、C相的波形不同?
首先来看六个扇区的定义,这里不是按0~6顺序排列的,而是保证相邻两个扇区仅差一个位,这样可以减少MOSFET的开关次数。
最终可以总结出不同扇区具有如下切换顺序,用二进制画出来就对应前面不同扇区的SVPWM 7段图
扇区 | 七段SVPWM顺序 |
I | 0-4-6-7-7-6-4-0 |
II | 0-2-6-7-7-6-2-0 |
III | 0-2-3-7-7-3-2-0 |
IV | 0-1-3-7-7-3-1-0 |
V | 0-1-5-7-7-5-1-0 |
VI | 0-4-5-7-7-5-4-0 |
最后再以第一扇区为例,分析相关的配置代码:
static void MX_TIM1_Init(void)
TIM_InitStruct.CounterMode = LL_TIM_COUNTERMODE_CENTER_UP;
TIM_InitStruct.Autoreload = ((PWM_PERIOD_CYCLES) / 2);
uint16_t PWMC_SetPhaseVoltage( PWMC_Handle_t * pHandle, Volt_Components Valfa_beta )
pHandle->hSector = SECTOR_1;
wTimePhA = ( int32_t )( pHandle->PWMperiod ) / 4 + ( ( wX - wZ ) / ( int32_t )262144 );
wTimePhB = wTimePhA + wZ / 131072;
wTimePhC = wTimePhB - wX / 131072;
pHandle->hCntPhA = ( uint16_t )wTimePhA;
pHandle->hCntPhB = ( uint16_t )wTimePhB;
pHandle->hCntPhC = ( uint16_t )wTimePhC;
pSetADCSamplingPoint = pHandle->pFctSetADCSampPointSect1;
return ( pSetADCSamplingPoint( pHandle ) );
static uint16_t R3_1_F30X_WriteTIMRegisters( PWMC_Handle_t * pHdl )
TIMx->CCR1 = pHandle->_Super.hCntPhA;
TIMx->CCR2 = pHandle->_Super.hCntPhB;
TIMx->CCR3 = pHandle->_Super.hCntPhC;
(1)CCR直接等于hCntPhA、hCntPhB、hCntPhC
从上面七段SVPWM的图中可以看出,a、b、c三相的的PWM波形为中央对齐的:
在向上或向下计数模式中,PWM周期等于ARR;而在中央对齐模式中,PWM周期等于2ARR。
这里中央对齐模式的计数顺序为从ARR~0~ARR,而非0~ARR~0:
①从ARR减到CRR:低电平
②从CCR减到0:高电平
③从0增加到CCR:高电平
④从CCR增加到ARR:低电平
(2)hPWMperiod和T
hPWMperiod = T。在中央对齐模式中PWM周期为2倍ARR,所以TIM_ARR设置为了hPWMperiod/2。而且前面我们计算T4和T6的时候,公式中用到的T表示的就是一整个周期的T。
(3)131072和262144
前面我们计算出wTimephA、wTimephB、wTimephC,如下:
\(\large{wTimephA= (T - \frac{T+Z-X}{2})\times \frac{1}{2} = \frac{T-Z+X}{4}}\)
\(\large{wTimephB= wTimephA - T_{4}\times \frac{1}{2} = wTimephA+\frac{Z}{2}}\)
\(\large{wTimephC= wTimephB-T_{6}\times \frac{1}{2} = wTimephB-\frac{X}{2}}\)
由于ADC采集的电流是左对齐的,所以是\(Q_{15}\)格式的,计算PWM比较值时要转为\(Q_{0}\)格式,所以这里计算需要先右移15位,即\(2^{^{15}}=32768\)。再加上wUAlpha和wUBeta定义时多乘了一个2,所以X、Z还要多除以一个2。
另外\(131072 = 2^{17}\)、\(262144 = 2^{18}\),所以我会把代码里的除法改为右移17位和18位,从而加快运算速度。