打印
[电机及执行机构驱动]

关于无刷电机电流环问题(续f40372660坛友)

[复制链接]
2012|4
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
飞驰的蜗牛|  楼主 | 2015-4-10 09:54 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
关于网友f40372660的提问其实是 速度环与电流环之间衔接问题,很多大大们其实说的是电流环的本质,本人从***论坛的 asdmail   的一个程序,与大大们探讨下
//----------------------------------------------------------------------
//速度闭环PID计算程序
//----------------------------------------------------------------------
void Speed_Pid(void)
{   
    //DesiredSpeed = Motor_Speed/14;
    if(Speed >= DesiredSpeed)    //计算偏差
    {
       SpeedError = Speed - DesiredSpeed;  //测量值大于给定值
       Flags.Speed_error_dir = 1;          //偏差为负数
    }
    else
    {
       SpeedError = DesiredSpeed - Speed;  //给定值大于测量值
       Flags.Speed_error_dir= 0;           //偏差为正负数
    }      
    Txbuff[4] = SpeedError >>8; //将速度偏差值存入发送缓存
    Txbuff[5] = SpeedError & 0x00FF;
    //Speed = 0x0000;   //得到偏差后,将测量到得数据清空

    if(Flags.Speed_error_dir ==0)    //偏差为正数,则积分数据和偏差相加
    {  
       SpeedIntegral = SpeedIntegral + SpeedError;  //对偏差进行积分
    }

    else  //偏差为负数,则积分数据和偏差相减  
    {
          if(SpeedIntegral>=SpeedError)  //积分大于偏差
          {
             SpeedIntegral = SpeedIntegral - SpeedError;
          }
          else //偏差大于积分
          {
             SpeedIntegral = SpeedError - SpeedIntegral;
          }
    }
           
    if(SpeedIntegral >2000)  //积分限幅
       {
         SpeedIntegral = 2000;
       }
    Speed_PID = (SpeedError + SpeedIntegral*0 )/100;
    Txbuff[8] = Speed_PID >>8;  //将电机速度PID数据存入发送缓存
    Txbuff[9] = Speed_PID & 0x00FF;
这是速度环的代码

//----------------------------------------------------------------
//电流闭环PID计算程序
//----------------------------------------------------------------
void Current_Pid(void)   
{   
    DesiredCurrent = Speed_PID;    //将速度环输出转换为电流环输入
    if(Current >= DesiredCurrent)   //计算电流偏差
    {
         CurrentError = Current - DesiredCurrent;  //测量值大于给定值
         Flags.Current_error_dir = 1;              //偏差为负
    }
    else
    {
         CurrentError = DesiredCurrent - Current;  //给定值大于测量值
         Flags.Current_error_dir= 0;               //偏差为正
    }      
    //Current = 0x0000;   //得到偏差后,将测量到的数据清空
    if(Flags.Speed_error_dir ==0)    //根据偏差方向,决定积分数据和偏差是相加还是相减
    {   
       CurrentIntegral = CurrentIntegral + CurrentError;  //对偏差进行积分
    }
    else
    {
       if(CurrentIntegral>=CurrentError)
       {
          CurrentIntegral = CurrentIntegral - CurrentError;
       }
       else
       {
          CurrentIntegral = CurrentError - CurrentIntegral;
       }
    }               
    if(CurrentIntegral >2000)  //积分限幅
       {
         CurrentIntegral = 2000;
       }
    Current_PID = (CurrentError + CurrentIntegral/20 )/20;
    if(Flags.Speed_error_dir==0)
    {
       if(DutyCycle >= 65000)
       {
          DutyCycle = 65535;
       }
       else
       {
          DutyCycle = Current_PID + DutyCycle;    //电机加速
          if(DutyCycle >=65000)
          {
             DutyCycle = 65535;
          }
       }
    }
    else                                        ////电机减速
    {
       if(DutyCycle >= Current_PID)
       {
          DutyCycle = DutyCycle - Current_PID;
       }
       else
       {
          DutyCycle = Current_PID - DutyCycle;
       }
    }
    PDC1 = DutyCycle;
    PDC2 = PDC1;
    PDC3 = PDC1;
    Txbuff[6] = DutyCycle >>8; //将电机占空比数据存入发送缓存
    Txbuff[7] = DutyCycle & 0x00FF;            
   这是电流环的代码

其实问题很简单,就是在代码中红色的 DesiredCurrent = Speed_PID;    //将速度环输出转换为电流环输入
在速度环中处理出来的输出 Speed_PID 电流环的给定
DesiredCurrent,中间不需要一些变换吗?

相关帖子

沙发
charrijon| | 2015-4-13 23:10 | 只看该作者
你这个程序实现是没问题,但是真正使用的时候可能会碰到点麻烦,KP,KR,KI都是需要调节的,可是这个不直观

使用特权

评论回复
板凳
飞驰的蜗牛|  楼主 | 2015-4-14 09:10 | 只看该作者
charrijon 发表于 2015-4-13 23:10
你这个程序实现是没问题,但是真正使用的时候可能会碰到点麻烦,KP,KR,KI都是需要调节的,可是这个不直观 ...

这个我知道,KI KP KD  我都实际调试过,这是从化某论坛一个网友的程序。可能您是没理解我意思,我意思是外环的输出是内环的给定,就这个数值而言需不需要进行某个数学变化?

使用特权

评论回复
地板
wang863| | 2015-4-15 09:43 | 只看该作者
不需要的,速度环的PID出来直接就是电流环的输入。只是PID的结果需要来个限幅环节。
电流环的PID出来是占空比,不过由于这个占空比有范围要求,占空比可能需要做个处理。

使用特权

评论回复
5
mmuuss586| | 2015-4-19 17:50 | 只看该作者

学习下;

使用特权

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

本版积分规则

6

主题

22

帖子

0

粉丝