【电机控制】七段式SVPWM扇区、矢量作用时间计算——对比simplefoc与Ti例程

本文主要是介绍【电机控制】七段式SVPWM扇区、矢量作用时间计算——对比simplefoc与Ti例程,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

【电机控制】七段式SVPWM扇区、矢量作用时间计算——对比simplefoc与Ti例程


文章目录

  • 前言
  • 一、simplefoc——通过角度找扇区
    • 1.通过角度找扇区理论
      • 1.通过角度找扇区
      • 2.矢量作用时间计算
      • 3.矢量切换时间计算——七段式
    • 2.simplefoc代码
    • 3.解读simplefoc代码
      • 1.通过角度找扇区
      • 2.矢量作用时间计算
  • 二、TI——通过Uα、Uβ找扇区
    • 1.通过Uα、Uβ找扇区理论
    • 2.TI代码
    • 3.解读TI代码
      • 1.ABC赋值
      • 2.找扇区
      • 3.矢量作用时间计算
      • 4.矢量切换时间计算——七段式
  • 三、参考文章
  • 总结


前言

【电机控制】直流有刷电机、无刷电机汇总——持续更新
使用工具:
1.得力万用表


提示:以下是本篇文章正文内容,下面案例可供参考

一、simplefoc——通过角度找扇区

1.通过角度找扇区理论

1.通过角度找扇区

在这里插入图片描述

2.矢量作用时间计算

在这里插入图片描述
在这里插入图片描述
Udc表示电源电压(在代码中是voltage_limit),Uref表示设置的力矩大小(在代码中是target_voltage),Ts表示PWM周期(代码中没有把Ts体现出来,代码中的T1、T2是周期的百分比)。

3.矢量切换时间计算——七段式

与下列TI计算的七段式相同,不同的是TI做了优化处理

在这里插入图片描述

2.simplefoc代码

	sector = (angle_el / _PI_3) + 1;T1 = _SQRT3*_sin(sector*_PI_3 - angle_el) * Uout;T2 = _SQRT3*_sin(angle_el - (sector-1.0)*_PI_3) * Uout;T0 = 1 - T1 - T2;// calculate the duty cycles(times)switch(sector){case 1:Ta = T1 + T2 + T0/2;Tb = T2 + T0/2;Tc = T0/2;break;case 2:Ta = T1 +  T0/2;Tb = T1 + T2 + T0/2;Tc = T0/2;break;case 3:Ta = T0/2;Tb = T1 + T2 + T0/2;Tc = T2 + T0/2;break;case 4:Ta = T0/2;Tb = T1+ T0/2;Tc = T1 + T2 + T0/2;break;case 5:Ta = T2 + T0/2;Tb = T0/2;Tc = T1 + T2 + T0/2;break;case 6:Ta = T1 + T2 + T0/2;Tb = T0/2;Tc = T1 + T0/2;break;default:  // possible error stateTa = 0;Tb = 0;Tc = 0;}TIM_SetCompare1(TIM2,Ta*PWM_Period);TIM_SetCompare2(TIM2,Tb*PWM_Period);TIM_SetCompare3(TIM2,Tc*PWM_Period);

3.解读simplefoc代码

1.通过角度找扇区

	sector = (angle_el / _PI_3) + 1;

2.矢量作用时间计算

	T1 = _SQRT3*_sin(sector*_PI_3 - angle_el) * Uout;T2 = _SQRT3*_sin(angle_el - (sector-1.0)*_PI_3) * Uout;T0 = 1 - T1 - T2;switch(sector){case 1:Ta = T1 + T2 + T0/2;Tb = T2 + T0/2;Tc = T0/2;break;case 2:Ta = T1 +  T0/2;Tb = T1 + T2 + T0/2;Tc = T0/2;break;case 3:Ta = T0/2;Tb = T1 + T2 + T0/2;Tc = T2 + T0/2;break;case 4:Ta = T0/2;Tb = T1+ T0/2;Tc = T1 + T2 + T0/2;break;case 5:Ta = T2 + T0/2;Tb = T0/2;Tc = T1 + T2 + T0/2;break;case 6:Ta = T1 + T2 + T0/2;Tb = T0/2;Tc = T1 + T0/2;break;default:  // possible error stateTa = 0;Tb = 0;Tc = 0;}

二、TI——通过Uα、Uβ找扇区

1.通过Uα、Uβ找扇区理论

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

在这里插入图片描述
在这里插入图片描述

若A、B、C、任意一个不等式大于0,则为1,反之则为0
在这里插入图片描述

2.TI代码

void  SVPWM_Gen(SVGEN *v)
{v->tmp1= v->Ubeta;															v->tmp2= _IQdiv2(v->Ubeta) + _IQmpy(_IQ(0.866),v->Ualpha);					v->tmp3= v->tmp2 - v->tmp1;													v->VecSector=3;															v->VecSector=(v->tmp2> 0)?( v->VecSector-1):v->VecSector;					v->VecSector=(v->tmp3> 0)?( v->VecSector-1):v->VecSector;						v->VecSector=(v->tmp1< 0)?(7-v->VecSector) :v->VecSector;						if(v->VecSector==1 || v->VecSector==4)                                 {   v->Ta= v->tmp2; 													v->Tb= v->tmp1-v->tmp3; 											v->Tc=-v->tmp2;														}								    										   																				else if(v->VecSector==2 || v->VecSector==5)                                   {   v->Ta= v->tmp3+v->tmp2; 												v->Tb= v->tmp1; 														v->Tc=-v->tmp1;														}																	   																					else  if(v->VecSector==3 || v->VecSector==6)   {   v->Ta= v->tmp3; 														v->Tb=-v->tmp3; 														v->Tc=-(v->tmp1+v->tmp2);												}							else{v->Ta=0;v->Tb=0;v->Tc=0;}
}	

3.解读TI代码

1.ABC赋值

	v->tmp1= v->Ubeta;															v->tmp2= _IQdiv2(v->Ubeta) + _IQmpy(_IQ(0.866),v->Ualpha);					v->tmp3= v->tmp2 - v->tmp1;			

这里TI开始进行优化,将传统的ABC稍作修改,
其中,A不变,为Uβ;
B为二分之根号三Uα+二分之一Uβ;
C为二分之根号三Uα-二分之一

2.找扇区

找扇区的方式也与传统的N=4C+2B+A不一样
先将其赋值为3再做判断

	v->VecSector=3;															v->VecSector=(v->tmp2> 0)?( v->VecSector-1):v->VecSector;					v->VecSector=(v->tmp3> 0)?( v->VecSector-1):v->VecSector;						v->VecSector=(v->tmp1< 0)?(7-v->VecSector) :v->VecSector;	

若A<0,则7-N,反之不变
若B>0,则N-1,反之不变
若C>0,则N-1,反之不变

3.矢量作用时间计算

这里也与传统的计算不同,舍弃掉了根号三*Ts/Udc
我们只看第一扇区与第四扇区,将画圈部分舍弃

在这里插入图片描述

4.矢量切换时间计算——七段式

将剩余部分的Tx与Ty代入到下列公式,下列公式也需要将Ts去掉,除以4去掉,再取反
例如:
第一扇区
Sa=Tx+Ty=根号三/2Uα+1/2Uβ=B
Sb=-Tx+Ty=3/2Uβ-根号三/2Uα=A-B
Sc=-Tx-Ty=-B

第四扇区
Sa=-Tx-Ty=根号三/2Uα+1/2Uβ=B
Sb=-Tx-Ty=3/2Uβ-根号三/2Uα=A-B
Sc=Tx+Ty=-B

此时,我们会发现,第一扇区与第四扇区的矢量作用时间的计算是一样的,也就是说,TI工程师是将ABC处赋值做了处理,对算法进行了优化。
我在这里举例第一扇区与第四扇区,同理可得第二扇区与第五扇区,第三扇区与第六扇区。

	 if(v->VecSector==1 || v->VecSector==4)                                 {   v->Ta= v->tmp2; 													v->Tb= v->tmp1-v->tmp3; 											v->Tc=-v->tmp2;														}		

在这里插入图片描述

三、参考文章

SVPWM分析、各个扇区详细计算以及Matlab仿真
FOC - SVPWM扇区判断
如何在TI官网上寻找DSP的例程
[问答] F28335电机矢量控制例程,svpwm生成中的一个问题如何解答
基于TMS320F28335的五段式和七段式SVPWM实现方法

总结

本文仅仅简单介绍了【电机控制】七段式SVPWM扇区、矢量作用时间计算——对比simplefoc与Ti例程,评论区欢迎讨论。

这篇关于【电机控制】七段式SVPWM扇区、矢量作用时间计算——对比simplefoc与Ti例程的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/962588

相关文章

使用C#代码计算数学表达式实例

《使用C#代码计算数学表达式实例》这段文字主要讲述了如何使用C#语言来计算数学表达式,该程序通过使用Dictionary保存变量,定义了运算符优先级,并实现了EvaluateExpression方法来... 目录C#代码计算数学表达式该方法很长,因此我将分段描述下面的代码片段显示了下一步以下代码显示该方法如

Python 标准库time时间的访问和转换问题小结

《Python标准库time时间的访问和转换问题小结》time模块为Python提供了处理时间和日期的多种功能,适用于多种与时间相关的场景,包括获取当前时间、格式化时间、暂停程序执行、计算程序运行时... 目录模块介绍使用场景主要类主要函数 - time()- sleep()- localtime()- g

锐捷和腾达哪个好? 两个品牌路由器对比分析

《锐捷和腾达哪个好?两个品牌路由器对比分析》在选择路由器时,Tenda和锐捷都是备受关注的品牌,各自有独特的产品特点和市场定位,选择哪个品牌的路由器更合适,实际上取决于你的具体需求和使用场景,我们从... 在选购路由器时,锐捷和腾达都是市场上备受关注的品牌,但它们的定位和特点却有所不同。锐捷更偏向企业级和专

如何用Java结合经纬度位置计算目标点的日出日落时间详解

《如何用Java结合经纬度位置计算目标点的日出日落时间详解》这篇文章主详细讲解了如何基于目标点的经纬度计算日出日落时间,提供了在线API和Java库两种计算方法,并通过实际案例展示了其应用,需要的朋友... 目录前言一、应用示例1、天安门升旗时间2、湖南省日出日落信息二、Java日出日落计算1、在线API2

什么是 Ubuntu LTS?Ubuntu LTS和普通版本区别对比

《什么是UbuntuLTS?UbuntuLTS和普通版本区别对比》UbuntuLTS是Ubuntu操作系统的一个特殊版本,旨在提供更长时间的支持和稳定性,与常规的Ubuntu版本相比,LTS版... 如果你正打算安装 Ubuntu 系统,可能会被「LTS 版本」和「普通版本」给搞得一头雾水吧?尤其是对于刚入

TP-LINK/水星和hasivo交换机怎么选? 三款网管交换机系统功能对比

《TP-LINK/水星和hasivo交换机怎么选?三款网管交换机系统功能对比》今天选了三款都是”8+1″的2.5G网管交换机,分别是TP-LINK水星和hasivo交换机,该怎么选呢?这些交换机功... TP-LINK、水星和hasivo这三台交换机都是”8+1″的2.5G网管交换机,我手里的China编程has

如何使用 Bash 脚本中的time命令来统计命令执行时间(中英双语)

《如何使用Bash脚本中的time命令来统计命令执行时间(中英双语)》本文介绍了如何在Bash脚本中使用`time`命令来测量命令执行时间,包括`real`、`user`和`sys`三个时间指标,... 使用 Bash 脚本中的 time 命令来统计命令执行时间在日常的开发和运维过程中,性能监控和优化是不

python中的与时间相关的模块应用场景分析

《python中的与时间相关的模块应用场景分析》本文介绍了Python中与时间相关的几个重要模块:`time`、`datetime`、`calendar`、`timeit`、`pytz`和`dateu... 目录1. time 模块2. datetime 模块3. calendar 模块4. timeit

Python实现局域网远程控制电脑

《Python实现局域网远程控制电脑》这篇文章主要为大家详细介绍了如何利用Python编写一个工具,可以实现远程控制局域网电脑关机,重启,注销等功能,感兴趣的小伙伴可以参考一下... 目录1.简介2. 运行效果3. 1.0版本相关源码服务端server.py客户端client.py4. 2.0版本相关源码1

Java将时间戳转换为Date对象的方法小结

《Java将时间戳转换为Date对象的方法小结》在Java编程中,处理日期和时间是一个常见需求,特别是在处理网络通信或者数据库操作时,本文主要为大家整理了Java中将时间戳转换为Date对象的方法... 目录1. 理解时间戳2. Date 类的构造函数3. 转换示例4. 处理可能的异常5. 考虑时区问题6.