Subversion Repositories FlightCtrl

Rev

Rev 1612 | Rev 1775 | Go to most recent revision | Details | Compare with Previous | Last modification | View Log | RSS feed

Rev Author Line No. Line
1645 - 1
/*********************************************************************************/
2
/* Attitude sense system (processing of gyro, accelerometer and altimeter data)  */
3
/*********************************************************************************/
1612 dongfang 4
 
5
#ifndef _ATTITUDE_H
6
#define _ATTITUDE_H
7
 
8
#include <inttypes.h>
9
 
10
#include "analog.h"
11
 
12
// For debugging only.
13
#include "uart0.h"
14
 
15
/*
16
 * If you have no acc. sensor or do not want to use it, remove this define. This will cause the
17
 * acc. sensor to be ignored at attitude calibration.
18
 */
19
#define ATTITUDE_USE_ACC_SENSORS yes
20
 
21
/*
22
 * Default hysteresis to use for the -180 degree to 180 degree wrap.
23
 */
24
#define PITCHOVER_HYSTERESIS 0L
25
#define ROLLOVER_HYSTERESIS 0L
26
 
27
/*
28
 * The frequency at which numerical integration takes place. 488 in original code.
29
 */
30
#define INTEGRATION_FREQUENCY 488
31
 
32
/*
33
 * Gyro readings are divided by this before being used in attitude control. This will scale them
34
 * to match the scale of the stick control etc. variables. This is just a rough non-precision
35
 * scaling - the below definitions make precise conversion factors.
1645 - 36
 * Will be about 4 for InvenSense, 8 for FC1.3 and 8 for ADXRS610.
1612 dongfang 37
 * The number 1250 is derived from the original code: It has about 225000 = 1250 * 180 for 180 degrees.
38
 */
39
#define HIRES_GYRO_INTEGRATION_FACTOR (int)((GYRO_RATE_FACTOR_PITCHROLL * INTEGRATION_FREQUENCY * GYRO_PITCHROLL_CORRECTION) / 1250)
40
 
41
/*
42
 * Constant for deriving an attitude angle from acceleration measurement.
43
 *
44
 * The value is derived from the datasheet of the ACC sensor where 5g are scaled to VRef.
45
 * 1g is (3V * 1024) / (5 * 3V) = 205 counts. The ADC ISR sums 2 acc. samples to each
46
 * [pitch/roll]AxisAcc and thus reads about acc = 410 counts / g.
47
 * We approximate a small pitch/roll angle v by assuming that the copter does not accelerate:
48
 * In this explanation it is assumed that the ADC values are 0 based, and gravity is included.
49
 * The sine of v is the far side / the hypothenusis:
50
 * sin v = acc / sqrt(acc^2 + acc_z^2)
51
 * Using that v is a small angle, and the near side is about equal to the the hypothenusis:
52
 * sin v ~= acc / acc_z
53
 * Assuming that the helicopter is hovering at small pitch and roll angles, acc_z is about 410,
54
 * and sin v ~= v (small angles, in radians):
55
 * sin v ~= acc / 410
56
 * v / 57.3 ~= acc / 410
57
 * v ~= acc * 57.3 / 410
58
 * acc / v ~= 410 / 57.3 ~= 7, that is: There are about 7 counts per degree.
59
 *
60
 * Summary: DEG_ACC_FACTOR = (2 * 1024 * [sensitivity of acc. meter in V/g]) / (3V * 57.3)
61
 */
62
#define DEG_ACC_FACTOR 7
63
 
64
/*
65
 * Growth of the integral per degree:
66
 * The hiResXXXX value per deg / s * INTEGRATION_FREQUENCY samples / sec * correction / a number divided by
67
 * HIRES_GYRO_INTEGRATION_FACTOR (why???) before integration.
68
 * The value of this expression should be about 1250 (by setting HIRES_GYRO_INTEGRATION_FACTOR to something suitable).
69
 */
70
#define GYRO_DEG_FACTOR_PITCHROLL (int)(GYRO_RATE_FACTOR_PITCHROLL * INTEGRATION_FREQUENCY * GYRO_PITCHROLL_CORRECTION / HIRES_GYRO_INTEGRATION_FACTOR)
71
#define GYRO_DEG_FACTOR_YAW (int)(GYRO_RATE_FACTOR_YAW * INTEGRATION_FREQUENCY * GYRO_YAW_CORRECTION)
72
 
73
/*
74
 * This is ([gyro integral value] / degree) / (degree / acc. sensor value) = gyro integral value / acc.sensor value
75
 * = the factor an acc. sensor should be multiplied by to get the gyro integral
76
 * value for the same (small) angle.
77
 * The value is about 200.
78
 */
79
#define GYRO_ACC_FACTOR ((GYRO_DEG_FACTOR_PITCHROLL) / (DEG_ACC_FACTOR))
80
 
81
/*
82
 * Rotation rates
83
 */
1645 - 84
extern int16_t rate_PID[2], yawRate;
85
extern int16_t differential[2];
1612 dongfang 86
 
87
/*
1645 - 88
 * Attitudes calculated by numerical integration of gyro rates
1612 dongfang 89
 */
1645 - 90
extern int32_t angle[2], yawAngle;
1612 dongfang 91
 
92
// extern volatile int32_t ReadingIntegralTop; // calculated in analog.c
93
 
94
/*
95
 * Compass navigation
96
 */
97
extern int16_t compassHeading;
98
extern int16_t compassCourse;
99
extern int16_t compassOffCourse;
100
extern uint8_t compassCalState;
101
extern int32_t yawGyroHeading;
102
extern int16_t yawGyroHeadingInDeg;
103
extern uint16_t updateCompassCourse;
104
extern uint16_t badCompassHeading;
105
 
106
/*
107
 * Interval wrap-over values for attitude integrals
108
 */
109
extern long turnOver180Pitch, turnOver180Roll;
110
 
111
// No longer used.
112
// extern uint8_t FunnelCourse;
113
 
114
/*
115
 * Dynamic gyro offsets. These are signed values that are subtracted from the gyro measurements,
116
 * to help cancelling out drift and vibration noise effects. The dynamic offsets themselves
117
 * can be updated in flight by different ways, for example:
118
 * - Just taking them from parameters, so the pilot can trim manually in a PC or mobile tool
119
 * - Summing up how much acc. meter correction was done to the gyro integrals over the last n
120
 *   integration, and then adding the sum / n to the dynamic offset
121
 * - Detect which way the pilot pulls the stick to keep the copter steady, and correct by that
122
 * - Invent your own...
123
 */
1645 - 124
extern int16_t dynamicOffset[2], dynamicOffsetYaw;
1612 dongfang 125
 
126
/*
127
 * Re-init flight attitude, setting all angles to 0 (or to whatever can be derived from acc. sensor).
128
 * To be called when the pilot commands gyro calibration (eg. by moving the left stick up-left or up-right).
129
 */
130
void attitude_setNeutral(void);
131
 
132
/*
133
 * Experiment.
134
 */
135
// void attitude_startDynamicCalibration(void);
136
// void attitude_continueDynamicCalibration(void);
137
 
138
/*
139
 * Main routine, called from the flight loop.
140
 */
141
void calculateFlightAttitude(void);
142
#endif //_ATTITUDE_H