坐标变换,及c语言实现的讲解多如牛毛。

在此也做点整理,加入一根牛毛。偏重用什么样的C语言语法技巧实现这些变换来做双环控制的。

此处用到了C语言在嵌入式领域非常常用的一个语法:函数指针。

指针是个变量,那么函数指针也是个变量。函数指针变量装的内容是一个函数的首地址。

函数指针的定义为:函数返回值类型 (* 指针变量名) (函数参数列表);

函数指针放入结构体,提供了C++的面向对象的思想,便于模块的封装和层次化。

坐标变换过程中有许多变量,同时有数个函数,如果在C++中,我们可以定义一个类,但是在C语言中我们只能定义一个结构体组织这些紧密联系的成员和算法实现。

以三相电网电压为例

typedef struct{
    float32 a,b,c;//存放电网电压当前值
    float32 alpha,beta;//存放电网电压变换到alpha,beta轴上的值
    float32 d,q;//存放电网电压变换到d,q轴上的值
    float32 theta;//存放电网电压当前相位角度
    float32 sin_sita,cos_sita;//存放根据theta计算出来的正弦余弦值
    void (*Clarke)();//坐标变换有四个函数,每个函数在内存都有一块区域,定义四个函数指针变量,指向这四个函数的首地址
    void (*Park)();    //注意函数指针的定义的第二个括号里面是最好不要写东西的。因为函数指针的意思是这个指针变量指向任意      void (*InvPark)();  //函数,我们并不知道指向的函数的参数情况,所以在定义函数指针的时候,不能指定函数参数。
    void (*InvClarke)();
}CORDI_TRANSFER;   //Coordinate transformation

上面的数据类型中,有四个函数指针,那么我们还要定义四个坐标变换函数。

// Clarke
void clarke(CORDI_TRANSFER *p)
{
    p->alpha = COE_2DIVID3*(p->a - 0.5*p->b - 0.5*p->c);
    p->beta  = COE_2DIVID3*(HALF_SQRT_3*p->b - HALF_SQRT_3*p->c);
}
// park
void park(CORDI_TRANSFER *p)
{
    p->d =  p->alpha * p->sin_sita - p->beta * p->cos_sita;
    p->q = -p->alpha * p->cos_sita - p->beta * p->sin_sita;
}
// inv-clarke
void inv_clarke(CORDI_TRANSFER *p)
{
    p->a =       p->alpha;
    p->b = - 0.5*p->alpha + HALF_SQRT_3*p->beta;
    p->c = - 0.5*p->alpha - HALF_SQRT_3*p->beta;
}
// inv-park
void inv_park(CORDI_TRANSFER *p)
{
    p->alpha =   p->d*p->sin_sita - p->q*p->cos_sita;
    p->beta  = - p->d*p->cos_sita - p->q*p->sin_sita;
}

上面四个函数的定义最好写在CORDI_TRANSFER结构体定义之后,因为函数参数的类型是CORDI_TRANSFER,不然可能会报错,我没有试过。

上面定义了数据类型,把数据和算法实现给内存做了恰当的指示,但是编译器目前还不会按照上面的数据类型分配内存你空间,而是要根据这个数据类型定义变量,之后在给这个变量根据这种数据类型分配内存你空间。并且还有把这个变量初始化

CORDI_TRANSFER  ClarkeParkSwitch = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
                                                                    clarke,//这四个函数名代表函数的首地址,而定义CORDI_TRANSFER  的时候,
                                                                    inv_park,//定义了四个函数指针,那么初始化,自然要把函数的首地址赋值给这四个
                                                                    inv_clarke//变量

};

基本的数据和算法实现准备就做好了。

下面开始坐标变换啦,以clark变换为例。

把三相电压变换成两相电压;

1、输入采样滤波后的三相电EUa,Ub,Uc;压存放在ClarkeParkSwitch.a,   ClarkeParkSwitch.b,   ClarkeParkSwitch.c  :

ClarkeParkSwitch.a=Ua,   ClarkeParkSwitch.b=Ub,   ClarkeParkSwitch.c

2、调用void clarke(CORDI_TRANSFER *p)函数,

进行clark变换:ClarkeParkSwitch.Clarke(&ClarkeParkSwitch)。这里需要解释,clark变换函数的调用有点特殊,是利用函数指针变量调用的,因为初始化变量ClarkeParkSwitch时,四个函数的指针都初始化给了结构体里面的四个函数指针。

ClarkeParkSwitch.Clarke(&ClarkeParkSwitch)这句话完成的的功能和clarke(&ClarkeParkSwitch)是等价的。执行滞后,

计算出Ualpha和Ubelta的值,存放于ClarkeParkSwitch. alpha,   ClarkeParkSwitch.beta中。

后面的几个变换按照上面的类推就行。

并网逆变器的clark、park变换的C语言实现技巧相关推荐

  1. 电机FOC中的坐标变换(CLARK+PARK+公式推导+仿真+C语言实现)

    0 前言 今天获知了,电机FOC包含了SVPWM.坐标转换.信号采集反馈.PID闭环控制等,这个控制策略,统称为FOC控制.一般SVPWM算法的实现是在静止的αβ坐标系上实现.而PID控制器由于是对直 ...

  2. Clark与Park变换推导

    1.beta轴超前alpha轴90度 2. beta轴滞后alpha轴90度 参考资料:(124条消息) 电机FOC中的坐标变换(CLARK+PARK+公式推导+仿真+C语言实现)_qq_271581 ...

  3. matlab 正交park变换 功率守恒,基于守恒功率理论的多功能并网逆变器控制方法及系统与流程...

    本发明涉及电气工程技术领域,特别是一种基于守恒功率理论的多功能并网逆变器控制方法及系统. 背景技术: 随着微电网技术的发展,配电网侧电力电子设备大量接入,对电网的安全稳定运行造成极大的威胁.为了对配电 ...

  4. Clark变化和Park变换

    利用投影法推导两大变换公式,这里直接给出推导结果: Clark变换 FOC->等幅值变换 Park变换 反Park变换(电压的变换) 反Clark变换

  5. PMSM永磁同步电机PI双闭环SVPWM矢量控制 本模型包括DC直流电源、逆变桥、PMSM、park变换、clark变换、SVPWM、PI控制器、信号测量等单元模块

    PMSM永磁同步电机PI双闭环SVPWM矢量控制 Matlab/Simulink仿真模型(成品) 1.本模型包括DC直流电源.逆变桥.PMSM.park变换.clark变换.SVPWM.PI控制器.信 ...

  6. 三相并网逆变器电流内环解耦

    1.序言 刚刚打完电赛,做的是B题,现在回来恶补理论知识了,那么在这个过程中可谓相当痛苦,看了张兴老师的<PWM整流器及其控制>以及各类论文,都没有什么头绪,后面也是看了一些网友的帖子才豁 ...

  7. 三相并网逆变器电流环解耦(更新版)

    写在前面 这篇文章是对这篇文章的完善,计算代码在文末 正文 逆变器的框图如下所示 图1 三相并网逆变器控制框图 本小节将着重讨论图1中电流环的内容,由于LCL模型较为复杂,工程上将LCL当L来进行建模 ...

  8. 微分算子Park变换的矩阵等价形式

    Park变换是abc静止坐标系到dq旋转坐标系的坐标变换,其变换形式有很多种,其中最为常见一种变换情形是:t=0时,d轴与a轴重合,且q轴超前d轴90°.此情形下对应的变换矩阵为: 其中,F为电气物理 ...

  9. PMSM FOC控制 Matlab/Simulink仿真之Park变换

    1.Park变换的原理 上一节,我们说过,PMSM foc 控制需要坐标变换,说到了Clark变换,其实在Clark变换后还需要Park变换,把静止的2相坐标转换到2相的移动坐标,即2s->2r ...

最新文章

  1. 对梯度下降法的简单理解
  2. 台式电脑cpu排行榜_台式电脑CPU性能天梯图 AMD性能首次反超intel
  3. lan口配置 petalinux_PetaLinux安装及使用
  4. U盘病毒及其相关资源的分析(patch shell32.dll)
  5. 怎么让电脑屏幕一直亮着_上班族需要注意哪些养生禁忌 一直坐着没好处_百姓民生_新闻...
  6. UI设计干货|从此做数据可视化页面不枯燥!
  7. 图论--有向图强连通分量的标记及缩点模板
  8. 如何建立“开箱即用”的数据安全防护系统 | 专家对话
  9. pytorh——Fully-connected
  10. qq影音linux版本下载官网下载软件,QQ for Linux
  11. 【浏览器】解决QQ浏览器背景页面变成全黑(类似底片反色)
  12. FPGA的基本电路-计数器
  13. python工作技巧_能让你工作事半功倍的python小技巧大合集
  14. 【简单入门】ChatGPT prompt engineering (中文版)笔记 |吴恩达ChatGPT 提示工程
  15. 糅合了《魔兽》和《第二人生》优点的新式游戏闪亮登场!
  16. 使用ListIterator 对List遍历时修改,删除
  17. 基于采样的规划算法之RRT家族(三):RRT*
  18. C#中MemoryStream类的介绍
  19. 有利可图网_有利可图的项目的目录
  20. Windows保护模式(三)长调用与短调用调用门

热门文章

  1. 三次插值ClampedB样条曲线Matlab代码实现
  2. Sencha Cmd自动构建ExtJs项目框架
  3. mysql 1698_MySQL-1698 : Access denied for user 'root'@'localhost'解决方法
  4. mysql 从从(主主)复制(故障转移)
  5. 阿里云服务器安装并配置nginx代理转发请求
  6. js 预编译 AO对象跟GO对象
  7. html怎样自动播放视频,html5自动播放mov格式视频的实例代码
  8. 五猴分桃python_猴子分桃问题——一个简单的递归
  9. Android R 通知新特性—人与对话(气泡窗)
  10. 不适合学习编程的人是你吗?