Subversion Repositories FlightCtrl

Rev

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

Rev Author Line No. Line
1775 - 1
#include <inttypes.h>
2
#include "attitude.h"
3
#include "uart0.h"
4
#include "configuration.h"
5
#include "controlMixer.h"
6
 
7
// for digital / LED debug.
8
#include "output.h"
9
 
10
// For scope debugging only!
11
#include "rc.h"
12
 
13
#define INTEGRAL_LIMIT 100000
14
 
15
/*
1821 - 16
 #define DEBUGINTEGRAL 0
17
 #define DEBUGDIFFERENTIAL 0
18
 #define DEBUGHOVERTHROTTLE 0
19
 #define DEBUGHEIGHTSWITCH 0
20
 */
1775 - 21
 
22
#define LATCH_TIME 40
23
 
24
int32_t groundPressure;
25
 
26
int32_t targetHeight;
27
int32_t rampedTargetHeight;
28
 
29
#define DEFAULT_HOVERTHROTTLE 50
30
int32_t stronglyFilteredHeightDiff = 0;
31
uint16_t hoverThrottle = 0; // DEFAULT_HOVERTHROTTLE;
32
uint16_t stronglyFilteredThrottle = DEFAULT_HOVERTHROTTLE;
33
#define HOVERTHROTTLEFILTER 25
34
 
35
uint8_t heightRampingTimer = 0;
36
int32_t maxHeight;
37
int32_t iHeight;
38
/*
1821 - 39
 These parameters are free to take:
40
 uint8_t HeightMinGas;           // Value : 0-100
41
 uint8_t HeightD;                // Value : 0-250
42
 uint8_t MaxHeight;              // Value : 0-32
43
 uint8_t HeightP;                // Value : 0-32
44
 uint8_t Height_Gain;            // Value : 0-50
45
 uint8_t Height_ACC_Effect;      // Value : 0-250
1775 - 46
 */
47
 
48
int32_t getHeight(void) {
1821 - 49
        return groundPressure - filteredAirPressure;
1775 - 50
}
51
 
52
void HC_setGround(void) {
1821 - 53
        groundPressure = filteredAirPressure;
54
        // This should also happen when height control is enabled in-flight.
55
        rampedTargetHeight = getHeight();
56
        maxHeight = 0;
57
        iHeight = 0;
1775 - 58
}
59
 
60
void HC_update(void) {
1821 - 61
        int32_t height = getHeight();
62
        static uint8_t setHeightLatch = 0;
1775 - 63
 
1821 - 64
        if (height > maxHeight)
65
                maxHeight = height;
1775 - 66
 
1821 - 67
        if (staticParams.GlobalConfig & CFG_HEIGHT_SWITCH) {
68
                // If switch is activated in config
69
                DebugOut.Digital[0] |= DEBUG_HEIGHT_SWITCH;
70
                if (dynamicParams.MaxHeight < 40 || dynamicParams.MaxHeight > 255 - 40) {
71
                        // Switch is ON
72
                        if (setHeightLatch <= LATCH_TIME) {
73
                                if (setHeightLatch == LATCH_TIME) {
74
                                        // Freeze the height as target. We want to do this exactly once each time the switch is thrown ON.
75
                                        targetHeight = height;
76
                                        DebugOut.Digital[1] |= DEBUG_HEIGHT_SWITCH;
77
                                }
78
                                // Time not yet reached.
79
                                setHeightLatch++;
80
                        }
81
                } else {
82
                        // Switch is OFF.
83
                        setHeightLatch = 0;
84
                        DebugOut.Digital[1] &= ~DEBUG_HEIGHT_SWITCH;
85
                }
86
        } else {
87
                // Switch is not activated; take the "max-height" as the target height.
88
                DebugOut.Digital[0] &= ~DEBUG_HEIGHT_SWITCH;
89
                targetHeight = (uint16_t) dynamicParams.MaxHeight * 100; //getHeight() + 10 * 100;
1775 - 90
        }
91
 
1821 - 92
        if (++heightRampingTimer == INTEGRATION_FREQUENCY / 10) {
93
                heightRampingTimer = 0;
94
                if (rampedTargetHeight + staticParams.Height_Gain <= targetHeight) {
95
                        rampedTargetHeight += staticParams.Height_Gain;
96
                } else if (rampedTargetHeight - staticParams.Height_Gain >= targetHeight) {
97
                        rampedTargetHeight -= staticParams.Height_Gain;
98
                }
99
        }
100
 
101
        // height, in meters (so the division factor is: 100)
102
        DebugOut.Analog[30] = height / 100;
1775 - 103
}
104
 
105
// ParamSet.GlobalConfig & CFG_HEIGHT_CONTROL
106
// ParamSet.GlobalConfig & CFG_HEIGHT_SWITCH
107
// ParamSet.BitConfig & CFG_HEIGHT_3SWITCH
108
 
109
// takes 180-200 usec (with integral term). That is too heavy!!!
110
// takes 100 usec without integral term.
111
uint16_t HC_getThrottle(uint16_t throttle) {
1821 - 112
        int32_t height = getHeight();
113
        int32_t heightError = rampedTargetHeight - height;
1775 - 114
 
1821 - 115
        static int32_t lastHeight;
1775 - 116
 
1821 - 117
        int16_t dHeight = height - lastHeight;
118
        lastHeight = height;
1775 - 119
 
1821 - 120
        // DebugOut.Analog[20] = dHeight;
121
        // DebugOut.Analog[21] = dynamicParams.MaxHeight;
1775 - 122
 
1821 - 123
        // iHeight, at a difference of 5 meters and a freq. of 488 Hz, will grow with 244000 / sec....
124
        // iHeight += heightError;
1775 - 125
 
1821 - 126
        if (dHeight > 0) {
127
                DebugOut.Digital[0] |= DEBUG_HEIGHT_DIFF;
128
                DebugOut.Digital[1] &= ~DEBUG_HEIGHT_DIFF;
129
        } else if (dHeight < 0) {
130
                DebugOut.Digital[1] |= DEBUG_HEIGHT_DIFF;
131
                DebugOut.Digital[0] &= ~DEBUG_HEIGHT_DIFF;
132
        }
1775 - 133
 
1821 - 134
        /*
135
         if (iHeight > INTEGRAL_LIMIT) { iHeight = INTEGRAL_LIMIT; if (DEBUGINTEGRAL) {DebugOut.Digital[0] = 1; DebugOut.Digital[1] = 1;}}
136
         else if (iHeight < -INTEGRAL_LIMIT) { iHeight = -INTEGRAL_LIMIT; if (DEBUGINTEGRAL) {DebugOut.Digital[0] = 0; DebugOut.Digital[1] = 0; }}
137
         else if (iHeight > 0) { if (DEBUGINTEGRAL) DebugOut.Digital[0] = 1;}
138
         else if (iHeight < 0) { if (DEBUGINTEGRAL) DebugOut.Digital[1] = 1;}
139
         */
1775 - 140
 
1821 - 141
        int16_t dThrottle = heightError * staticParams.HeightP / 1000
142
                        /*+ iHeight / 10000L * staticParams.Height_ACC_Effect */- dHeight
143
                                        * staticParams.HeightD;
1775 - 144
 
1821 - 145
        // the "minGas" is now a limit for how much up / down the throttle can be varied
146
        if (dThrottle > staticParams.HeightMinGas)
147
                dThrottle = staticParams.HeightMinGas;
148
        else if (dThrottle < -staticParams.HeightMinGas)
149
                dThrottle = -staticParams.HeightMinGas;
1775 - 150
 
1821 - 151
        //DebugOut.Analog[18] = dThrottle;
152
        //DebugOut.Analog[19] = iHeight / 10000L;
1775 - 153
 
1821 - 154
        // TODO: Eliminate repitition.
155
        if (staticParams.GlobalConfig & CFG_HEIGHT_CONTROL) {
156
                if (!(staticParams.GlobalConfig & CFG_HEIGHT_SWITCH)
157
                                || (dynamicParams.MaxHeight < 40 || dynamicParams.MaxHeight > 255 - 40)) {
158
                        // If switch is not in use --> Just apply height control.
159
                        // If switch is in use     --> only apply height control when switch is also ON.
160
                        throttle += dThrottle;
161
                }
162
        }
163
 
164
        /* Experiment: Find hover-throttle */
165
        stronglyFilteredHeightDiff = (stronglyFilteredHeightDiff
166
                        * (HOVERTHROTTLEFILTER - 1) + dHeight) / HOVERTHROTTLEFILTER;
167
        stronglyFilteredThrottle = (stronglyFilteredThrottle * (HOVERTHROTTLEFILTER
168
                        - 1) + throttle) / HOVERTHROTTLEFILTER;
169
 
170
        if (isFlying >= 1000 && stronglyFilteredHeightDiff < 3
171
                        && stronglyFilteredHeightDiff > -3) {
172
                hoverThrottle = stronglyFilteredThrottle;
173
                DebugOut.Digital[0] |= DEBUG_HOVERTHROTTLE;
174
                // DebugOut.Analog[18] = hoverThrottle;
175
        } else
176
                DebugOut.Digital[0] &= ~DEBUG_HOVERTHROTTLE;
177
        return throttle;
1775 - 178
}
179
 
180
/*
1821 - 181
 For a variometer thingy:
182
 When switch is thrown on, freeze throttle (capture it into variable)
183
 For each iter., add (throttle - frozen throttle) to target height. Maybe don't do ramping.
184
 Output = frozen throttle + whatever is computed +/-. Integral?
185
 */