⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 main.c

📁 此程序是无传感器无刷电机控制程序(mege8)
💻 C
📖 第 1 页 / 共 2 页
字号:
        } 
        else // default
        {
     unsigned char i;     
         printf("\n\rGenerating default Mixer Table");
         for(i=0; i<16;i++) { Mixer.Motor[i][0] = 0;Mixer.Motor[i][1] = 0;Mixer.Motor[i][2] = 0;Mixer.Motor[i][3] = 0;};
     // default = Quadro
     Mixer.Motor[0][0] = 64; Mixer.Motor[0][1] = +64; Mixer.Motor[0][2] =   0; Mixer.Motor[0][3] = +64;
     Mixer.Motor[1][0] = 64; Mixer.Motor[1][1] = -64; Mixer.Motor[1][2] =   0; Mixer.Motor[1][3] = +64;
     Mixer.Motor[2][0] = 64; Mixer.Motor[2][1] =   0; Mixer.Motor[2][2] = -64; Mixer.Motor[2][3] = -64;
     Mixer.Motor[3][0] = 64; Mixer.Motor[3][1] =   0; Mixer.Motor[3][2] = +64; Mixer.Motor[3][3] = -64;
         Mixer.Revision = MIXER_REVISION;
     memcpy(Mixer.Name, "Quadro\0", 11);   
     eeprom_write_block(&Mixer, &EEPromArray[EEPROM_ADR_MIXER_TABLE], sizeof(Mixer));
    }
    printf("\n\rMixer-Config: '%s' (%u Motors)",Mixer.Name,RequiredMotors);
// +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
// + Check connected BL-Ctrls
// +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
        printf("\n\rFound BL-Ctrl: ");
    motorread = 0;   UpdateMotor = 0;   SendMotorData(); while(!UpdateMotor); motorread = 0;  // read the first I2C-Data
        for(i=0; i < MAX_MOTORS; i++)
         {
          UpdateMotor = 0;
      SendMotorData();
          while(!UpdateMotor);
          if(MotorPresent[i]) printf("%d ",i+1);
     }
        for(i=0; i < MAX_MOTORS; i++)
         {
          if(!MotorPresent[i] && Mixer.Motor[i][0] > 0) printf("\n\r\n\r!! MISSING BL-CTRL: %d !!",i+1);
          MotorError[i] = 0;
     }
        printf("\n\r===================================");
// +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
// + Check Settings
// +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
    if(eeprom_read_byte(&EEPromArray[EEPROM_ADR_VALID]) != EE_DATENREVISION)
        {
          DefaultKonstanten1();
          printf("\n\rInit. EEPROM");
          for (unsigned char i=1;i<6;i++)
      {
       if(i==2) DefaultKonstanten2(); // Kamera
       if(i==3) DefaultKonstanten3(); // Beginner
       if(i>3)  DefaultKonstanten2(); // Kamera
           if(PlatinenVersion >= 20) 
            { 
                 EE_Parameter.Gyro_D = 5;
                 EE_Parameter.Driftkomp = 0;
                 EE_Parameter.GyroAccFaktor = 27;
         EE_Parameter.WinkelUmschlagNick = 78;
         EE_Parameter.WinkelUmschlagRoll = 78;
                }
    // valid Stick-Settings?
           if(eeprom_read_byte(&EEPromArray[EEPROM_ADR_CHANNELS]) < 12 && eeprom_read_byte(&EEPromArray[EEPROM_ADR_CHANNELS+1]) < 12 && eeprom_read_byte(&EEPromArray[EEPROM_ADR_CHANNELS+2]) < 12 && eeprom_read_byte(&EEPromArray[EEPROM_ADR_CHANNELS+3]) < 12)
            {
         EE_Parameter.Kanalbelegung[0] = eeprom_read_byte(&EEPromArray[EEPROM_ADR_CHANNELS+0]);
         EE_Parameter.Kanalbelegung[1] = eeprom_read_byte(&EEPromArray[EEPROM_ADR_CHANNELS+1]);
         EE_Parameter.Kanalbelegung[2] = eeprom_read_byte(&EEPromArray[EEPROM_ADR_CHANNELS+2]);
         EE_Parameter.Kanalbelegung[3] = eeprom_read_byte(&EEPromArray[EEPROM_ADR_CHANNELS+3]);
         EE_Parameter.Kanalbelegung[4] = eeprom_read_byte(&EEPromArray[EEPROM_ADR_CHANNELS+4]);
         EE_Parameter.Kanalbelegung[5] = eeprom_read_byte(&EEPromArray[EEPROM_ADR_CHANNELS+5]);
         EE_Parameter.Kanalbelegung[6] = eeprom_read_byte(&EEPromArray[EEPROM_ADR_CHANNELS+6]);
         EE_Parameter.Kanalbelegung[7] = eeprom_read_byte(&EEPromArray[EEPROM_ADR_CHANNELS+7]);
         if(i==1) printf(": Generating Default-Parameter using old Stick Settings");
                } else DefaultStickMapping();
       WriteParameterSet(i, (unsigned char *) &EE_Parameter.Kanalbelegung[0], STRUCT_PARAM_LAENGE);
      }
          SetActiveParamSetNumber(3); // default-Setting
          eeprom_write_byte(&EEPromArray[EEPROM_ADR_VALID], EE_DATENREVISION);
        }

    if(eeprom_read_byte(&EEPromArray[EEPROM_ADR_ACC_NICK]) > 4)
     {
       printf("\n\rACC not calibrated !");
     }

        ReadParameterSet(GetActiveParamSetNumber(), (unsigned char *) &EE_Parameter.Kanalbelegung[0], STRUCT_PARAM_LAENGE);
    printf("\n\rUsing parameterset %d", GetActiveParamSetNumber());


        if(EE_Parameter.GlobalConfig & CFG_HOEHENREGELUNG)
         {
           printf("\n\rCalibrating pressure sensor..");
           timer = SetDelay(1000);
       SucheLuftruckOffset();
           while (!CheckDelay(timer));
       printf("OK\n\r");
        }

        SetNeutral();

        ROT_OFF;

    beeptime = 2000;
    ExternControl.Digital[0] = 0x55;


        printf("\n\rControl: ");
        if (EE_Parameter.GlobalConfig & CFG_HEADING_HOLD) printf("HeadingHold");
        else printf("Normal (ACC-Mode)");

        printf("\n\r===================================\n\r");

    LcdClear();
    I2CTimeout = 5000;
    WinkelOut.Orientation = 1;
        while (1)
        {
            if(UpdateMotor && AdReady)      // ReglerIntervall
            {
                    UpdateMotor=0;
            if(WinkelOut.CalcState) CalMk3Mag();
            else MotorRegler();
            SendMotorData();
            ROT_OFF;
            if(PcZugriff) PcZugriff--;
             else
              {
                           ExternControl.Config = 0;
               ExternStickNick = 0;
               ExternStickRoll = 0;
               ExternStickGier = 0;
              }
            if(SenderOkay)  SenderOkay--;
            if(NaviDataOkay) 
                         {
                          if(--NaviDataOkay == 0)
                           {
                    GPS_Nick = 0;
                GPS_Roll = 0;
               }
              }
            if(!--I2CTimeout || MissingMotor)
                {
                  if(!I2CTimeout) 
                                   {
                                    i2c_reset();
                    I2CTimeout = 5;
                                        }
                  if((BeepMuster == 0xffff) && MotorenEin)
                   {
                    beeptime = 10000;
                    BeepMuster = 0x0080;
                   }
                }
            else
                {
                 ROT_OFF;
                }
            if(SIO_DEBUG && (!UpdateMotor || !MotorenEin))
              {
               DatenUebertragung();
               BearbeiteRxDaten();
              }
              else BearbeiteRxDaten();
         if(CheckDelay(timer))
            {
            if(UBat < EE_Parameter.UnterspannungsWarnung)
                {
                  if(BeepMuster == 0xffff)
                   {
                    beeptime = 6000;
                    BeepMuster = 0x0300;
                   }
                }
             SPI_StartTransmitPacket();

             SendSPI = 4;
                         timer = SetDelay(20);
            }
           LED_Update();
          }
     if(!SendSPI) { SPI_TransmitByte(); }
    }
 return (1);
}


//if(HoehenReglerAktiv && NaviDataOkay && SenderOkay < 160 && SenderOkay > 10 && FromNaviCtrl_Value.SerialDataOkay > 220) SenderOkay = 160;
//if(HoehenReglerAktiv && NaviDataOkay && SenderOkay < 101 && SenderOkay > 10 && FromNaviCtrl_Value.SerialDataOkay > 1) SenderOkay = 101;

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -