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

📄 fc.c

📁 遥控电子玩具飞机用的控制前进后退的程序包
💻 C
📖 第 1 页 / 共 3 页
字号:
/*#######################################################################################
Flight Control
#######################################################################################*/
// ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
// + Copyright (c) 04.2007 Holger Buss
// + Nur f黵 den privaten Gebrauch
// + www.MikroKopter.com
// ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
// + Es gilt f黵 das gesamte Projekt (Hardware, Software, Bin鋜files, Sourcecode und Dokumentation), 
// + dass eine Nutzung (auch auszugsweise) nur f黵 den privaten (nicht-kommerziellen) Gebrauch zul鋝sig ist. 
// + Sollten direkte oder indirekte kommerzielle Absichten verfolgt werden, ist mit uns (info@mikrokopter.de) Kontakt 
// + bzgl. der Nutzungsbedingungen aufzunehmen. 
// + Eine kommerzielle Nutzung ist z.B.Verkauf von MikroKoptern, Best點kung und Verkauf von Platinen oder Baus鋞zen,
// + Verkauf von Luftbildaufnahmen, usw.
// ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
// + Werden Teile des Quellcodes (mit oder ohne Modifikation) weiterverwendet oder ver鰂fentlicht, 
// + unterliegen sie auch diesen Nutzungsbedingungen und diese Nutzungsbedingungen incl. Copyright m黶sen dann beiliegen
// ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
// + Sollte die Software (auch auszugesweise) oder sonstige Informationen des MikroKopter-Projekts
// + auf anderen Webseiten oder sonstigen Medien ver鰂fentlicht werden, muss unsere Webseite "http://www.mikrokopter.de"
// + eindeutig als Ursprung verlinkt werden
// ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
// + Keine Gew鋒r auf Fehlerfreiheit, Vollst鋘digkeit oder Funktion
// + Benutzung auf eigene Gefahr
// + Wir 黚ernehmen keinerlei Haftung f黵 direkte oder indirekte Personen- oder Sachsch鋎en
// ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
// + Die Portierung der Software (oder Teile davon) auf andere Systeme (ausser der Hardware von www.mikrokopter.de) ist nur 
// + mit unserer Zustimmung zul鋝sig
// ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
// + Die Funktion printf_P() unterliegt ihrer eigenen Lizenz und ist hiervon nicht betroffen
// ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
// + Redistributions of source code (with or without modifications) must retain the above copyright notice, 
// + this list of conditions and the following disclaimer.
// +   * Neither the name of the copyright holders nor the names of contributors may be used to endorse or promote products derived
// +     from this software without specific prior written permission.
// +   * The use of this project (hardware, software, binary files, sources and documentation) is only permittet 
// +     for non-commercial use (directly or indirectly)
// +     Commercial use (for excample: selling of MikroKopters, selling of PCBs, assembly, ...) is only permitted 
// +     with our written permission
// +   * If sources or documentations are redistributet on other webpages, out webpage (http://www.MikroKopter.de) must be 
// +     clearly linked as origin 
// +   * porting to systems other than hardware from www.mikrokopter.de is not allowed
// +  THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
// +  AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
// +  IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
// +  ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
// +  LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
// +  CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
// +  SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
// +  INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN// +  CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
// +  ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
// +  POSSIBILITY OF SUCH DAMAGE. 
// ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

#include "main.h"
#include "eeprom.c"

unsigned char h,m,s;
volatile unsigned int I2CTimeout = 100;
volatile int MesswertNick,MesswertRoll,MesswertGier;
volatile int AdNeutralNick = 0,AdNeutralRoll = 0,AdNeutralGier = 0,StartNeutralRoll = 0,StartNeutralNick = 0;
volatile int Mittelwert_AccNick, Mittelwert_AccRoll,Mittelwert_AccHoch, NeutralAccX=0, NeutralAccY=0;
volatile float NeutralAccZ = 0;
unsigned char CosinusNickWinkel = 0, CosinusRollWinkel = 0;
volatile long IntegralNick = 0,IntegralNick2 = 0;
volatile long IntegralRoll = 0,IntegralRoll2 = 0;
volatile long IntegralAccNick = 0,IntegralAccRoll = 0,IntegralAccZ = 0;
volatile long Integral_Gier = 0;
volatile long Mess_IntegralNick = 0,Mess_IntegralNick2 = 0;
volatile long Mess_IntegralRoll = 0,Mess_IntegralRoll2 = 0;
volatile long Mess_Integral_Gier = 0,Mess_Integral_Gier2 = 0;
volatile long MittelIntegralNick,MittelIntegralRoll,MittelIntegralNick2,MittelIntegralRoll2;
volatile long Mess_Integral_Hoch = 0;
volatile int  KompassValue = 0;
volatile int  KompassStartwert = 0;
volatile int  KompassRichtung = 0;
unsigned char MAX_GAS,MIN_GAS;
unsigned char Notlandung = 0;
unsigned char HoehenReglerAktiv = 0;
long Umschlag180Nick = 250000L, Umschlag180Roll = 250000L;

float GyroFaktor;
float IntegralFaktor;
volatile int  DiffNick,DiffRoll;
int  Poti1 = 0, Poti2 = 0, Poti3 = 0, Poti4 = 0; 
volatile unsigned char Motor_Vorne,Motor_Hinten,Motor_Rechts,Motor_Links, Count;
unsigned char MotorWert[5];
volatile unsigned char SenderOkay = 0;
int StickNick = 0,StickRoll = 0,StickGier = 0,StickGas = 0;
char MotorenEin = 0;
int HoehenWert = 0;
int SollHoehe = 0;
int LageKorrekturRoll = 0,LageKorrekturNick = 0;
float Ki =  FAKTOR_I;
unsigned char Looping_Nick = 0,Looping_Roll = 0;
unsigned char Looping_Links = 0, Looping_Rechts = 0, Looping_Unten = 0, Looping_Oben = 0;

unsigned char Parameter_Luftdruck_D  = 48;      // Wert : 0-250
unsigned char Parameter_MaxHoehe     = 251;      // Wert : 0-250
unsigned char Parameter_Hoehe_P      = 16;      // Wert : 0-32
unsigned char Parameter_Hoehe_ACC_Wirkung = 58; // Wert : 0-250
unsigned char Parameter_KompassWirkung = 64;    // Wert : 0-250
unsigned char Parameter_Gyro_P = 150;           // Wert : 10-250
unsigned char Parameter_Gyro_I = 150;           // Wert : 0-250
unsigned char Parameter_Gier_P = 2;             // Wert : 1-20
unsigned char Parameter_I_Faktor = 10;          // Wert : 1-20
unsigned char Parameter_UserParam1 = 0;
unsigned char Parameter_UserParam2 = 0;
unsigned char Parameter_UserParam3 = 0;
unsigned char Parameter_UserParam4 = 0;
unsigned char Parameter_UserParam5 = 0;
unsigned char Parameter_UserParam6 = 0;
unsigned char Parameter_UserParam7 = 0;
unsigned char Parameter_UserParam8 = 0;
unsigned char Parameter_ServoNickControl = 100;
unsigned char Parameter_LoopGasLimit = 70;
unsigned char Parameter_AchsKopplung1 = 0;
unsigned char Parameter_AchsGegenKopplung1 = 0;
unsigned char Parameter_DynamicStability = 100;
struct mk_param_struct EE_Parameter;
signed int ExternStickNick = 0,ExternStickRoll = 0,ExternStickGier = 0, ExternHoehenValue = -20;
int MaxStickNick = 0,MaxStickRoll = 0;

void Piep(unsigned char Anzahl)
{
 while(Anzahl--)
 {
  if(MotorenEin) return; //auf keinen Fall im Flug!
  beeptime = 100;
  Delay_ms(250);
 }
}

//############################################################################
//  Nullwerte ermitteln
void SetNeutral(void)
//############################################################################
{
	NeutralAccX = 0; 
	NeutralAccY = 0;
	NeutralAccZ = 0;
    AdNeutralNick = 0;	
	AdNeutralRoll = 0;	
	AdNeutralGier = 0;
    Parameter_AchsKopplung1 = 0;
    Parameter_AchsGegenKopplung1 = 0;
    CalibrierMittelwert();	
    Delay_ms_Mess(100);
	CalibrierMittelwert();
    if((EE_Parameter.GlobalConfig & CFG_HOEHENREGELUNG))  // H鰄enregelung aktiviert?
     {    
      if((MessLuftdruck > 950) || (MessLuftdruck < 750)) SucheLuftruckOffset();
     }

     AdNeutralNick= AdWertNick;	
	 AdNeutralRoll= AdWertRoll;	
	 AdNeutralGier= AdWertGier;
     StartNeutralRoll = AdNeutralRoll;
     StartNeutralNick = AdNeutralNick;
    if(eeprom_read_byte(&EEPromArray[EEPROM_ADR_ACC_NICK]) > 4) 
    {
      NeutralAccY = abs(Mittelwert_AccRoll) / ACC_AMPLIFY;
	  NeutralAccX = abs(Mittelwert_AccNick) / ACC_AMPLIFY;
	  NeutralAccZ = Aktuell_az;
    }
    else 
    {
      NeutralAccX = (int)eeprom_read_byte(&EEPromArray[EEPROM_ADR_ACC_NICK]) * 256 + (int)eeprom_read_byte(&EEPromArray[EEPROM_ADR_ACC_NICK+1]);
	  NeutralAccY = (int)eeprom_read_byte(&EEPromArray[EEPROM_ADR_ACC_ROLL]) * 256 + (int)eeprom_read_byte(&EEPromArray[EEPROM_ADR_ACC_ROLL+1]);
	  NeutralAccZ = (int)eeprom_read_byte(&EEPromArray[EEPROM_ADR_ACC_Z]) * 256 + (int)eeprom_read_byte(&EEPromArray[EEPROM_ADR_ACC_Z+1]);
    }
    
	Mess_IntegralNick = 0;	
    Mess_IntegralNick2 = 0;
    Mess_IntegralRoll = 0;	
    Mess_IntegralRoll2 = 0;
    Mess_Integral_Gier = 0;	
    MesswertNick = 0;
    MesswertRoll = 0;
    MesswertGier = 0;
    StartLuftdruck = Luftdruck;
    HoeheD = 0;
    Mess_Integral_Hoch = 0;
    KompassStartwert = KompassValue;
    GPS_Neutral();
    beeptime = 50;  
	Umschlag180Nick = (long) EE_Parameter.WinkelUmschlagNick * 2500L;
	Umschlag180Roll = (long) EE_Parameter.WinkelUmschlagRoll * 2500L;
    ExternHoehenValue = 0;
}

//############################################################################
// Bearbeitet die Messwerte
void Mittelwert(void)
//############################################################################
{ 	
    static signed long tmpl,tmpl2;	
    MesswertGier = (signed int) AdNeutralGier - AdWertGier;
    MesswertRoll = (signed int) AdWertRoll - AdNeutralRoll;
    MesswertNick = (signed int) AdWertNick - AdNeutralNick;

//DebugOut.Analog[26] = MesswertNick;
DebugOut.Analog[28] = MesswertRoll;

// Beschleunigungssensor  ++++++++++++++++++++++++++++++++++++++++++++++++
	Mittelwert_AccNick = ((long)Mittelwert_AccNick * 1 + ((ACC_AMPLIFY * (long)AdWertAccNick))) / 2L;
	Mittelwert_AccRoll = ((long)Mittelwert_AccRoll * 1 + ((ACC_AMPLIFY * (long)AdWertAccRoll))) / 2L;
	Mittelwert_AccHoch = ((long)Mittelwert_AccHoch * 1 + ((long)AdWertAccHoch)) / 2L;
    IntegralAccNick += ACC_AMPLIFY * AdWertAccNick;
    IntegralAccRoll += ACC_AMPLIFY * AdWertAccRoll;
    IntegralAccZ    += Aktuell_az - NeutralAccZ;
// Gier  ++++++++++++++++++++++++++++++++++++++++++++++++
            Mess_Integral_Gier +=  MesswertGier;
            Mess_Integral_Gier2 += MesswertGier;
// Kopplungsanteil  +++++++++++++++++++++++++++++++++++++
      if(!Looping_Nick && !Looping_Roll && (EE_Parameter.GlobalConfig & CFG_ACHSENKOPPLUNG_AKTIV))
         {
            tmpl = Mess_IntegralNick / 4096L;
            tmpl *= MesswertGier;
            tmpl *= Parameter_AchsKopplung1;  //125
            tmpl /= 2048L;
            tmpl2 = Mess_IntegralRoll / 4096L;
            tmpl2 *= MesswertGier;
            tmpl2 *= Parameter_AchsKopplung1;
            tmpl2 /= 2048L;
         }
      else  tmpl = tmpl2 = 0;
// Roll  ++++++++++++++++++++++++++++++++++++++++++++++++
            MesswertRoll += tmpl;
            MesswertRoll += (tmpl2*Parameter_AchsGegenKopplung1)/512L; //109
            Mess_IntegralRoll2 += MesswertRoll;
            Mess_IntegralRoll +=  MesswertRoll - LageKorrekturRoll;
            if(Mess_IntegralRoll > Umschlag180Roll) 
            {
             Mess_IntegralRoll  = -(Umschlag180Roll - 10000L);
             Mess_IntegralRoll2 = Mess_IntegralRoll;
            } 
            if(Mess_IntegralRoll <-Umschlag180Roll)
            {
             Mess_IntegralRoll =  (Umschlag180Roll - 10000L);
             Mess_IntegralRoll2 = Mess_IntegralRoll;
            }  
            if(AdWertRoll < 15)   MesswertRoll = -1000;
            if(AdWertRoll <  7)   MesswertRoll = -2000;
            if(PlatinenVersion == 10)
			 {
              if(AdWertRoll > 1010) MesswertRoll = +1000;
              if(AdWertRoll > 1017) MesswertRoll = +2000;
			 }
			 else 
			 {
              if(AdWertRoll > 2020) MesswertRoll = +1000;
              if(AdWertRoll > 2034) MesswertRoll = +2000;
			 }
// Nick  ++++++++++++++++++++++++++++++++++++++++++++++++
            MesswertNick -= tmpl2;
            MesswertNick -= (tmpl*Parameter_AchsGegenKopplung1)/512L;
            Mess_IntegralNick2 += MesswertNick;
            Mess_IntegralNick  += MesswertNick - LageKorrekturNick;
            if(Mess_IntegralNick > Umschlag180Nick) 
            {
             Mess_IntegralNick = -(Umschlag180Nick - 10000L);
             Mess_IntegralNick2 = Mess_IntegralNick;
            } 
            if(Mess_IntegralNick <-Umschlag180Nick) 
            {
             Mess_IntegralNick =  (Umschlag180Nick - 10000L);
             Mess_IntegralNick2 = Mess_IntegralNick;
            } 
            if(AdWertNick < 15)   MesswertNick = -1000;
            if(AdWertNick <  7)   MesswertNick = -2000;
            if(PlatinenVersion == 10)
			 {
              if(AdWertNick > 1010) MesswertNick = +1000;
              if(AdWertNick > 1017) MesswertNick = +2000;
			 }
			 else 
			 {
              if(AdWertNick > 2020) MesswertNick = +1000;
              if(AdWertNick > 2034) MesswertNick = +2000;
			 }
//++++++++++++++++++++++++++++++++++++++++++++++++
// ADC einschalten
    ANALOG_ON;	
//++++++++++++++++++++++++++++++++++++++++++++++++

    Integral_Gier  = Mess_Integral_Gier;
    IntegralNick = Mess_IntegralNick;
    IntegralRoll = Mess_IntegralRoll;
    IntegralNick2 = Mess_IntegralNick2; 
    IntegralRoll2 = Mess_IntegralRoll2;

  if(EE_Parameter.GlobalConfig & CFG_DREHRATEN_BEGRENZER && !Looping_Nick && !Looping_Roll)
  {
    if(MesswertNick > 200)       MesswertNick += 4 * (MesswertNick - 200);
    else if(MesswertNick < -200) MesswertNick += 4 * (MesswertNick + 200); 
    if(MesswertRoll > 200)       MesswertRoll += 4 * (MesswertRoll - 200);
    else if(MesswertRoll < -200) MesswertRoll += 4 * (MesswertRoll + 200); 
  }
    if(Poti1 < PPM_in[EE_Parameter.Kanalbelegung[K_POTI1]] + 110) Poti1++; else if(Poti1 > PPM_in[EE_Parameter.Kanalbelegung[K_POTI1]] + 110 && Poti1) Poti1--;
    if(Poti2 < PPM_in[EE_Parameter.Kanalbelegung[K_POTI2]] + 110) Poti2++; else if(Poti2 > PPM_in[EE_Parameter.Kanalbelegung[K_POTI2]] + 110 && Poti2) Poti2--;
    if(Poti3 < PPM_in[EE_Parameter.Kanalbelegung[K_POTI3]] + 110) Poti3++; else if(Poti3 > PPM_in[EE_Parameter.Kanalbelegung[K_POTI3]] + 110 && Poti3) Poti3--;
    if(Poti4 < PPM_in[EE_Parameter.Kanalbelegung[K_POTI4]] + 110) Poti4++; else if(Poti4 > PPM_in[EE_Parameter.Kanalbelegung[K_POTI4]] + 110 && Poti4) Poti4--;
    if(Poti1 < 0) Poti1 = 0; else if(Poti1 > 255) Poti1 = 255;
    if(Poti2 < 0) Poti2 = 0; else if(Poti2 > 255) Poti2 = 255;
    if(Poti3 < 0) Poti3 = 0; else if(Poti3 > 255) Poti3 = 255;

⌨️ 快捷键说明

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