当前位置:网站首页>FOC SVPWM函数PWMC_SetPhaseVoltage解析
FOC SVPWM函数PWMC_SetPhaseVoltage解析
2022-04-23 05:51:00 【tilblackout】
一、扇区判断
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变换得到矢量和
,首先要知道二者合成的矢量处于哪个扇区。以待合成的矢量在第一扇区为例,当
且
时,矢量可能处于I或II扇区,只需求tan角度即可判断合成的矢量在那个扇区。
最终总结出的规律如下:
由上表可知,判断、
、
与0的大小关系即可,后续还要根据该变量算三相占空比,所以这里乘以了周期T。
1、wY<0:即,目标矢量在3、4、5扇区
(1)wZ<0,则在扇区5
(2)wZ≥0:①wX≤0时,在扇区4 ②wX>0时,则在扇区3
2、wY>0:即,目标矢量在1、2、6扇区
(1)wZ≥0,则在扇区2
(2)wZ<0:①wX≤0时,在扇区6 ②wX>0时,则在扇区1
二、矢量时间计算
这里以第一扇区为例进行解释。
(1)首先需要确保相邻矢量合成的矢量在正六边形边界内,否则逆变器的电压输出波形将要失真。
基本空间向量的幅值,即相电压的值,大小为,当非零矢量作用时间为0时,相邻基本空间向量合成矢量大小为
。二者相除,即为归一化处理后的基本空间向量的幅值:
。
(2)接下来就是计算矢量作用时间了
(ST官方以第四象限为基准,所以有负号)
最终可求出:
,
发现,
,而零矢量作用时间
。
接下来分析一下代码中占空比:
第一扇区的七段式SVPWM的发波顺序为:0-4-6-7-6-4-0
现在我们要求出A、B、C三相的CCR值 wTimePhA、 wTimePhB和wTimePhC,而TIM设置为中央对齐模式,最终可以得出:
- 同理可得其它扇区的七段式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,如下:
由于ADC采集的电流是左对齐的,所以是格式的,计算PWM比较值时要转为
格式,所以这里计算需要先右移15位,即
。再加上wUAlpha和wUBeta定义时多乘了一个2,所以X、Z还要多除以一个2。
另外、
,所以我会把代码里的除法改为右移17位和18位,从而加快运算速度。
版权声明
本文为[tilblackout]所创,转载请带上原文链接,感谢
https://blog.csdn.net/tilblackout/article/details/120768324
边栏推荐
- 【UDS统一诊断服务】四、诊断典型服务(6)— 输入输出控制单元(0x2F)
- For() loop parameter call order
- [ThreadX] h743zi + lan8720 + ThreadX + netx duo transplantation
- 【UDS统一诊断服务】一、诊断概述(1)— 诊断概述
- sqlite3加密版
- [UDS unified diagnostic service] II. Network layer protocol (1) - overview and functions of network layer
- 如何读文献
- 【UDS统一诊断服务】四、诊断典型服务(5)— 功能/元件测试功能单元(例行程序功能单元0x31)
- 深蓝学院激光slam理论与实践 -第二章(里程计标定)作业
- C语言输入和输出(printf和scanf函数、putchar和getchar函数)
猜你喜欢
随机推荐
【UDS统一诊断服务】(补充)五、ECU bootloader开发要点详解 (1)
Qt 给应用程序加图标
C语言的浪漫
【UDS统一诊断服务】四、诊断典型服务(3)— 读故障信息功能单元(存储数据传输功能单元)
Eigen 库常用基本用法 备忘
爬取彩票数据
Generate random number
Matlab calibration board corner detection principle
Graduation project, viewing screenshots of epidemic psychological counseling system
Friend function, friend class, class template
【无标题】
C语言实现2048小游戏方向合并逻辑
C语言实现memcpy、memset、strcpy、strncpy、strcmp、strncmp、strlen
代理服务器
C语言进阶要点笔记5
C语言结构体指定初始化
修改注册表的值
[UDS unified diagnosis service] IV. typical diagnosis service (3) - read fault information function unit (storage data transmission function unit)
Camera calibration: key point method vs direct method
sqlite3加密版