PMSM矢量控制之RAMP_GEN

以下是TI给的斜坡函数RAMPGEN.H官方例程:
/* =================================================================================
File name: RAMPGEN.H (IQ version)
Originator: Digital Control Systems Group
Texas Instruments
Description:
This file contains type definitions, constants and initializers for
the ramp generation functions contained in RAMPGEN.C

=====================================================================================
History:


04-15-2005 Version 3.20
------------------------------------------------------------------------------*/
#ifndef RAMPGEN_H
#define RAMPGEN_H

typedef struct { _iq Freq; // Input: Ramp frequency (pu) 输入:斜坡频率
_iq StepAngleMax; // Parameter: Maximum step angle (pu) 参数:最大步长角度
_iq Angle; // Variable: Step angle (pu) 可变:步长角度
_iq Gain; // Input: Ramp gain (pu) 输入:斜坡增益
_iq Out; // Output: Ramp signal (pu) 输出:斜坡信号
_iq Offset; // Input: Ramp offset (pu) 输入:斜坡偏移
void (calc)(); // Pointer to calculation function 指向计算功能的指针
} RAMPGEN;
typedef RAMPGEN RAMPGEN_handle;
/
------------------------------------------------------------------------------
Object Initializers
------------------------------------------------------------------------------
/
#define RAMPGEN_DEFAULTS {0,0,0,_IQ(1),0,_IQ(1),
(void (*)(Uint32))rampgen_calc }

/------------------------------------------------------------------------------
Funtion prototypes
------------------------------------------------------------------------------
/
void rampgen_calc(RAMPGEN_handle);
#endif // RAMPGEN_H

以下是TI给的斜坡函数RAMPGEN.C官方例程:

/*=====================================================================================
File name: RAMPGEN.C (IQ version)

Originator: Digital Control Systems Group
Texas Instruments

Description: The Ramp Generation

=====================================================================================
History:


04-15-2005 Version 3.20
-------------------------------------------------------------------------------------*/

#include “IQmathLib.h” // Include header for IQmath library
// Don’t forget to set a proper GLOBAL_Q in “IQmathLib.h” file
#include “dmctype.h”
#include “rampgen.h”

void rampgen_calc(RAMPGEN *v)
{

// Compute the angle rate
v->Angle += _IQmpy(v->StepAngleMax,v->Freq);

// Saturate the angle rate within (-1,1)
if (v->Angle>_IQ(1.0))
v->Angle -= _IQ(1.0);
else if (v->Angle<_IQ(-1.0))
v->Angle += _IQ(1.0);

// Compute the ramp output
v->Out = _IQmpy(v->Angle,v->Gain) + v->Offset;

// Saturate the ramp output within (-1,1)
if (v->Out>_IQ(1.0))
v->Out -= _IQ(1.0);
else if (v->Out<_IQ(-1.0))
v->Out += _IQ(1.0);
}

一, 这个程序是个开环控制,输入量主要有3个,定子电流的d,q轴以及速度给定量speedref,这3个量实质是通过一个电流ipark变换模块联系起来的,为什么这样说呢?
因为派克变换不但需要d,q轴的分量,同时也需要旋转坐标轴的实时角度theta,而Theta角在闭环的时候可以通过观测器或者传感器得到,但是在开环的条件下,这个角度又有他另外的作用和意义了,那就是要配合你的速度给定量,把你的速度给定量转化成的实时角度。
其实道理也不复杂,角速度和角度之间的转换无非是一个比例和累加的关系,那就是拿你的当前角度加上采样周期内角度的增量,而对于恒给定的系统来说也是个常量,这个常量就是采样周期乘上速度。
二,下面说说子程序rmp_cntl.c的主要作用,该程序实际上是一个用阶梯波模拟正弦波的函数发生器,为什么要产生这个信号呢,这个信号的作用是什么呢?
我个人认为:这个阶梯波的发生器产生的是系统的输入信号,确切的说是速度给定信号,为什么要用这么一个波做为速度给定信号呢?不是已经给定了一个speedref了么?
我的理解是这样的:如果你仅仅把speedref作为给定而不做任何处理,那么这个程序就是一个开环调速的应用程序了,而本程序的作者的目的不是做一个一般的应用程序,而是一个测试程序,什么是测试程序呢,测试程序就要制造出各种输入信号而看看咱们设计的系统会有怎么样的表现,因此这个测试程序就要加上测试信号,测试信号的种类有很多,在电机控制系统中比较常见的就是正弦信号,通过给系统加上一个正弦信号,看看输出信号的幅度和相位会不会失真。(对于线形系统,这个输出信号也是三角函数波)
而我们给定的speedref在这时就变成了TargetValue,也就是阶梯波的最值。
三, 最后,着重说下子程序rampgen.c。这个程序就是个斜坡函数生成器,角度的作为输出实际上是一个斜坡信号,当你的角度增大到360度的时候又要从0开始循环,而不是从361度再继续,因为计算机的三角函数系统只有这360以内的数,就算查表也是这样的情况,不然要占用多大空间才足够呢!
下面的问题是,我每个中断周期斜坡信号要增大多少呢?这主要由3个因素决定:1,给定的速度,本测试程序的速度是由rmp_cntl.c给的阶梯波信号;
2,中断周期的时间;
3,电机的基准频率:这个频率一般就是调速的上限了,再增大就要弱磁了。
后两个因素不是很直接,也没有很严格的数量关系,但是这个程序的作者为了让该程序能适应不同的电机和硬件,把这两个因素考虑了进来,如果别人想用其他型号的电机,只需要在某些头文件或者主程序里修改这些参数就不必在修改其他程序里相关的量了。
在该程序内,后两个量的乘积实际上就是系数StepAngleMax。他影响了斜坡信号在一个中断周期内增大的幅度。
最后一个问题,那就是为什么要把Angle限制在正负1之间内,这个问题有的同学说是因为他是三角函数,我个人认为这样说不大正确,建议关注这个的朋友看看IQ_math的说明文挡,看看里面对于_IQsinPU函数定义域的说明。
这样你就明白为什么了

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值