21ic电子技术开发论坛 单片机与嵌入式系统 德州仪器MCU 看不懂这几句
发新帖我要提问
返回列表
打印

看不懂这几句

[复制链接]
498|9
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
zhenykun|  楼主 | 2016-7-10 16:23 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式

/*=====================================================================================
File name: SVGEN_DQ.C
Description: 空间矢量PWM产生函数

=====================================================================================*/

#include "IQmathLib.h"
#include "dmctype.h"
#include "svgen_dq.h"

void svgendq_calc(SVGENDQ *v)
{

_iq Va,Vb,Vc,t1,t2;
Uint32 Sector = 0;

// 反CLARK变换
Va = v->Ubeta;
Vb = _IQmpy(_IQ(-0.5),v->Ubeta) + _IQmpy(_IQ(0.8660254),v->Ualpha); // 0.8660254 = sqrt(3)/2
Vc = _IQmpy(_IQ(-0.5),v->Ubeta) - _IQmpy(_IQ(0.8660254),v->Ualpha); // 0.8660254 = sqrt(3)/2

//用Sector判断所在扇区
if (Va>_IQ(0))
Sector = 1;
if (Vb>_IQ(0))
Sector = Sector + 2;
if (Vc>_IQ(0))
Sector = Sector + 4;

// X,Y,Z (Va,Vb,Vc) 计算
Va = v->Ubeta; // X = Va
Vb = _IQmpy(_IQ(0.5),v->Ubeta) + _IQmpy(_IQ(0.8660254),v->Ualpha); // Y = Vb
Vc = _IQmpy(_IQ(0.5),v->Ubeta) - _IQmpy(_IQ(0.8660254),v->Ualpha); // Z = Vc

if (Sector==0) // Sector 0: 当(Ualpha,Ubeta) = (0,0)
{
v->Ta = _IQ(0.5);
v->Tb = _IQ(0.5);
v->Tc = _IQ(0.5);
}
if (Sector==1) // Sector 1: t1=Z and t2=Y (abc ---> Tb,Ta,Tc)
{
t1 = Vc;
t2 = Vb;
v->Tb = _IQmpy(_IQ(0.5),(_IQ(1)-t1-t2)); // tbon = (1-t1-t2)/2
v->Ta = v->Tb+t1; // taon = tbon+t1
v->Tc = v->Ta+t2; // tcon = taon+t2
}
else if (Sector==2) // Sector 2: t1=Y and t2=-X (abc ---> Ta,Tc,Tb)
{
t1 = Vb;
t2 = -Va;
v->Ta = _IQmpy(_IQ(0.5),(_IQ(1)-t1-t2)); // taon = (1-t1-t2)/2
v->Tc = v->Ta+t1; // tcon = taon+t1
v->Tb = v->Tc+t2; // tbon = tcon+t2
}
else if (Sector==3) // Sector 3: t1=-Z and t2=X (abc ---> Ta,Tb,Tc)
{
t1 = -Vc;
t2 = Va;
v->Ta = _IQmpy(_IQ(0.5),(_IQ(1)-t1-t2)); // taon = (1-t1-t2)/2
v->Tb = v->Ta+t1; // tbon = taon+t1
v->Tc = v->Tb+t2; // tcon = tbon+t2
}
else if (Sector==4) // Sector 4: t1=-X and t2=Z (abc ---> Tc,Tb,Ta)
{
t1 = -Va;
t2 = Vc;
v->Tc = _IQmpy(_IQ(0.5),(_IQ(1)-t1-t2)); // tcon = (1-t1-t2)/2
v->Tb = v->Tc+t1; // tbon = tcon+t1
v->Ta = v->Tb+t2; // taon = tbon+t2
}
else if (Sector==5) // Sector 5: t1=X and t2=-Y (abc ---> Tb,Tc,Ta)
{
t1 = Va;
t2 = -Vb;
v->Tb = _IQmpy(_IQ(0.5),(_IQ(1)-t1-t2)); // tbon = (1-t1-t2)/2
v->Tc = v->Tb+t1; // tcon = tbon+t1
v->Ta = v->Tc+t2; // taon = tcon+t2
}
else if (Sector==6) // Sector 6: t1=-Y and t2=-Z (abc ---> Tc,Ta,Tb)
{
t1 = -Vb;
t2 = -Vc;
v->Tc = _IQmpy(_IQ(0.5),(_IQ(1)-t1-t2)); // tcon = (1-t1-t2)/2
v->Ta = v->Tc+t1; // taon = tcon+t1
v->Tb = v->Ta+t2; // tbon = taon+t2
}

// 转换无符号全局Q格式(0,1)为有符号全局Q格式 (-1,1)
v->Ta = _IQmpy(_IQ(2.0),(v->Ta-_IQ(0.5)));
v->Tb = _IQmpy(_IQ(2.0),(v->Tb-_IQ(0.5)));
v->Tc = _IQmpy(_IQ(2.0),(v->Tc-_IQ(0.5)));


}
上面加粗的部分,作用是什么?

相关帖子

沙发
zhenykun|  楼主 | 2016-7-10 16:25 | 只看该作者
为什么要将无符号全局Q格式,换为有符号的全局Q格式.??谢谢了!

使用特权

评论回复
板凳
wuhany| | 2016-7-10 17:10 | 只看该作者
高精度乘法, _IQmpy这个函数在TI 的IQmath库里面的

使用特权

评论回复
地板
zhenykun|  楼主 | 2016-7-10 17:11 | 只看该作者
这个我知道,我想知道的是整个式子的含义

使用特权

评论回复
5
jiaxw| | 2016-7-10 17:13 | 只看该作者

这个我也不是很清楚

使用特权

评论回复
6
spark周| | 2016-7-10 17:14 | 只看该作者
这个要和 PWM_MACRO 对应起来看。

使用特权

评论回复
7
午夜粪车| | 2016-7-10 17:15 | 只看该作者

这里 无符号全局Q格式(0,1)->有符号全局Q格式 (-1,1)

PWM_MACRO 里面 再反转过来。

使用特权

评论回复
8
huangchui| | 2016-7-10 17:17 | 只看该作者
具体目的不明

使用特权

评论回复
9
zhenykun|  楼主 | 2016-7-10 17:20 | 只看该作者
这样啊,多谢

使用特权

评论回复
10
smilingangel| | 2016-7-11 17:10 | 只看该作者
这样的转换的还是没见过的。。

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

868

主题

11535

帖子

3

粉丝
关闭 热门推荐
快速回复 在线客服 返回列表 返回顶部