UniqueLion 发表于 2011-5-30 16:16:13

四轴代码 analog.c 中问题,(研究过MK源码的请进,谢谢)

(1)ISR(ADC_vect)是ADC中断。
(2)ADCMUX是选择器(用来选择下次ADC接受的信号是AD0还是AD2或者其他。。。)
   ADMUX = 0;    //初始化时候用到

(3)由FC的硬件电路原理图可知如下:
#define AD_GIER   0        //GYRO_GIER
#define AD_ROLL   1        //GYRO_ROLL
#define AD_NICK   2        //GYRO_NICK
#define AD_DRUCK    3        //空气压力传感器
#define AD_UBAT   4        //spannung电压
#define AD_ACC_Z    5        //ACC_H
#define AD_ACC_Y    6        //ACC_R
#define AD_ACC_X    7        //ACC_N

(4)state=0//初始状态0





我的问题如下:

在ISR(ADC_vect)中
      case 0:
            nick1 = ADC;
            kanal = AD_ROLL;
            break;

按照上面(3)的硬件逻辑图,ADCMUX=0时候,ADC数据寄存器收到的应该是GYRO_GIER,为什么 case0中却是nick1?












ISR(ADC_vect)
//#######################################################################################
{
    static unsigned char kanal=0,state = 0;
        static signed char subcount = 0;
    static signed int gier1, roll1, nick1, nick_filter, roll_filter;
        static signed int accy, accx;
        static long tmpLuftdruck = 0;
        static char messanzahl_Druck = 0;
    switch(state++)
      {
      case 0:
            nick1 = ADC;
            kanal = AD_ROLL;
            break;
      case 1:
            roll1 = ADC;
                  kanal = AD_GIER;
            break;
      case 2:
            gier1 = ADC;
            kanal = AD_ACC_Y;
            break;
      case 3:
            Aktuell_ay = NeutralAccY - ADC;
            accy = Aktuell_ay;
                  kanal = AD_ACC_X;
            break;
      case 4:
            Aktuell_ax = ADC - NeutralAccX;
            accx =Aktuell_ax;
            kanal = AD_NICK;
            break;
      case 5:
            nick1 += ADC;
            kanal = AD_ROLL;
            break;
      case 6:
            roll1 += ADC;
            kanal = AD_UBAT;
            break;
      case 7:
#if (defined(__AVR_ATmega1284__) || defined(__AVR_ATmega1284P__))
            if(EE_Parameter.ExtraConfig & CFG_3_3V_REFERENCE) UBat = (3 * UBat + (11 * ADC) / 30) / 4; // there were some single FC2.1 with 3.3V reference
                        else   
#endif
                        UBat = (3 * UBat + ADC / 3) / 4;
                  kanal = AD_ACC_Z;
            break;
       case 8:
            AdWertAccHoch =(signed int) ADC - NeutralAccZ;
            if(AdWertAccHoch > 1)
             {
            if(NeutralAccZ < 750)
               {
                subcount += 5;
                if(modell_fliegt < 500) subcount += 10;
               }
            if(subcount > 100) { NeutralAccZ++; subcount -= 100;}
             }
             else if(AdWertAccHoch < -1)
             {
            if(NeutralAccZ > 550)
                {
               subcount -= 5;
               if(modell_fliegt < 500) subcount -= 10;
               if(subcount < -100) { NeutralAccZ--; subcount += 100;}
                }
             }
            messanzahl_AccHoch = 1;
            Aktuell_az = ADC;
            Mess_Integral_Hoch += AdWertAccHoch;      // Integrieren
            Mess_Integral_Hoch -= Mess_Integral_Hoch / 1024; // d鋗fen
                kanal = AD_DRUCK;
            break;
   // "case 9:" fehlt hier absichtlich
      case 10:
            nick1 += ADC;
            kanal = AD_ROLL;
            break;
      case 11:
            roll1 += ADC;
                  kanal = AD_GIER;
            break;
      case 12:
            if(PlatinenVersion == 10)AdWertGier = (ADC + gier1 + 1) / 2;
            else
            if(PlatinenVersion >= 20)AdWertGier = 2047 - (ADC + gier1);
                        else                                            AdWertGier = (ADC + gier1);
            kanal = AD_ACC_Y;
            break;
      case 13:
            Aktuell_ay = NeutralAccY - ADC;
            AdWertAccRoll = (Aktuell_ay + accy);
            kanal = AD_ACC_X;
            break;
      case 14:
            Aktuell_ax = ADC - NeutralAccX;
            AdWertAccNick =(Aktuell_ax + accx);
            kanal = AD_NICK;
            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;
      case 16:
            roll1 += ADC;
            if(PlatinenVersion == 10) roll1 *= 2; else roll1 *= 4;
            AdWertRoll = roll1 / 8;
            roll_filter = (roll_filter + roll1) / 2;
            HiResRoll = roll_filter - AdNeutralRoll;
            AdWertRollFilter = (AdWertRollFilter + HiResRoll) / 2;
                kanal = AD_DRUCK;
            break;
      case 17:
            state = 0;
                        AdReady = 1;
            ZaehlMessungen++;
            // "break" fehlt hier absichtlich
      case 9:
              MessLuftdruck = ADC;
            tmpLuftdruck += MessLuftdruck;
            if(++messanzahl_Druck >= 18)
            {
                                Luftdruck = (7 * Luftdruck + tmpLuftdruck - (18 * 523) * (long)ExpandBaro + 4) / 8;// -523.19 counts per 10 counts offset step
                                HoehenWert = StartLuftdruck - Luftdruck;
                                SummenHoehe -= SummenHoehe/SM_FILTER;
                                SummenHoehe += HoehenWert;
                                VarioMeter = (31 * VarioMeter + 8 * (int)(HoehenWert - SummenHoehe/SM_FILTER))/32;
                tmpLuftdruck /= 2;
                messanzahl_Druck = 18/2;
            }
            kanal = AD_NICK;
            break;
      default:
            kanal = 0; state = 0; kanal = AD_NICK;
            break;
      }
    ADMUX = kanal;
    if(state != 0) ANALOG_ON;
}

Chester 发表于 2011-7-7 19:00:59

只要把通道都AD了就行,通道采样的顺序是无所谓的哦
页: [1]
查看完整版本: 四轴代码 analog.c 中问题,(研究过MK源码的请进,谢谢)