Important changes to repositories hosted on mbed.com
Mbed hosted mercurial repositories are deprecated and are due to be permanently deleted in July 2026.
To keep a copy of this software download the repository Zip archive or clone locally using Mercurial.
It is also possible to export all your personal repositories from the account settings page.
Dependencies: mbed-dev
Fork of Adafruit9-DOf_AHRS_Regler_Discrete by
Source/main.cpp
- Committer:
- rtlabor
- Date:
- 2018-09-20
- Revision:
- 3:cc828af4a4c6
- Parent:
- 1:8c4f93e10af3
File content as of revision 3:cc828af4a4c6:
#include "mbed.h"
#define _MBED_
#include "Adafruit_9DOF.h"
#include "Serial_base.h"
#include "MadgwickAHRS.h"
/**
* Defines
*/
#define PI 3.1415926536
Adafruit_9DOF dof = Adafruit_9DOF();
Adafruit_LSM303_Accel_Unified accel = Adafruit_LSM303_Accel_Unified(30301);
Adafruit_LSM303_Mag_Unified mag = Adafruit_LSM303_Mag_Unified(30302);
Adafruit_L3GD20_Unified gyro = Adafruit_L3GD20_Unified(30303);
//Debug/Communication with PC through
Serial pc(SERIAL_TX, SERIAL_RX,115200); // serial connection via USB - programmer
// Magnetometer correction
// mounted in gimbal
//Cal for Nickachse
//double RotMag [3][3] = {{0.947568, -0.0262851, 0.0355492},
// {-0.0262851, 0.98413, 0.014105},
// {0.0355492, 0.014105, 0.970769}};
//double offsetsMag [3] = { -22.1205, -13.9738, -2.55159 };
double offsetsMag[3] = {23.5297, -7.51693, 17.5943};
double RotMag[3][3] = {{0.678312, -0.0371453, 0.0139236}, {-0.0371453, 0.993299, 0.0229827}, {0.0139236, 0.0229827, 0.809984}};
//double gainsMag [3] = { 39.1659, 38.1534, 35.7245 };
//double refMag = 47.9824; //nT
//Accelerometer correction
double RotAccel [3][3] = { {-0.1251, -0.7810, -0.6118},
{ 0.0409, 0.6121, -0.7879},
{ 0.9913, -0.1238, -0.0466} };
double offsetsAccel [3] = { -0.215747, 0.509946, -0.235360 };
double gainsAccel [3] = { 0.978548, 0.976637, 0.939921 };
//Gyrometer correction
double offsetsGyro [3] = { -0.0107709, 0.00729576, 0.0225833 };
//Filter for orientation estimation
Madgwick filter;
DigitalIn CPUEnable(D11);
DigitalOut motorEnable(D12, 0);
PwmOut SollStrom(PB_3); //in [A]
//Timer for controller interrupt
// the controll loop will be atached to the timer interrupt
Ticker ControllerLoopTimer;
void updateAHRS(void);
//Sensor events, contains the last read sensor values
sensors_event_t mag_event;
sensors_event_t accel_event;
sensors_event_t gyro_event;
//Sensor values after the calibration/correction is applied, (x,y,z)
double CorrectedMagnetometer[3];
double CorrectedAccelerometer[3];
double CorrectedGyrometer[3];
//"User Interface", Start/Stop controller
DigitalIn SystemEnable(USER_BUTTON);
//Status LED, on when controller on
DigitalOut SystemEnableLED(LED3, 0);
//variables for loop time estimation
uint32_t LoopCounter = 0;
Timer t;
float TotalTime;
//maximaler Fehler
float eMaxPos = 0;
float eMaxNeg = 0;
/**************************************************************************
/
/
@brief Initialises all the sensors used by this example
/
**************************************************************************/
void initSensors()
{
pc.printf(("Init...\r\n"));
if(!accel.begin())
{
/* There was a problem detecting the LSM303 ... check your connections */
pc.printf(("Ooops, no LSM303 detected ... Check your wiring!\r\n"));
while(1);
}
if(!mag.begin())
{
/* There was a problem detecting the LSM303 ... check your connections */
pc.printf("Ooops, no LSM303 detected ... Check your wiring!\r\n");
while(1);
}
gyroRange_t rng = GYRO_RANGE_2000DPS; //set gyro range to +/-2000dps
if(!gyro.begin(rng))
{
/* There was a problem detecting the LSM303 ... check your connections */
pc.printf("Ooops, no L3GD20 detected ... Check your wiring!\r\n");
while(1);
}
}
/**************************************************************************
@brief system initialisation
**************************************************************************/
void setup(void)
{
pc.printf(("Adafruit 9 DOF Pitch/Roll/Heading Example \n"));
pc.printf("\n");
/* Initialise the sensors */
initSensors();
}
int main()
{
//init system
setup();
//set PWM frequncy to 1 kHZ
wait_ms(500);
pc.printf("Started! \r\n");
//ControllerLoopTimer.attach(&updateControllers, 1.0f); //Assume Ts = 1/100;
//controller on -> LED on
t.start();
//do as long user button d'ont get pressed
while ( 1 )// schafft etwa 400Hz
{
LoopCounter++;
updateAHRS();
if(LoopCounter == 100)
{
LoopCounter = 0;
//pc.printf("R %3.2f P %3.2f Y %3.2f \r\n",filter.getRoll(),filter.getPitch(),filter.getYaw());
//pc.printf("R %2.4f P %2.4f Y %2.4f \r\n",gyro_event.gyro.x,gyro_event.gyro.y,gyro_event.gyro.z);
filter.getRoll();
pc.printf("A %f B %f C %f D %f\r\n",filter.Q[0],filter.Q[1],filter.Q[2],filter.Q[3]);
}
//wait_ms(100);
}
}
void updateAHRS(void)
{
mag.getEvent(&mag_event);
accel.getEvent(&accel_event);
gyro.getEvent(&gyro_event);
//Magnetometer correction
mag_event.magnetic.x = ((double)mag_event.magnetic.x) - offsetsMag[0];
mag_event.magnetic.y = ((double)mag_event.magnetic.y) - offsetsMag[1];
mag_event.magnetic.z = ((double)mag_event.magnetic.z) - offsetsMag[2];
CorrectedMagnetometer[0] = ((double)mag_event.magnetic.x)*RotMag[0][0] + ((double)mag_event.magnetic.y)*RotMag[0][1] + ((double)mag_event.magnetic.z)*RotMag[0][2];
CorrectedMagnetometer[1] = ((double)mag_event.magnetic.x)*RotMag[1][0] + ((double)mag_event.magnetic.y)*RotMag[1][1] + ((double)mag_event.magnetic.z)*RotMag[1][2];
CorrectedMagnetometer[2] = ((double)mag_event.magnetic.x)*RotMag[2][0] + ((double)mag_event.magnetic.y)*RotMag[2][1] + ((double)mag_event.magnetic.z)*RotMag[2][2];
//Accelerometer correction
CorrectedAccelerometer[0] = ((double)accel_event.acceleration.x) - offsetsAccel[0];
CorrectedAccelerometer[1] = ((double)accel_event.acceleration.y) - offsetsAccel[1];
CorrectedAccelerometer[2] = ((double)accel_event.acceleration.z) - offsetsAccel[2];
CorrectedAccelerometer[0] = CorrectedAccelerometer[0] * gainsAccel[0];
CorrectedAccelerometer[1] = CorrectedAccelerometer[1] * gainsAccel[1];
CorrectedAccelerometer[2] = CorrectedAccelerometer[2] * gainsAccel[2];
//Gyrometer correction
CorrectedGyrometer[0] = ((double)gyro_event.gyro.x) - offsetsGyro[0];
CorrectedGyrometer[1] = ((double)gyro_event.gyro.y) - offsetsGyro[1];
CorrectedGyrometer[2] = ((double)gyro_event.gyro.z) - offsetsGyro[2];
//Perform Madgwick-filter update
filter.update( CorrectedGyrometer[0]/ PI * 180, -CorrectedGyrometer[1]/ PI * 180, -CorrectedGyrometer[2]/ PI * 180 ,
-CorrectedAccelerometer[0] , CorrectedAccelerometer[1] , CorrectedAccelerometer[2] ,
CorrectedMagnetometer[0] , -CorrectedMagnetometer[1], -CorrectedMagnetometer[2]);
}
