FOC SVPWM函数PWMC_SetPhaseVoltage解析

一、扇区判断

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位,从而加快运算速度。

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

tilblackout

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值