5iMX宗旨:分享遥控模型兴趣爱好

5iMX.com 我爱模型 玩家论坛 ——专业遥控模型和无人机玩家论坛(玩模型就上我爱模型,创始于2003年)
查看: 7165|回复: 50
打印 上一主题 下一主题

一起来研究平民化百来块钱的MWC闭环云台控制器吧。。。。

[复制链接]
跳转到指定楼层
楼主
发表于 2013-2-19 14:36 | 只看该作者 |只看大图 回帖奖励 |正序浏览 |阅读模式
本帖最后由 long0001 于 2013-2-21 11:52 编辑

crazyboyyy的帖子【抛砖引玉】mwc用于闭环云台(5楼有改进版代码)http://5imx.3vwed.com/bbs/forum.php?mod=viewthread&tid=725888&extra=page%3D3


根据crazyboyyy帖子里的教程修改代码,
1、开环时速度可以控制的很快,即使用最差的舵机都可以很快,也就是把传感器固定在机架上。
调节ROLL,PITCH,LEVEL的各自PID参数,如果使用好的舵机的话,可以达到云台稳定要求。
需要遥控器介入调整角度就修改代码:
#ifdef GIMBAL
    servo[0] = constrain(axisPID[PITCH]  + rcData[TILT_PITCH_AUX_CH], TILT_PITCH_MIN, TILT_PITCH_MAX);
    servo[1] = constrain(axisPID[ROLL] + rcData[TILT_ROLL_AUX_CH], TILT_ROLL_MIN, TILT_ROLL_MAX);
使用舵机频率选择
        #define SERVO_RFR_50HZ
     //#define SERVO_RFR_160HZ
    //#define SERVO_RFR_300HZ

2、闭环控制时速度就不够快了,也就是把传感器固定在云台上。
闭环时把LEVEL的PID参数调到最大都不够快。而且调节ROLL,PITCH的PID参数会使云台震荡。

另外,如果把飞控刷成#define AIRPLANE固定翼模式,云台舵机插到副翼(有两副翼,任选一个,如果反向就插另一个)和升降输出端,也可以控制云台。

我们的最终目标就是闭环控制,根据姿态的变化量输出控制量,希望有高手能够修改MWC程序的PID控制,利用GUI能够方便的调整PID。

个人认为以下代码就是PID控制代码,水平有限,苦研未果
//**** PITCH & ROLL & YAW PID ****
  int16_t prop;
  prop = max(abs(rcCommand[PITCH]),abs(rcCommand[ROLL])); // range [0;500]
  
  for(axis=0;axis<3;axis++) {
    if ((f.ANGLE_MODE || f.HORIZON_MODE) && axis<2 ) { // MODE relying on ACC
      // 50 degrees max inclination
      errorAngle = constrain(2*rcCommand[axis] + GPS_angle[axis],-500,+500) - angle[axis] + conf.angleTrim[axis]; //16 bits is ok here
      PTermACC = (int32_t)errorAngle*conf.P8[PIDLEVEL]/100;                          // 32 bits is needed for calculation: errorAngle*P8[PIDLEVEL] could exceed 32768   16 bits is ok for result
      PTermACC = constrain(PTermACC,-conf.D8[PIDLEVEL]*5,+conf.D8[PIDLEVEL]*5);
      errorAngleI[axis]     = constrain(errorAngleI[axis]+errorAngle,-10000,+10000);    // WindUp     //16 bits is ok here
      ITermACC              = ((int32_t)errorAngleI[axis]*conf.I8[PIDLEVEL])>>12;            // 32 bits is needed for calculation:10000*I8 could exceed 32768   16 bits is ok for result
    }
    if ( !f.ANGLE_MODE || f.HORIZON_MODE || axis == 2 ) { // MODE relying on GYRO or YAW axis
      if (abs(rcCommand[axis])<350) error =          rcCommand[axis]*10*8/conf.P8[axis] ; // 16 bits is needed for calculation: 350*10*8 = 28000      16 bits is ok for result if P8>2 (P>0.2)
                               else error = (int32_t)rcCommand[axis]*10*8/conf.P8[axis] ; // 32 bits is needed for calculation: 500*5*10*8 = 200000   16 bits is ok for result if P8>2 (P>0.2)
      error -= gyroData[axis];
      PTermGYRO = rcCommand[axis];
      
      errorGyroI[axis]  = constrain(errorGyroI[axis]+error,-16000,+16000);          // WindUp   16 bits is ok here
      if (abs(gyroData[axis])>640) errorGyroI[axis] = 0;
      ITermGYRO = (errorGyroI[axis]/125*conf.I8[axis])>>6;                                   // 16 bits is ok here 16000/125 = 128 ; 128*250 = 32000
    }
    if ( f.HORIZON_MODE && axis<2) {
      PTerm = ((int32_t)PTermACC*(500-prop) + (int32_t)PTermGYRO*prop)/500;
      ITerm = ((int32_t)ITermACC*(500-prop) + (int32_t)ITermGYRO*prop)/500;
    } else {
      if ( f.ANGLE_MODE && axis<2) {
        PTerm = PTermACC;
        ITerm = ITermACC;
      } else {
        PTerm = PTermGYRO;
        ITerm = ITermGYRO;
      }
    }
    if (abs(gyroData[axis])<160) PTerm -=          gyroData[axis]*dynP8[axis]/10/8; // 16 bits is needed for calculation   160*200 = 32000         16 bits is ok for result
                            else PTerm -= (int32_t)gyroData[axis]*dynP8[axis]/10/8; // 32 bits is needed for calculation   
    delta          = gyroData[axis] - lastGyro[axis];                               // 16 bits is ok here, the dif between 2 consecutive gyro reads is limited to 800
    lastGyro[axis] = gyroData[axis];
    deltaSum       = delta1[axis]+delta2[axis]+delta;
    delta2[axis]   = delta1[axis];
    delta1[axis]   = delta;

    if (abs(deltaSum)<640) DTerm = (deltaSum*dynD8[axis])>>5;                       // 16 bits is needed for calculation 640*50 = 32000           16 bits is ok for result
                      else DTerm = ((int32_t)deltaSum*dynD8[axis])>>5;              // 32 bits is needed for calculation
                     
    axisPID[axis] =  PTerm + ITerm - DTerm;
  }


真心希望大家群策群力,把自己会的贡献出来,造福基层模友。。。

欢迎继续阅读楼主其他信息

51
发表于 2013-9-1 00:10 | 只看该作者
必须顶起
50
发表于 2013-7-11 05:31 | 只看该作者
顶起!我也是MWC,最近想搞航模摄影,不知它本身自带的舵机云台效果如何?这个自带的,算是开环控制么?
49
发表于 2013-7-7 08:48 | 只看该作者
好帖,一定要顶
48
发表于 2013-7-5 16:29 | 只看该作者
新人学习,先顶后看,看帖必顶,回复是一种美德。
47
发表于 2013-7-5 14:39 | 只看该作者
好可惜啊~可是先帮顶起里先!

真希望MWC的这个云台.可以不只是支持舵机电机.能支持无刷电机那该多好.
46
发表于 2013-4-21 22:41 | 只看该作者
加油,希望家了尘封的MWC还有用武之地
45
 楼主| 发表于 2013-4-21 08:57 | 只看该作者
其实舵机用于开环控制还是很不错滴。。。
44
发表于 2013-4-20 20:12 | 只看该作者
高手!为大家作奉献,辛苦了,顶一把

43
发表于 2013-3-24 23:10 | 只看该作者
我的版回来啦。但我还不会接呀。也不知道在那里下 载软件,那位大大教一教我呀?
最好有家线图呀。
谢谢
42
发表于 2013-3-24 01:16 | 只看该作者
学习刷了固件,就是云台抖得厉害

41
发表于 2013-2-28 12:59 | 只看该作者
好东西 谢谢楼主
40
 楼主| 发表于 2013-2-27 17:54 | 只看该作者
kernel32 发表于 2013-2-27 16:41
MWC不是有闭环云台模式么
就是不能通过GUI调整PID

请教闭环模式在哪里设置???
39
发表于 2013-2-27 16:41 | 只看该作者
MWC不是有闭环云台模式么
就是不能通过GUI调整PID
38
 楼主| 发表于 2013-2-26 21:11 | 只看该作者
现在讨论的都是飞控只作为云台用
37
发表于 2013-2-26 20:32 | 只看该作者
太复杂,帮顶了
36
发表于 2013-2-26 08:32 | 只看该作者
long0001 发表于 2013-2-25 23:49
刷“云台模式”不需要解锁,,360 舵机应该可以。

对我是即四轴,又云台增稳,不需要解锁!插电云台就起作用, X4模式最新固件, 现在就是无法在云台增稳的情况下,遥控辅助角度,必须设置旋钮 低中高随便一个位置是增稳,其他没有增稳,开启增稳的时候辅助调节无效。

35
 楼主| 发表于 2013-2-25 23:49 | 只看该作者
huangjun 发表于 2013-2-25 20:18
这个需要解锁吧?我的想法是把普通的ouput代码copy到云台上?另外,用360度的电机是不是会方便点?

刷“云台模式”不需要解锁,,360 舵机应该可以。
34
 楼主| 发表于 2013-2-25 23:47 | 只看该作者
611055853 发表于 2013-2-25 22:42

你这是MWC即作为飞控控制四轴,又作为云台控制吗?
33
发表于 2013-2-25 22:42 | 只看该作者
long0001 发表于 2013-2-23 13:34
拍张云台图片看看。

您需要登录后才可以回帖 登录 | 我要加入

本版积分规则

关闭

【站内推荐】上一条 /1 下一条

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