mirror of
https://github.com/betaflight/betaflight.git
synced 2025-07-15 04:15:44 +03:00
ms5611 driver improvements (was failing below 20c) merged some althold cleanups git-svn-id: https://afrodevices.googlecode.com/svn/trunk/baseflight@411 7c89a4a9-59b9-e629-4cfe-3a2d53b20e61
469 lines
19 KiB
C
Executable file
469 lines
19 KiB
C
Executable file
#pragma once
|
|
|
|
/* for VBAT monitoring frequency */
|
|
#define VBATFREQ 6 // to read battery voltage - nth number of loop iterations
|
|
#define BARO_TAB_SIZE_MAX 48
|
|
|
|
#define VERSION 220
|
|
|
|
#define LAT 0
|
|
#define LON 1
|
|
|
|
// Serial GPS only variables
|
|
// navigation mode
|
|
typedef enum NavigationMode
|
|
{
|
|
NAV_MODE_NONE = 0,
|
|
NAV_MODE_POSHOLD,
|
|
NAV_MODE_WP
|
|
} NavigationMode;
|
|
|
|
// Syncronized with GUI. Only exception is mixer > 11, which is always returned as 11 during serialization.
|
|
typedef enum MultiType
|
|
{
|
|
MULTITYPE_TRI = 1,
|
|
MULTITYPE_QUADP = 2,
|
|
MULTITYPE_QUADX = 3,
|
|
MULTITYPE_BI = 4,
|
|
MULTITYPE_GIMBAL = 5,
|
|
MULTITYPE_Y6 = 6,
|
|
MULTITYPE_HEX6 = 7,
|
|
MULTITYPE_FLYING_WING = 8,
|
|
MULTITYPE_Y4 = 9,
|
|
MULTITYPE_HEX6X = 10,
|
|
MULTITYPE_OCTOX8 = 11, // Java GUI is same for the next 3 configs
|
|
MULTITYPE_OCTOFLATP = 12, // MultiWinGui shows this differently
|
|
MULTITYPE_OCTOFLATX = 13, // MultiWinGui shows this differently
|
|
MULTITYPE_AIRPLANE = 14, // airplane / singlecopter / dualcopter (not yet properly supported)
|
|
MULTITYPE_HELI_120_CCPM = 15,
|
|
MULTITYPE_HELI_90_DEG = 16,
|
|
MULTITYPE_VTAIL4 = 17,
|
|
MULTITYPE_CUSTOM = 18, // no current GUI displays this
|
|
MULTITYPE_LAST = 19
|
|
} MultiType;
|
|
|
|
typedef enum GimbalFlags {
|
|
GIMBAL_NORMAL = 1 << 0,
|
|
GIMBAL_TILTONLY = 1 << 1,
|
|
GIMBAL_DISABLEAUX34 = 1 << 2,
|
|
GIMBAL_FORWARDAUX = 1 << 3,
|
|
GIMBAL_MIXTILT = 1 << 4,
|
|
} GimbalFlags;
|
|
|
|
/*********** RC alias *****************/
|
|
enum {
|
|
ROLL = 0,
|
|
PITCH,
|
|
YAW,
|
|
THROTTLE,
|
|
AUX1,
|
|
AUX2,
|
|
AUX3,
|
|
AUX4
|
|
};
|
|
|
|
enum {
|
|
PIDROLL,
|
|
PIDPITCH,
|
|
PIDYAW,
|
|
PIDALT,
|
|
PIDPOS,
|
|
PIDPOSR,
|
|
PIDNAVR,
|
|
PIDLEVEL,
|
|
PIDMAG,
|
|
PIDVEL,
|
|
PIDITEMS
|
|
};
|
|
|
|
enum {
|
|
BOXARM = 0,
|
|
BOXANGLE,
|
|
BOXHORIZON,
|
|
BOXBARO,
|
|
BOXVARIO,
|
|
BOXMAG,
|
|
BOXHEADFREE,
|
|
BOXHEADADJ,
|
|
BOXCAMSTAB,
|
|
BOXCAMTRIG,
|
|
BOXGPSHOME,
|
|
BOXGPSHOLD,
|
|
BOXPASSTHRU,
|
|
BOXBEEPERON,
|
|
BOXLEDMAX,
|
|
BOXLEDLOW,
|
|
BOXLLIGHTS,
|
|
BOXCALIB,
|
|
BOXGOV,
|
|
BOXOSD,
|
|
CHECKBOXITEMS
|
|
};
|
|
|
|
#define ROL_LO (1 << (2 * ROLL))
|
|
#define ROL_CE (3 << (2 * ROLL))
|
|
#define ROL_HI (2 << (2 * ROLL))
|
|
#define PIT_LO (1 << (2 * PITCH))
|
|
#define PIT_CE (3 << (2 * PITCH))
|
|
#define PIT_HI (2 << (2 * PITCH))
|
|
#define YAW_LO (1 << (2 * YAW))
|
|
#define YAW_CE (3 << (2 * YAW))
|
|
#define YAW_HI (2 << (2 * YAW))
|
|
#define THR_LO (1 << (2 * THROTTLE))
|
|
#define THR_CE (3 << (2 * THROTTLE))
|
|
#define THR_HI (2 << (2 * THROTTLE))
|
|
|
|
#define SERVO_NORMAL (1)
|
|
#define SERVO_REVERSE (-1)
|
|
|
|
// Custom mixer data per motor
|
|
typedef struct motorMixer_t {
|
|
float throttle;
|
|
float roll;
|
|
float pitch;
|
|
float yaw;
|
|
} motorMixer_t;
|
|
|
|
// Custom mixer configuration
|
|
typedef struct mixer_t {
|
|
uint8_t numberMotor;
|
|
uint8_t useServo;
|
|
const motorMixer_t *motor;
|
|
} mixer_t;
|
|
|
|
typedef struct servoParam_t {
|
|
int8_t direction; // servo direction
|
|
uint16_t middle; // servo middle
|
|
uint16_t min; // servo min
|
|
uint16_t max; // servo max
|
|
} servoParam_t;
|
|
|
|
enum {
|
|
ALIGN_GYRO = 0,
|
|
ALIGN_ACCEL = 1,
|
|
ALIGN_MAG = 2
|
|
};
|
|
|
|
typedef struct config_t {
|
|
uint8_t pidController; // 0 = multiwii original, 1 = rewrite from http://www.multiwii.com/forum/viewtopic.php?f=8&t=3671
|
|
uint8_t P8[PIDITEMS];
|
|
uint8_t I8[PIDITEMS];
|
|
uint8_t D8[PIDITEMS];
|
|
|
|
uint8_t rcRate8;
|
|
uint8_t rcExpo8;
|
|
uint8_t thrMid8;
|
|
uint8_t thrExpo8;
|
|
|
|
uint8_t rollPitchRate;
|
|
uint8_t yawRate;
|
|
|
|
uint8_t dynThrPID;
|
|
int16_t mag_declination; // Get your magnetic decliniation from here : http://magnetic-declination.com/
|
|
int16_t angleTrim[2]; // accelerometer trim
|
|
|
|
// sensor-related stuff
|
|
uint8_t acc_lpf_factor; // Set the Low Pass Filter factor for ACC. Increasing this value would reduce ACC noise (visible in GUI), but would increase ACC lag time. Zero = no filter
|
|
uint8_t accz_deadband; // set the acc deadband for z-Axis, this ignores small accelerations
|
|
uint8_t accxy_deadband; // set the acc deadband for xy-Axis
|
|
uint8_t baro_tab_size; // size of baro filter array
|
|
float baro_noise_lpf; // additional LPF to reduce baro noise
|
|
float baro_cf_vel; // apply Complimentary Filter to keep the calculated velocity based on baro velocity (i.e. near real velocity)
|
|
float baro_cf_alt; // apply CF to use ACC for height estimation
|
|
uint8_t acc_unarmedcal; // turn automatic acc compensation on/off
|
|
|
|
uint16_t activate[CHECKBOXITEMS]; // activate switches
|
|
|
|
// Radio/ESC-related configuration
|
|
uint8_t deadband; // introduce a deadband around the stick center for pitch and roll axis. Must be greater than zero.
|
|
uint8_t yawdeadband; // introduce a deadband around the stick center for yaw axis. Must be greater than zero.
|
|
uint8_t alt_hold_throttle_neutral; // defines the neutral zone of throttle stick during altitude hold, default setting is +/-40
|
|
uint8_t alt_hold_fast_change; // when disabled, turn off the althold when throttle stick is out of deadband defined with alt_hold_throttle_neutral; when enabled, altitude changes slowly proportional to stick movement
|
|
uint8_t throttle_angle_correction; //
|
|
|
|
// Failsafe related configuration
|
|
uint8_t failsafe_delay; // Guard time for failsafe activation after signal lost. 1 step = 0.1sec - 1sec in example (10)
|
|
uint8_t failsafe_off_delay; // Time for Landing before motors stop in 0.1sec. 1 step = 0.1sec - 20sec in example (200)
|
|
uint16_t failsafe_throttle; // Throttle level used for landing - specify value between 1000..2000 (pwm pulse width for slightly below hover). center throttle = 1500.
|
|
uint16_t failsafe_detect_threshold; // Update controls channel only if pulse is above failsafe_detect_threshold. below this trigger failsafe.
|
|
|
|
// mixer-related configuration
|
|
int8_t yaw_direction;
|
|
uint8_t tri_unarmed_servo; // send tail servo correction pulses even when unarmed
|
|
uint16_t tri_yaw_middle; // tail servo center pos. - use this for initial trim
|
|
uint16_t tri_yaw_min; // tail servo min
|
|
uint16_t tri_yaw_max; // tail servo max
|
|
|
|
// flying wing related configuration
|
|
uint16_t wing_left_min; // min/mid/max servo travel
|
|
uint16_t wing_left_mid;
|
|
uint16_t wing_left_max;
|
|
uint16_t wing_right_min;
|
|
uint16_t wing_right_mid;
|
|
uint16_t wing_right_max;
|
|
|
|
int8_t pitch_direction_l; // left servo - pitch orientation
|
|
int8_t pitch_direction_r; // right servo - pitch orientation (opposite sign to pitch_direction_l if servos are mounted mirrored)
|
|
int8_t roll_direction_l; // left servo - roll orientation
|
|
int8_t roll_direction_r; // right servo - roll orientation (same sign as ROLL_DIRECTION_L, if servos are mounted in mirrored orientation)
|
|
|
|
// gimbal-related configuration
|
|
int8_t gimbal_pitch_gain; // gimbal pitch servo gain (tied to angle) can be negative to invert movement
|
|
int8_t gimbal_roll_gain; // gimbal roll servo gain (tied to angle) can be negative to invert movement
|
|
uint8_t gimbal_flags; // in servotilt mode, various things that affect stuff
|
|
uint16_t gimbal_pitch_min; // gimbal pitch servo min travel
|
|
uint16_t gimbal_pitch_max; // gimbal pitch servo max travel
|
|
uint16_t gimbal_pitch_mid; // gimbal pitch servo neutral value
|
|
uint16_t gimbal_roll_min; // gimbal roll servo min travel
|
|
uint16_t gimbal_roll_max; // gimbal roll servo max travel
|
|
uint16_t gimbal_roll_mid; // gimbal roll servo neutral value
|
|
|
|
// gps-related stuff
|
|
uint16_t gps_wp_radius; // if we are within this distance to a waypoint then we consider it reached (distance is in cm)
|
|
uint8_t gps_lpf; // Low pass filter cut frequency for derivative calculation (default 20Hz)
|
|
uint8_t nav_slew_rate; // Adds a rate control to nav output, will smoothen out nav angle spikes
|
|
uint8_t nav_controls_heading; // copter faces toward the navigation point, maghold must be enabled for it
|
|
uint16_t nav_speed_min; // cm/sec
|
|
uint16_t nav_speed_max; // cm/sec
|
|
uint16_t ap_mode; // Temporarily Disables GPS_HOLD_MODE to be able to make it possible to adjust the Hold-position when moving the sticks, creating a deadspan for GPS
|
|
} config_t;
|
|
|
|
// System-wide
|
|
typedef struct master_t {
|
|
uint8_t version;
|
|
uint16_t size;
|
|
uint8_t magic_be; // magic number, should be 0xBE
|
|
|
|
uint8_t mixerConfiguration;
|
|
uint32_t enabledFeatures;
|
|
uint16_t looptime; // imu loop time in us
|
|
motorMixer_t customMixer[MAX_MOTORS]; // custom mixtable
|
|
|
|
// motor/esc/servo related stuff
|
|
uint16_t minthrottle; // Set the minimum throttle command sent to the ESC (Electronic Speed Controller). This is the minimum value that allow motors to run at a idle speed.
|
|
uint16_t maxthrottle; // This is the maximum value for the ESCs at full power this value can be increased up to 2000
|
|
uint16_t mincommand; // This is the value for the ESCs when they are not armed. In some cases, this value must be lowered down to 900 for some specific ESCs
|
|
uint16_t deadband3d_low; // min 3d value
|
|
uint16_t deadband3d_high; // max 3d value
|
|
uint16_t neutral3d; // center 3d value
|
|
uint16_t deadband3d_throttle; // default throttle deadband from MIDRC
|
|
uint16_t motor_pwm_rate; // The update rate of motor outputs (50-498Hz)
|
|
uint16_t servo_pwm_rate; // The update rate of servo outputs (50-498Hz)
|
|
|
|
// global sensor-related stuff
|
|
sensor_align_e gyro_align; // gyro alignment
|
|
sensor_align_e acc_align; // acc alignment
|
|
sensor_align_e mag_align; // mag alignment
|
|
int8_t yaw_control_direction; // change control direction of yaw (inverted, normal)
|
|
uint8_t acc_hardware; // Which acc hardware to use on boards with more than one device
|
|
uint16_t gyro_lpf; // gyro LPF setting - values are driver specific, in case of invalid number, a reasonable default ~30-40HZ is chosen.
|
|
uint16_t gyro_cmpf_factor; // Set the Gyro Weight for Gyro/Acc complementary filter. Increasing this value would reduce and delay Acc influence on the output of the filter.
|
|
uint16_t gyro_cmpfm_factor; // Set the Gyro Weight for Gyro/Magnetometer complementary filter. Increasing this value would reduce and delay Magnetometer influence on the output of the filter
|
|
uint32_t gyro_smoothing_factor; // How much to smoothen with per axis (32bit value with Roll, Pitch, Yaw in bits 24, 16, 8 respectively
|
|
uint8_t moron_threshold; // people keep forgetting that moving model while init results in wrong gyro offsets. and then they never reset gyro. so this is now on by default.
|
|
uint8_t mpu6050_scale; // es/non-es variance between MPU6050 sensors, half my boards are mpu6000ES, need this to be dynamic. automatically set by mpu6050 driver.
|
|
int16_t accZero[3];
|
|
int16_t magZero[3];
|
|
|
|
// Battery/ADC stuff
|
|
uint8_t vbatscale; // adjust this to match battery voltage to reported value
|
|
uint8_t vbatmaxcellvoltage; // maximum voltage per cell, used for auto-detecting battery voltage in 0.1V units, default is 43 (4.3V)
|
|
uint8_t vbatmincellvoltage; // minimum voltage per cell, this triggers battery out alarms, in 0.1V units, default is 33 (3.3V)
|
|
uint8_t power_adc_channel; // which channel is used for current sensor. Right now, only 2 places are supported: RC_CH2 (unused when in CPPM mode, = 1), RC_CH8 (last channel in PWM mode, = 9)
|
|
|
|
// Radio/ESC-related configuration
|
|
uint8_t rcmap[8]; // mapping of radio channels to internal RPYTA+ order
|
|
uint8_t spektrum_hires; // spektrum high-resolution y/n (1024/2048bit)
|
|
uint16_t midrc; // Some radios have not a neutral point centered on 1500. can be changed here
|
|
uint16_t mincheck; // minimum rc end
|
|
uint16_t maxcheck; // maximum rc end
|
|
uint8_t retarded_arm; // allow disarsm/arm on throttle down + roll left/right
|
|
|
|
// gps-related stuff
|
|
uint8_t gps_type; // Type of GPS hardware. 0: NMEA 1: UBX 2+ ??
|
|
uint32_t gps_baudrate; // GPS baudrate
|
|
|
|
// serial(uart1) baudrate
|
|
uint32_t serial_baudrate;
|
|
|
|
config_t profile[3]; // 3 separate profiles
|
|
uint8_t current_profile; // currently loaded profile
|
|
|
|
uint8_t magic_ef; // magic number, should be 0xEF
|
|
uint8_t chk; // XOR checksum
|
|
} master_t;
|
|
|
|
// Core runtime settings
|
|
typedef struct core_t {
|
|
serialPort_t *mainport;
|
|
serialPort_t *gpsport;
|
|
serialPort_t *telemport;
|
|
serialPort_t *rcvrport;
|
|
bool useServo;
|
|
|
|
} core_t;
|
|
|
|
typedef struct flags_t {
|
|
uint8_t OK_TO_ARM;
|
|
uint8_t ARMED;
|
|
uint8_t ACC_CALIBRATED;
|
|
uint8_t ANGLE_MODE;
|
|
uint8_t HORIZON_MODE;
|
|
uint8_t MAG_MODE;
|
|
uint8_t BARO_MODE;
|
|
uint8_t GPS_HOME_MODE;
|
|
uint8_t GPS_HOLD_MODE;
|
|
uint8_t HEADFREE_MODE;
|
|
uint8_t PASSTHRU_MODE;
|
|
uint8_t GPS_FIX;
|
|
uint8_t GPS_FIX_HOME;
|
|
uint8_t SMALL_ANGLES_25;
|
|
uint8_t CALIBRATE_MAG;
|
|
uint8_t VARIO_MODE;
|
|
} flags_t;
|
|
|
|
extern int16_t gyroZero[3];
|
|
extern int16_t gyroData[3];
|
|
extern int16_t angle[2];
|
|
extern int16_t axisPID[3];
|
|
extern int16_t rcCommand[4];
|
|
extern uint8_t rcOptions[CHECKBOXITEMS];
|
|
extern int16_t failsafeCnt;
|
|
|
|
extern int16_t debug[4];
|
|
extern int16_t gyroADC[3], accADC[3], accSmooth[3], magADC[3];
|
|
extern int32_t accSum[3];
|
|
extern uint16_t acc_1G;
|
|
extern uint32_t accTimeSum;
|
|
extern int accSumCount;
|
|
extern uint32_t currentTime;
|
|
extern uint32_t previousTime;
|
|
extern uint16_t cycleTime;
|
|
extern uint16_t calibratingA;
|
|
extern uint16_t calibratingB;
|
|
extern uint16_t calibratingG;
|
|
extern int16_t heading;
|
|
extern int32_t baroPressure;
|
|
extern int32_t baroTemperature;
|
|
extern uint32_t baroPressureSum;
|
|
extern int32_t BaroAlt;
|
|
extern int32_t sonarAlt;
|
|
extern int32_t EstAlt;
|
|
extern int32_t AltHold;
|
|
extern int32_t errorAltitudeI;
|
|
extern int32_t BaroPID;
|
|
extern int32_t vario;
|
|
extern int16_t throttleAngleCorrection;
|
|
extern int16_t headFreeModeHold;
|
|
extern int16_t heading, magHold;
|
|
extern int16_t motor[MAX_MOTORS];
|
|
extern int16_t servo[8];
|
|
extern int16_t rcData[8];
|
|
extern uint16_t rssi; // range: [0;1023]
|
|
extern uint8_t vbat;
|
|
extern int16_t telemTemperature1; // gyro sensor temperature
|
|
extern int16_t lookupPitchRollRC[6]; // lookup table for expo & RC rate PITCH+ROLL
|
|
extern int16_t lookupThrottleRC[11]; // lookup table for expo & mid THROTTLE
|
|
extern uint8_t toggleBeep;
|
|
|
|
// GPS stuff
|
|
extern int32_t GPS_coord[2];
|
|
extern int32_t GPS_home[2];
|
|
extern int32_t GPS_hold[2];
|
|
extern uint8_t GPS_numSat;
|
|
extern uint16_t GPS_distanceToHome; // distance to home or hold point in meters
|
|
extern int16_t GPS_directionToHome; // direction to home or hol point in degrees
|
|
extern uint16_t GPS_altitude,GPS_speed; // altitude in 0.1m and speed in 0.1m/s
|
|
extern uint8_t GPS_update; // it's a binary toogle to distinct a GPS position update
|
|
extern int16_t GPS_angle[2]; // it's the angles that must be applied for GPS correction
|
|
extern uint16_t GPS_ground_course; // degrees*10
|
|
extern uint8_t GPS_Present; // Checksum from Gps serial
|
|
extern uint8_t GPS_Enable;
|
|
extern int16_t nav[2];
|
|
extern int8_t nav_mode; // Navigation mode
|
|
extern int16_t nav_rated[2]; // Adding a rate controller to the navigation to make it smoother
|
|
extern uint8_t GPS_numCh; // Number of channels
|
|
extern uint8_t GPS_svinfo_chn[16]; // Channel number
|
|
extern uint8_t GPS_svinfo_svid[16]; // Satellite ID
|
|
extern uint8_t GPS_svinfo_quality[16]; // Bitfield Qualtity
|
|
extern uint8_t GPS_svinfo_cno[16]; // Carrier to Noise Ratio (Signal Strength)
|
|
|
|
extern core_t core;
|
|
extern master_t mcfg;
|
|
extern config_t cfg;
|
|
extern flags_t f;
|
|
extern sensor_t acc;
|
|
extern sensor_t gyro;
|
|
extern baro_t baro;
|
|
|
|
// main
|
|
void setPIDController(int type);
|
|
void loop(void);
|
|
|
|
// IMU
|
|
void imuInit(void);
|
|
void annexCode(void);
|
|
void computeIMU(void);
|
|
void blinkLED(uint8_t num, uint8_t wait, uint8_t repeat);
|
|
int getEstimatedAltitude(void);
|
|
|
|
// Sensors
|
|
void sensorsAutodetect(void);
|
|
void batteryInit(void);
|
|
uint16_t batteryAdcToVoltage(uint16_t src);
|
|
void ACC_getADC(void);
|
|
int Baro_update(void);
|
|
void Gyro_getADC(void);
|
|
void Mag_init(void);
|
|
int Mag_getADC(void);
|
|
void Sonar_init(void);
|
|
void Sonar_update(void);
|
|
|
|
// Output
|
|
void mixerInit(void);
|
|
void mixerLoadMix(int index);
|
|
void writeServos(void);
|
|
void writeMotors(void);
|
|
void writeAllMotors(int16_t mc);
|
|
void mixTable(void);
|
|
|
|
// Serial
|
|
void serialInit(uint32_t baudrate);
|
|
void serialCom(void);
|
|
|
|
// Config
|
|
void parseRcChannels(const char *input);
|
|
void readEEPROM(void);
|
|
void writeEEPROM(uint8_t b, uint8_t updateProfile);
|
|
void checkFirstTime(bool reset);
|
|
bool sensors(uint32_t mask);
|
|
void sensorsSet(uint32_t mask);
|
|
void sensorsClear(uint32_t mask);
|
|
uint32_t sensorsMask(void);
|
|
bool feature(uint32_t mask);
|
|
void featureSet(uint32_t mask);
|
|
void featureClear(uint32_t mask);
|
|
void featureClearAll(void);
|
|
uint32_t featureMask(void);
|
|
|
|
// spektrum
|
|
void spektrumInit(void);
|
|
bool spektrumFrameComplete(void);
|
|
|
|
// buzzer
|
|
void buzzer(uint8_t warn_vbat);
|
|
|
|
// cli
|
|
void cliProcess(void);
|
|
|
|
// gps
|
|
void gpsInit(uint32_t baudrate);
|
|
void GPS_reset_home_position(void);
|
|
void GPS_reset_nav(void);
|
|
void GPS_set_pids(void);
|
|
void GPS_set_next_wp(int32_t* lat, int32_t* lon);
|
|
int32_t wrap_18000(int32_t error);
|
|
|
|
// telemetry
|
|
void initTelemetry(bool State);
|
|
void sendTelemetry(void);
|