- 积分
- 13759
- 回帖
- 0
- 西莫币
-
- 贡献
-
- 威望
-
- 存款
-
- 阅读权限
- 150
- 最后登录
- 1970-1-1
签到天数: 10 天 连续签到: 1 天 [LV.3]偶尔看看II
|
马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
您需要 登录 才可以下载或查看,没有账号?立即注册
×
这两天在看三相异步电机的磁链观测法里面的计算,但是一直没看明白怎么在程序中求出角度,下面是别人的程序
/**********************读编码脉冲数,计算转角增量和转角绝对位置************************/
#include"qmath.h" ●☆★☆★☆★☆★☆★☆★●
#define Ktheta 26844 //角度系数
extern pulse;
extern theta_m; //Q0 theta_m要进行初始定位,0~2500
unsigned int count0=0; //Q0
unsigned int theta_e; //Q0
int count; //每个电流采样周期内的脉冲增量,电机的正反转决定其正负值,正转编码器增计数,反转减计数
int sin_theta,cos_theta; //Q15
int s_count=0; //每个速度采样周期内的脉冲增量,电机的正反转决定其正负值,正转编码器增计数,反转减计数
void theta_calc()
{
unsigned int count1; //Q0
int theta_e_p; //Q0
int theta_e_pu15; //Q15
count1=pulse; //读编码脉冲数 以theta0点作为脉冲计数的零点
count=count1-count0; //计算每个电流采样周期内的编码器脉冲增量值
//处理编码器读数溢出的情况,即pulse的溢出,计数值会由65535变为0或者由0变为65535
//由于在电机正转转速为最大值3000r/min时count的值最大为50,将范围放宽一些,取值为100
//由于在电机反转转速为最大值-3000r/min时count的值最小为-50,将范围放宽一些,取值为100
if(count<-100) count=count+30000; //count溢出时的处理
else if(count>100) count=count-30000;
s_count=s_count+count; //累加速度采样周期内的脉冲增量
theta_m=count+theta_m; //机械角度,并将范围调整为(0,10000)
if(theta_m<0)
{
theta_m=theta_m+10000;
}
else if(theta_m>10000)
{
theta_m=theta_m-10000;
}
count0=count1; //更新初始计数值 Q0
//计算绝对电角度 在parke,clarke变换中用的是电角度
theta_e=4*theta_m; //电角度的范围是(0,40000)
while(theta_e>10000) //将其范围变到(0,10000)
{
theta_e=theta_e-10000;
}
theta_e_p=theta_e-5000; //范围-5000~5000
theta_e_pu15=(int)(((long)Ktheta*theta_e_p)>>12); //theta_e_pu15 为Q15格式
//计算电角度的sin,cos值,Q15格式
sin_theta=qsinlt(theta_e_pu15); //Q15
cos_theta=qcoslt(theta_e_pu15); //Q15
}
那个角度系数是怎么来的?数学模型上的计算公式和程序是怎么对应起来的呢?望高手指点指点 |
|