yue435 发表于 2012-2-14 20:52:39

关于MK算法的一些值的取值范围的疑惑------希望各位大大尤其CNMUSIC能够赐教!

关于MK算法的一些值的取值范围的疑惑------希望各位大大尤其CNMUSIC能够赐教!
最近在看MK的算法,觉得对于里面一些值的范围不是很理解,例如MEAN()中的这一部分:

// Roll
        Reading_GyroRoll += tmpl;
        Reading_GyroRoll += (tmpl2 * FCParam.Yaw_NegFeedback) / 512L;
        Reading_IntegralGyroRoll2 += Reading_GyroRoll;
        Reading_IntegralGyroRoll +=Reading_GyroRoll - AttitudeCorrectionRoll;
        if(Reading_IntegralGyroRoll > TurnOver180Roll)
        {
                Reading_IntegralGyroRoll= -(TurnOver180Roll - 10000L);
                Reading_IntegralGyroRoll2 = Reading_IntegralGyroRoll;
        }
        if(Reading_IntegralGyroRoll < -TurnOver180Roll)
        {
                Reading_IntegralGyroRoll =(TurnOver180Roll - 10000L);
                Reading_IntegralGyroRoll2 = Reading_IntegralGyroRoll;
        }
        if(AdValueGyrRoll < 15)   Reading_GyroRoll = -1000;
        if(AdValueGyrRoll <7)   Reading_GyroRoll = -2000;
        if(BoardRelease == 10)
        {
                if(AdValueGyrRoll > 1010) Reading_GyroRoll = +1000;
                if(AdValueGyrRoll > 1017) Reading_GyroRoll = +2000;
        }
        else
        {
                if(AdValueGyrRoll > 2020) Reading_GyroRoll = +1000;
                if(AdValueGyrRoll > 2034) Reading_GyroRoll = +2000;
        }


                if(AdValueGyrRoll > 2020) Reading_GyroRoll = +1000;
                if(AdValueGyrRoll > 2034) Reading_GyroRoll = +2000;


AdValueGyrRoll不是陀螺仪的数值吗?但是AVR可是10位的AD啊,理论上最大值应该就是1024啊,为什么要写
>2020呢?仔细看了看,没有发现MK对这个值进行了放大。觉得很疑惑,请教各位了,谢谢!



还有最后的姿态结算部分


    DiffNick = Reading_GyroNick - StickNick;        // get difference
    SumNick += IntegralNick * Gyro_I_Factor - StickNick; // I-part for attitude control
   
    if(SumNick >(STICK_GAIN * 16000L)) SumNick =(STICK_GAIN * 16000L);
    if(SumNick < -(STICK_GAIN * 16000L)) SumNick = -(STICK_GAIN * 16000L);
    pd_result = DiffNick + Ki * SumNick; // PI-controller for nick

    tmp_int = (int32_t)((int32_t)FCParam.DynamicStability * (int32_t)(GasMixFraction + abs(YawMixFraction)/2)) / 64;
    if(pd_result >tmp_int) pd_result =tmp_int;
    if(pd_result < -tmp_int) pd_result = -tmp_int;

        // Motor Front
    MotorValue = GasMixFraction + pd_result + YawMixFraction;          // Mixer

根据前面提到的,KI=0.0001,而这里面与加速度计补偿陀螺有关的好想只有IntegralNick,而由IntegralNick得来的SumNick乘了
0.0001,这样的话,前面的补偿的影响不是十分小了吗?看不太明白,期待高手解答~~~

yue435 发表于 2012-2-15 17:37:21

沙发

haolxy 发表于 2012-2-15 18:01:35

楼主看看MK代买里面的Analog.c

        case 0:
                nick1 = ADC;
                kanal = AD_ROLL;
                break;

        case 5:
                nick1 += ADC;
                kanal = AD_ROLL;
                break;

        case 10:
                nick1 += ADC;
                kanal = AD_ROLL;
                break;

        case 15:
                nick1 += ADC;
                if(PlatinenVersion == 10) nick1 *= 2; else nick1 *= 4;
                AdWertNick = nick1 / 8;
                nick_filter = (nick_filter + nick1) / 2;
                HiResNick = nick_filter - AdNeutralNick;
                AdWertNickFilter = (AdWertNickFilter + HiResNick) / 2;
                kanal = AD_ROLL;
                break;


每一个周期
AdWertNick值叠加了4次,又放大了4被然后缩小了8被。
1024*4*4/8=2048
AdValueGyrRoll也是一样的。

yue435 发表于 2012-2-15 20:01:03

恩,MK代码真是够复杂啊。。。。谢谢啦!终于有人回答了。。。莫非大家都已经觉得
MK研究透了,已经转向了?感觉比较冷清啊。。。
页: [1]
查看完整版本: 关于MK算法的一些值的取值范围的疑惑------希望各位大大尤其CNMUSIC能够赐教!