Subversion Repositories FlightCtrl

Rev

Rev 1614 | Go to most recent revision | Details | Last modification | View Log | RSS feed

Rev Author Line No. Line
1612 dongfang 1
// ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
2
// + Copyright (c) 04.2007 Holger Buss
3
// + Nur für den privaten Gebrauch
4
// + www.MikroKopter.com
5
// ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
6
// + Es gilt für das gesamte Projekt (Hardware, Software, Binärfiles, Sourcecode und Dokumentation),
7
// + dass eine Nutzung (auch auszugsweise) nur für den privaten (nicht-kommerziellen) Gebrauch zulässig ist.
8
// + Sollten direkte oder indirekte kommerzielle Absichten verfolgt werden, ist mit uns (info@mikrokopter.de) Kontakt
9
// + bzgl. der Nutzungsbedingungen aufzunehmen.
10
// + Eine kommerzielle Nutzung ist z.B.Verkauf von MikroKoptern, Bestückung und Verkauf von Platinen oder Bausätzen,
11
// + Verkauf von Luftbildaufnahmen, usw.
12
// ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
13
// + Werden Teile des Quellcodes (mit oder ohne Modifikation) weiterverwendet oder veröffentlicht,
14
// + unterliegen sie auch diesen Nutzungsbedingungen und diese Nutzungsbedingungen incl. Copyright müssen dann beiliegen
15
// ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
16
// + Sollte die Software (auch auszugesweise) oder sonstige Informationen des MikroKopter-Projekts
17
// + auf anderen Webseiten oder sonstigen Medien veröffentlicht werden, muss unsere Webseite "http://www.mikrokopter.de"
18
// + eindeutig als Ursprung verlinkt werden
19
// ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
20
// + Keine Gewähr auf Fehlerfreiheit, Vollständigkeit oder Funktion
21
// + Benutzung auf eigene Gefahr
22
// + Wir übernehmen keinerlei Haftung für direkte oder indirekte Personen- oder Sachschäden
23
// ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
24
// + Die Portierung der Software (oder Teile davon) auf andere Systeme (ausser der Hardware von www.mikrokopter.de) ist nur
25
// + mit unserer Zustimmung zulässig
26
// ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
27
// + Die Funktion printf_P() unterliegt ihrer eigenen Lizenz und ist hiervon nicht betroffen
28
// ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
29
// + Redistributions of source code (with or without modifications) must retain the above copyright notice,
30
// + this list of conditions and the following disclaimer.
31
// +   * Neither the name of the copyright holders nor the names of contributors may be used to endorse or promote products derived
32
// +     from this software without specific prior written permission.
33
// +   * The use of this project (hardware, software, binary files, sources and documentation) is only permittet
34
// +     for non-commercial use (directly or indirectly)
35
// +     Commercial use (for excample: selling of MikroKopters, selling of PCBs, assembly, ...) is only permitted
36
// +     with our written permission
37
// +   * If sources or documentations are redistributet on other webpages, out webpage (http://www.MikroKopter.de) must be
38
// +     clearly linked as origin
39
// +   * porting to systems other than hardware from www.mikrokopter.de is not allowed
40
// +  THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
41
// +  AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
42
// +  IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
43
// +  ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
44
// +  LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
45
// +  CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
46
// +  SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
47
// +  INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN// +  CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
48
// +  ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
49
// +  POSSIBILITY OF SUCH DAMAGE.
50
// ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
51
// +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
52
// + Contant Values
53
// + 0-250 -> normale Values
54
// + 251 -> Poti1
55
// + 252 -> Poti2
56
// + 253 -> Poti3
57
// + 254 -> Poti4
58
// +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
59
 
60
#ifndef EEMEM
61
#define EEMEM __attribute__ ((section (".eeprom")))
62
#endif
63
 
64
#include <avr/eeprom.h>
65
#include <string.h>
66
#include "eeprom.h"
67
#include "printf_P.h"
68
#include "output.h"
69
// TODO: Get rid of these. They have nothing to do with eeprom.
70
#include "flight.h"
71
#include "rc.h"
72
#include "sensors.h"
73
 
74
// byte array in eeprom
75
uint8_t EEPromArray[E2END+1] EEMEM;
76
 
77
paramset_t      staticParams;
78
MixerTable_t    Mixer;
79
 
80
/*
81
 * Default for your own experiments here, so you don't have to reset them
82
 * from MK-Tool all the time.
83
 */
84
void setDefaultUserParams(void) {
85
  uint8_t i;
86
  for (i=0; i<sizeof(staticParams.UserParams1); i++) {
87
    staticParams.UserParams1[i] = 0;
88
  }
89
  for (i=0; i<sizeof(staticParams.UserParams2); i++) {
90
    staticParams.UserParams2[i] = 0;
91
  }
92
}
93
 
94
void setOtherDefaults(void) {
95
  staticParams.ChannelAssignment[CH_PITCH]  = 2;
96
  staticParams.ChannelAssignment[CH_ROLL]  = 1;
97
  staticParams.ChannelAssignment[CH_THROTTLE]   = 3;
98
  staticParams.ChannelAssignment[CH_YAW]   = 4;
99
  staticParams.ChannelAssignment[CH_POTS+0] = 5;
100
  staticParams.ChannelAssignment[CH_POTS+1] = 6;
101
  staticParams.ChannelAssignment[CH_POTS+2] = 7;
102
  staticParams.ChannelAssignment[CH_POTS+3] = 8;
103
  staticParams.GlobalConfig = CFG_AXIS_COUPLING_ACTIVE | CFG_COMPASS_ACTIVE | CFG_GPS_ACTIVE;//CFG_HEIGHT_CONTROL | CFG_HEIGHT_SWITCH | CFG_COMPASS_FIX;
104
  staticParams.HeightMinGas = 30;
105
  staticParams.MaxHeight     = 251;
106
  staticParams.HeightP      = 10;
107
  staticParams.HeightD  = 30;
108
  staticParams.Height_ACC_Effect = 30;
109
  staticParams.Height_Gain = 4;
110
  staticParams.StickP = 12;
111
  staticParams.StickD = 16;
112
  staticParams.StickYawP = 12;
113
  staticParams.GasMin = 8;
114
  staticParams.GasMax = 230;
115
  staticParams.CompassYawEffect = 128;
116
  staticParams.GyroP = 80;
117
  staticParams.GyroI = 100;
118
  staticParams.LowVoltageWarning = 94;
119
  staticParams.EmergencyGas = 35;
120
  staticParams.EmergencyGasDuration = 30;
121
  staticParams.UfoArrangement = 0;
122
  staticParams.IFactor = 32;
123
  staticParams.ServoPitchControl = 100;
124
  staticParams.ServoPitchComp = 40;
125
  staticParams.ServoPitchCompInvert = 0;
126
  staticParams.ServoPitchMin = 50;
127
  staticParams.ServoPitchMax = 150;
128
  staticParams.ServoRefresh = 5;
129
  staticParams.LoopGasLimit = 50;
130
  staticParams.LoopThreshold = 90;
131
  staticParams.LoopHysteresis = 50;
132
  staticParams.BitConfig = 0;
133
  staticParams.AxisCoupling1 = 90;
134
  staticParams.AxisCoupling2 = 67;
135
  staticParams.AxisCouplingYawCorrection = 0;
136
  staticParams.GyroAccTrim = 2;
137
  staticParams.DynamicStability = 50;
138
  staticParams.J16Bitmask = 95;
139
  staticParams.J17Bitmask = 243;
140
  staticParams.J16Timing = 15;
141
  staticParams.J17Timing = 15;
142
  staticParams.NaviGpsModeControl = 253;
143
  staticParams.NaviGpsGain = 100;
144
  staticParams.NaviGpsP = 90;
145
  staticParams.NaviGpsI = 90;
146
  staticParams.NaviGpsD = 90;
147
  staticParams.NaviGpsPLimit = 75;
148
  staticParams.NaviGpsILimit = 75;
149
  staticParams.NaviGpsDLimit = 75;
150
  staticParams.NaviGpsACC = 0;
151
  staticParams.NaviGpsMinSat = 6;
152
  staticParams.NaviStickThreshold = 8;
153
  staticParams.NaviWindCorrection = 90;
154
  staticParams.NaviSpeedCompensation = 30;
155
  staticParams.NaviOperatingRadius = 100;
156
  staticParams.NaviAngleLimitation = 100;
157
  staticParams.NaviPHLoginTime = 4;
158
}
159
 
160
/***************************************************/
161
/*    Default Values for parameter set 1           */
162
/***************************************************/
163
void ParamSet_DefaultSet1(void) { // sport
164
  gyro_setDefaults();
165
  setDefaultUserParams();
166
  setOtherDefaults();
167
  memcpy(staticParams.Name, "Sport\0",6);
168
}
169
 
170
/***************************************************/
171
/*    Default Values for parameter set 2           */
172
/***************************************************/
173
void ParamSet_DefaultSet2(void) { // normal
174
  gyro_setDefaults();
175
  setDefaultUserParams();
176
  setOtherDefaults();
177
  staticParams.Height_Gain = 3;
178
  staticParams.GyroAccTrim = 32;
179
  staticParams.J16Timing = 20;
180
  staticParams.J17Timing = 20;
181
  memcpy(staticParams.Name, "Normal\0", 7);
182
}
183
 
184
/***************************************************/
185
/*    Default Values for parameter set 3           */
186
/***************************************************/
187
void ParamSet_DefaultSet3(void) { // beginner
188
  gyro_setDefaults();
189
  setDefaultUserParams();
190
  setOtherDefaults();
191
  staticParams.GlobalConfig = CFG_ROTARY_RATE_LIMITER | CFG_AXIS_COUPLING_ACTIVE | CFG_COMPASS_ACTIVE | CFG_GPS_ACTIVE;//CFG_HEIGHT_CONTROL | CFG_HEIGHT_SWITCH | CFG_COMPASS_FIX;
192
  staticParams.Height_Gain = 3;
193
  staticParams.EmergencyGasDuration = 20;
194
  staticParams.AxisCouplingYawCorrection = 70;
195
  staticParams.GyroAccTrim = 32;
196
  staticParams.J16Timing = 30;
197
  staticParams.J17Timing = 30;
198
  memcpy(staticParams.Name, "Beginner\0", 9);
199
}
200
 
201
/***************************************************/
202
/*       Read Parameter from EEPROM as byte        */
203
/***************************************************/
204
uint8_t GetParamByte(uint16_t param_id) {
205
  return eeprom_read_byte(&EEPromArray[EEPROM_ADR_PARAM_BEGIN + param_id]);
206
}
207
 
208
/***************************************************/
209
/*       Write Parameter to EEPROM as byte         */
210
/***************************************************/
211
void SetParamByte(uint16_t param_id, uint8_t value) {
212
  eeprom_write_byte(&EEPromArray[EEPROM_ADR_PARAM_BEGIN + param_id], value);
213
}
214
 
215
/***************************************************/
216
/*       Read Parameter from EEPROM as word        */
217
/***************************************************/
218
uint16_t GetParamWord(uint16_t param_id) {
219
  return eeprom_read_word((uint16_t *) &EEPromArray[EEPROM_ADR_PARAM_BEGIN + param_id]);
220
}
221
 
222
/***************************************************/
223
/*       Write Parameter to EEPROM as word         */
224
/***************************************************/
225
void SetParamWord(uint16_t param_id, uint16_t value) {
226
  eeprom_write_word((uint16_t *) &EEPromArray[EEPROM_ADR_PARAM_BEGIN + param_id], value);
227
}
228
 
229
/***************************************************/
230
/*       Read Parameter Set from EEPROM            */
231
/***************************************************/
232
// number [1..5]
233
void ParamSet_ReadFromEEProm(uint8_t setnumber) {
234
  if((1 > setnumber) || (setnumber > 5)) setnumber = 3;
235
  eeprom_read_block((uint8_t *) &staticParams.ChannelAssignment[0], &EEPromArray[EEPROM_ADR_PARAMSET_BEGIN + PARAMSET_STRUCT_LEN * (setnumber - 1)], PARAMSET_STRUCT_LEN);
236
  output_init();
237
}
238
 
239
/***************************************************/
240
/*        Write Parameter Set to EEPROM            */
241
/***************************************************/
242
// number [1..5]
243
void ParamSet_WriteToEEProm(uint8_t setnumber) {
244
  if(setnumber > 5) setnumber = 5;
245
  if(setnumber < 1) return;
246
  eeprom_write_block((uint8_t *) &staticParams.ChannelAssignment[0], &EEPromArray[EEPROM_ADR_PARAMSET_BEGIN + PARAMSET_STRUCT_LEN * (setnumber - 1)], PARAMSET_STRUCT_LEN);
247
  eeprom_write_word((uint16_t *) &EEPromArray[EEPROM_ADR_PARAMSET_LENGTH], PARAMSET_STRUCT_LEN);
248
  eeprom_write_block( &staticParams.ChannelAssignment[0], &EEPromArray[EEPROM_ADR_CHANNELS], 8); // backup the first 8 bytes that is the rc channel mapping
249
  // set this parameter set to active set
250
  setActiveParamSet(setnumber);
251
  output_init();
252
}
253
 
254
 
255
/***************************************************/
256
/*       Get active parameter set                  */
257
/***************************************************/
258
uint8_t getActiveParamSet(void) {
259
  uint8_t setnumber;
260
  setnumber = eeprom_read_byte(&EEPromArray[PID_ACTIVE_SET]);
261
  if(setnumber > 5) {
262
    setnumber = 3;
263
    eeprom_write_byte(&EEPromArray[PID_ACTIVE_SET], setnumber);
264
  }
265
  return(setnumber);
266
}
267
 
268
/***************************************************/
269
/*       Set active parameter set                  */
270
/***************************************************/
271
void setActiveParamSet(uint8_t setnumber) {
272
  if(setnumber > 5) setnumber = 5;
273
  if(setnumber < 1) setnumber = 1;
274
  eeprom_write_byte(&EEPromArray[PID_ACTIVE_SET], setnumber);
275
}
276
 
277
/***************************************************/
278
/*          Read MixerTable from EEPROM            */
279
/***************************************************/
280
uint8_t MixerTable_ReadFromEEProm(void) {
281
  if(eeprom_read_byte(&EEPromArray[EEPROM_ADR_MIXER_TABLE]) == EEMIXER_REVISION) {
282
    eeprom_read_block((uint8_t *) &Mixer, &EEPromArray[EEPROM_ADR_MIXER_TABLE], sizeof(Mixer));
283
    return 1;
284
  }
285
  else return 0;
286
}
287
 
288
/***************************************************/
289
/*          Write Mixer Table to EEPROM            */
290
/***************************************************/
291
uint8_t MixerTable_WriteToEEProm(void) {
292
  if(Mixer.Revision == EEMIXER_REVISION) {
293
    eeprom_write_block((uint8_t *) &Mixer, &EEPromArray[EEPROM_ADR_MIXER_TABLE], sizeof(Mixer));
294
    return 1;
295
  }
296
  else return 0;
297
}
298
 
299
/***************************************************/
300
/*    Default Values for Mixer Table               */
301
/***************************************************/
302
void MixerTable_Default(void) { // Quadro 
303
  uint8_t i;
304
  Mixer.Revision = EEMIXER_REVISION;
305
  // clear mixer table (but preset throttle)
306
  for(i = 0; i < 16; i++) {
307
    Mixer.Motor[i][MIX_THROTTLE] = i < 4 ? 64 : 0;
308
    Mixer.Motor[i][MIX_PITCH] = 0;
309
    Mixer.Motor[i][MIX_ROLL] = 0;
310
    Mixer.Motor[i][MIX_YAW]  = 0;
311
  }
312
  // default = Quadro
313
  Mixer.Motor[0][MIX_PITCH] = +64;                                 Mixer.Motor[0][MIX_YAW] = +64;
314
  Mixer.Motor[1][MIX_PITCH] = -64;                                 Mixer.Motor[1][MIX_YAW] = +64;
315
  Mixer.Motor[2][MIX_ROLL] = -64; Mixer.Motor[2][MIX_YAW] = -64;
316
  Mixer.Motor[3][MIX_ROLL] = +64; Mixer.Motor[3][MIX_YAW] = -64;
317
  memcpy(Mixer.Name, "Quadro\0", 7);
318
}
319
 
320
/***************************************************/
321
/*       Initialize EEPROM Parameter Sets          */
322
/***************************************************/
323
void ParamSet_Init(void) {
324
  uint8_t Channel_Backup  = 0, i;
325
  // parameter version  check
326
  if(eeprom_read_byte(&EEPromArray[PID_PARAM_REVISION]) != EEPARAM_REVISION) {
327
    // if version check faild
328
    printf("\n\rInit Parameter in EEPROM");
329
    eeprom_write_byte(&EEPromArray[EEPROM_ADR_MIXER_TABLE], 0xFF); // reset also mixer table
330
    // check if channel mapping backup is valid
331
    if(         (eeprom_read_byte(&EEPromArray[EEPROM_ADR_CHANNELS+0]) < 12)
332
                &&  (eeprom_read_byte(&EEPromArray[EEPROM_ADR_CHANNELS+1]) < 12)
333
                &&  (eeprom_read_byte(&EEPromArray[EEPROM_ADR_CHANNELS+2]) < 12)
334
                &&  (eeprom_read_byte(&EEPromArray[EEPROM_ADR_CHANNELS+3]) < 12)
335
                )
336
      {
337
        Channel_Backup = 1;
338
      }
339
    // fill all 5 parameter settings
340
    for (i=1; i<6; i++) {
341
      switch(i) {
342
      case 1:
343
        ParamSet_DefaultSet1(); // Fill staticParams Structure to default parameter set 1 (Sport)
344
        break;
345
      case 2:
346
        ParamSet_DefaultSet2(); // Kamera
347
        break;
348
      case 3:
349
        ParamSet_DefaultSet3(); // Beginner
350
        break;
351
      default:
352
        ParamSet_DefaultSet2(); // Kamera
353
        break;
354
      }
355
      if(Channel_Backup) { // if we have a rc channel mapping backup in eeprom
356
        // restore it
357
        staticParams.ChannelAssignment[0] = eeprom_read_byte(&EEPromArray[EEPROM_ADR_CHANNELS+0]);
358
        staticParams.ChannelAssignment[1] = eeprom_read_byte(&EEPromArray[EEPROM_ADR_CHANNELS+1]);
359
        staticParams.ChannelAssignment[2] = eeprom_read_byte(&EEPromArray[EEPROM_ADR_CHANNELS+2]);
360
        staticParams.ChannelAssignment[3] = eeprom_read_byte(&EEPromArray[EEPROM_ADR_CHANNELS+3]);
361
        staticParams.ChannelAssignment[4] = eeprom_read_byte(&EEPromArray[EEPROM_ADR_CHANNELS+4]);
362
        staticParams.ChannelAssignment[5] = eeprom_read_byte(&EEPromArray[EEPROM_ADR_CHANNELS+5]);
363
        staticParams.ChannelAssignment[6] = eeprom_read_byte(&EEPromArray[EEPROM_ADR_CHANNELS+6]);
364
        staticParams.ChannelAssignment[7] = eeprom_read_byte(&EEPromArray[EEPROM_ADR_CHANNELS+7]);
365
      }
366
      ParamSet_WriteToEEProm(i);
367
    }
368
    // default-Setting is parameter set 3
369
    setActiveParamSet(1);
370
    // update version info
371
    SetParamByte(PID_PARAM_REVISION, EEPARAM_REVISION);
372
  }
373
  // read active parameter set to staticParams stucture
374
  ParamSet_ReadFromEEProm(getActiveParamSet());
375
  printf("\n\rUsing Parameter Set %d", getActiveParamSet());
376
 
377
  // load mixer table
378
  if(!MixerTable_ReadFromEEProm()) {
379
    printf("\n\rGenerating default Mixer Table");
380
    MixerTable_Default(); // Quadro
381
    MixerTable_WriteToEEProm();
382
  }
383
  // determine motornumber
384
  RequiredMotors = 0;
385
  for(i = 0; i < 16; i++) {
386
    if(Mixer.Motor[i][MIX_THROTTLE] > 0) RequiredMotors++;
387
  }
388
 
389
  printf("\n\rMixer-Config: '%s' (%u Motors)",Mixer.Name, RequiredMotors);
390
  printf("\n\r==============================");
391
}