找回密码
 立即注册

QQ登录

只需一步,快速开始

手机号码,快捷登录

手机号码,快捷登录

Flux电机有限元分析教程西莫团购入口 | 奖励入口当当网购物入口 | 奖励入口欢迎使用!西莫论坛App开放下载Motor-CAD电机多物理域设计教材购买入口 | 奖励入口
★新会员论坛须知★《西莫电机技术》第39期发售火热进行中Flux电机电磁阀有限元分析教程团购入口 | 奖励入口论坛微信公众平台欢迎入驻
西莫电机及相关产品供需交流群开放邀请★ 论坛VIP会员申请 ★Motor-CAD.MANATEE电磁热振动噪声教程 | 奖励入口西莫团队欢迎您的加盟!
宣传推广合作请联系QQ:25941174西莫电机论坛微信群正式开放Flux变压器与电抗器有限元分析团购入口 | 奖励入口西莫电机论坛技术版区QQ群汇总
查看: 4714|回复: 7

[原创] 旋转变压器做为速度反馈时的计算程序

[复制链接]

该用户从未签到

发表于 2012-8-6 20:48 | 显示全部楼层 |阅读模式 来自: 中国重庆

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?立即注册

×
/*=====================================================================================
File name:        RESOLVER.C  (IQ version)                  
                    
Originator:        Digital Control Systems Group
                        Texas Instruments

Description:  Speed and position measurement computation based resolver                  

=====================================================================================
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 "resolver.h"

void resolver_calc(RESOLVER *v)
{

   demodulator_calc(v);
   filter_calc(v);
   position_speed_calc(v);
//   angle_comp_calc(v);

}


void demodulator_calc(RESOLVER *v)
{


   v->DemodSin = v->SinIn;
   v->DemodCos = v->CosIn;

/*
// Inputs: v->SinIn, v->CosIn
// Outputs: v->DemodSin, v->DemodCos

   int16 i;

   // Pass the previous resolver signals   
   for(i=v->DemodConst-1;i>0;i--)  {
      v->PreviousDemodSin[i] = v->PreviousDemodSin[i-1];
      v->PreviousDemodCos[i] = v->PreviousDemodCos[i-1];
   }
   
   // Index zero in the array keeps the current resolver signals
   v->PreviousDemodSin[0] = v->SinIn;
   v->PreviousDemodCos[0] = v->CosIn;
   
   // Initialize the demodulated signals
   v->DemodSin = 0;
   v->DemodCos = 0;

   // Demodulate the resolver signals
  for(i=0;i<v->DemodConst;i++)  {
     if (_IQabs(v->PreviousDemodSin[i]) > v->DemodSin)
        v->DemodSin = _IQabs(v->PreviousDemodSin[i]);
     if (_IQabs(v->PreviousDemodCos[i]) > v->DemodCos)
        v->DemodCos = _IQabs(v->PreviousDemodCos[i]);
   }
*/
}


void filter_calc(RESOLVER *v)
{

// Inputs: v->DemodSin, v->DemodCos
// Outputs: v->FilteredSin, v->FilteredCos

   int16 i;

   // Initialize the filtered signals
   v->FilteredSin = 0;
   v->FilteredCos = 0;

   for(i=17;i>=0;i--)  {
     
     if (i>0) {
       // Pass the previous demodulated signals
       v->PreviousSin[i] = v->PreviousSin[i-1];
       v->PreviousCos[i] = v->PreviousCos[i-1];
     }  
     else  {
       // Index zero in the array keeps the current demodulated signals
       v->PreviousSin[0] = v->DemodSin;
       v->PreviousCos[0] = v->DemodCos;
     }

     // Filtering the signals
     v->FilteredSin += _IQmpy(v->FilterGain[i],v->PreviousSin[i]);
     v->FilteredCos += _IQmpy(v->FilterGain[i],v->PreviousCos[i]);

   }
}


void position_speed_calc(RESOLVER *v)
{

// Inputs: v->FilteredSin, v->FilteredCos
// Outputs: v->ElecTheta, v->MechTheta, v->RefTheta, v->Speed

   _iq Tmp1,  FilterGain;

   // Amplify the filtered signals
   v->AmplifiedSin = _IQmpy(v->SignalGain,v->FilteredSin);
   v->AmplifiedCos = _IQmpy(v->SignalGain,v->FilteredCos);
  // v->AmplifiedSin = _IQmpy(v->SignalGain,v->SinIn);
  // v->AmplifiedCos = _IQmpy(v->SignalGain,v->CosIn);

   // Arctan function
   Tmp1 = _IQatan2PU(v->AmplifiedSin,v->AmplifiedCos);
   // Low-pass filter for resolver angles
   FilterGain = _IQ(0);//_IQ(0.95);
   v->FilterTheta1 = _IQmpy(FilterGain,v->FilterTheta1) + _IQmpy((_IQ(1)-FilterGain),Tmp1);
   // Rotor speed computation

   if ((v->FilterTheta1 > _IQ(0.75))&(v->OldTheta < _IQ(0.25)))
      Tmp1 = _IQ21mpy(v->K1,(_IQ(-1)+ v->FilterTheta1 - v->OldTheta));
   else if ((v->OldTheta > _IQ(0.75))&(v->FilterTheta1 < _IQ(0.25)))
      Tmp1 = _IQ21mpy(v->K1,(_IQ(1)- v->OldTheta + v->FilterTheta1));
   else
      Tmp1 = _IQ21mpy(v->K1,(v->FilterTheta1 - v->OldTheta));

   // Low-pass filter for calculated speed
   FilterGain = _IQ(0.95);
   v->Speed = _IQmpy(FilterGain,v->Speed) + _IQmpy((_IQ(1)-FilterGain),Tmp1);

   // Limit the calculated speed within (-1,1)
   if (v->Speed > _IQ(1))
       v->Speed = _IQ(1);
   else if (v->Speed < _IQ(-1))
      v->Speed = _IQ(-1);

   // Update the mechanical angle
   v->OldTheta = v->FilterTheta1;


    v->MechTheta = v->FilterTheta1;

    if (v->MechTheta >= _IQ(1))
       v->MechTheta = _IQ(1);
    if (v->MechTheta < _IQ(0))
       v->MechTheta = _IQ(0);

    // Low-pass filter
    FilterGain = _IQ(0.70);
    v->RefTheta = _IQmpy(FilterGain,v->RefTheta) + _IQmpy((_IQ(1)-FilterGain),v->MechTheta);

    // Compute electrical angle
    v->ElecTheta = v->MechTheta*v->PolePairs;
    if (v->ElecTheta >= _IQ(1))
       v->ElecTheta -= _IQ(1);

   // Change motor speed from pu value to rpm value (Q15 -> Q0)
   // Q0 = Q0*GLOBAL_Q => _IQXmpy(), X = GLOBAL_Q
    v->SpeedRpm = _IQmpy(v->BaseRpm,v->Speed);

}


void angle_comp_calc(RESOLVER *v)
{

// Inputs: v->RefTheta
// Outputs: v->OutputTheta

    // Convert OutputTheta to from mechanical to electrical angle  
    v->OutputTheta = v->RefTheta*v->PolePairs;

    if (v->OutputTheta >= _IQ(1))
       v->OutputTheta -= _IQ(1);

    // Compensate the mechanical angle between resolver signal and back EMF of winding a
    v->OutputTheta += v->CalibratedAngle;

    if (v->OutputTheta >= _IQ(1))
       v->OutputTheta -= _IQ(1);

    // (0.125 pu)*v->PolePairs pu = (45 deg)*v->PolePairs  electrical degree
     v->OutputTheta += _IQ1mpy(v->PolePairs,_IQ25(0.125));

    if (v->OutputTheta >= _IQ(1))
       v->OutputTheta -= _IQ(1);

    // _IQ(0.171) = Mechanical phase delay at base speed due to low-pass filter (FIR 17-order)
     v->OutputTheta += _IQmpy(v->Speed,_IQ1mpy(v->PolePairs,_IQ25(0.171)));

    if (v->OutputTheta >= _IQ(1))
     v->OutputTheta -= _IQ(1);

    // _IQ(0.09) = Mechanical phase delay at base speed due to low-pass filter (1-order)
     v->OutputTheta += _IQmpy(v->Speed,_IQ1mpy(v->PolePairs,_IQ25(0.09)));

    if (v->OutputTheta >= _IQ(1))
      v->OutputTheta -= _IQ(1);
}

有部分不是很理解 可以相互讨论哈
西莫电机论坛微信公众平台正式上线!★详情请点击★ 西莫电机论坛会员交流专用群欢迎您西莫电机论坛加群请注明论坛用户名及所从事专业,否则不予通过

该用户从未签到

 楼主| 发表于 2012-8-6 20:49 | 显示全部楼层 来自: 中国重庆
是在cd程序库 里面下的  看名字可以看出是ti公司的代码
西莫电机论坛微信公众平台正式上线!★详情请点击★ 西莫电机论坛会员交流专用群欢迎您西莫电机论坛加群请注明论坛用户名及所从事专业,否则不予通过
回复

使用道具 举报

该用户从未签到

 楼主| 发表于 2012-8-7 15:24 | 显示全部楼层 来自: 中国重庆
用编码器做为转速反馈和用旋变做反馈的代码的区别是哪些
西莫电机论坛微信公众平台正式上线!★详情请点击★ 西莫电机论坛会员交流专用群欢迎您西莫电机论坛加群请注明论坛用户名及所从事专业,否则不予通过
回复

使用道具 举报

该用户从未签到

 楼主| 发表于 2012-8-8 09:42 | 显示全部楼层 来自: 中国重庆
有没有
知道

交流一下
西莫电机论坛微信公众平台正式上线!★详情请点击★ 西莫电机论坛会员交流专用群欢迎您西莫电机论坛加群请注明论坛用户名及所从事专业,否则不予通过
回复

使用道具 举报

该用户从未签到

发表于 2013-7-31 21:16 | 显示全部楼层 来自: 中国河北保定
大家快快讨论下啊,坐等高人
西莫电机论坛微信公众平台正式上线!★详情请点击★ 西莫电机论坛会员交流专用群欢迎您西莫电机论坛加群请注明论坛用户名及所从事专业,否则不予通过
回复

使用道具 举报

该用户从未签到

发表于 2013-8-1 08:43 | 显示全部楼层 来自: 中国上海
我来尝试说一下。
回3楼:
常规的光电编码器分三种:增量式方波、增量式正弦波和绝对值式的。
旋变和增量式正弦波和绝对值式的解码代码一致。而增量式方波是通过对上升沿或者下降沿计数来做解码的。
西莫电机论坛微信公众平台正式上线!★详情请点击★ 西莫电机论坛会员交流专用群欢迎您西莫电机论坛加群请注明论坛用户名及所从事专业,否则不予通过
回复

使用道具 举报

该用户从未签到

发表于 2013-8-6 11:39 | 显示全部楼层 来自: 中国安徽合肥
在ti代码库没有看到旋转变压器的doc文档啊
西莫电机论坛微信公众平台正式上线!★详情请点击★ 西莫电机论坛会员交流专用群欢迎您西莫电机论坛加群请注明论坛用户名及所从事专业,否则不予通过
回复

使用道具 举报

该用户从未签到

发表于 2018-10-31 12:46 | 显示全部楼层 来自: 中国江西南昌
电角度与机械角度中间相当于一个变速比
西莫电机论坛微信公众平台正式上线!★详情请点击★ 西莫电机论坛会员交流专用群欢迎您西莫电机论坛加群请注明论坛用户名及所从事专业,否则不予通过
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

西莫电机论坛微信公众平台欢迎您的关注!

QQ|Archiver|手机版|小黑屋|西莫电机圈 ( 浙ICP备10025899号-3|浙公网安备:33028202000436号 )

GMT+8, 2024-12-22 10:24 , Processed in 0.373819 second(s), 26 queries .

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

快速回复 返回顶部 返回列表