Skip to content
Snippets Groups Projects
Commit d9d026c2 authored by Andrea Milluzzo's avatar Andrea Milluzzo
Browse files

[IMU] LSM9DS1

adjusted formatting and Doxygen comments for members
parent 0dbf5ecb
No related branches found
No related tags found
No related merge requests found
......@@ -23,28 +23,30 @@
*/
#include <array>
#include "drivers/HardwareTimer.h"
#include "drivers/spi/SPIDriver.h"
#include "logger/Logger.h"
#include "sensors/LSM9DS1/LSM9DS1_AxelGyro.h"
#include "sensors/LSM9DS1/LSM9DS1_Magneto.h"
#include "diagnostic/CpuMeter.h"
#include "logger/Logger.h"
using namespace miosix;
using namespace std;
typedef Gpio<GPIOA_BASE, 5> GpioSck; //SPI1 f407
// SPI1 f407
typedef Gpio<GPIOA_BASE, 5> GpioSck;
typedef Gpio<GPIOA_BASE, 6> GpioMiso;
typedef Gpio<GPIOA_BASE, 7> GpioMosi;
typedef Gpio<GPIOC_BASE, 13> GpioINT1; //INT1 A/G
// INT1 A/G LSM9DS1
typedef Gpio<GPIOC_BASE, 13> GpioINT1;
// SPI
// SPI bus & cs
SPIBus bus(SPI1);
GpioPin cs_XLG(GPIOE_BASE, 7);
GpioPin cs_M(GPIOE_BASE, 9);
// LED just for init
// LED just for visual reference
GpioPin LED1(GPIOD_BASE, 15);
GpioPin LED2(GPIOD_BASE, 13);
GpioPin LED3(GPIOD_BASE, 14);
......@@ -52,11 +54,10 @@ GpioPin LED3(GPIOD_BASE, 14);
// USR pushbutton
GpioPin PUSHBUTTON(GPIOA_BASE, 0);
// SPI read flag
volatile bool flagSPIReadRequest = false;
//IMU obj data
// IMU obj variables
static const bool FIFO_ENABLED = true;
static const uint8_t FIFO_WATERMARK = 20;
static const uint16_t FIFO_SAMPLES = 1000;
......@@ -105,8 +106,6 @@ void timer5Config();
void EXTI1Config();
void printStats(void*);
uint16_t fifo_counter = 0;
int main()
{
......@@ -115,8 +114,10 @@ int main()
uint64_t lastMagtick = 0;
uint64_t lastTemptick = 0;
// Spawn thread for loggings logger stats
Thread::create(printStats, 4096);
// start logger
Logger& logger = Logger::instance();
logger.start();
......@@ -124,27 +125,38 @@ int main()
timer5Config();
EXTI1Config();
lsm9ds1_xlg = new LSM9DS1_XLG(bus, cs_XLG, LSM9DS1_XLG::AxelFSR::FS_8,
LSM9DS1_XLG::GyroFSR::FS_245,LSM9DS1_XLG::ODR::ODR_238,
FIFO_ENABLED, FIFO_WATERMARK);
lsm9ds1_xlg = new LSM9DS1_XLG(
bus, cs_XLG, LSM9DS1_XLG::AxelFSR::FS_8, LSM9DS1_XLG::GyroFSR::FS_245,
LSM9DS1_XLG::ODR::ODR_238, FIFO_ENABLED, FIFO_WATERMARK);
lsm9ds1_m = new LSM9DS1_M(bus,cs_M, LSM9DS1_M::MagFSR::FS_8,LSM9DS1_M::ODR::ODR_40);
lsm9ds1_m = new LSM9DS1_M(bus, cs_M, LSM9DS1_M::MagFSR::FS_8,
LSM9DS1_M::ODR::ODR_40);
while (!lsm9ds1_xlg->init());
while (!lsm9ds1_m->init());
while (!lsm9ds1_xlg->init())
;
while (!lsm9ds1_m->init())
;
LED2.high(); // init OK
lsm9ds1_xlg->clearFIFO(); //just to be sure to intercept the first interrupt
// just to be sure to intercept the first interrupt rising edge
lsm9ds1_xlg->clearFIFO();
//start sampling
// sampling until you push the button
while (!PUSHBUTTON.value())
{
//ACCELEROMETER + GYROSCOPE UPDATE (FIFO)
//an interrupt is set: time to dump the FIFO
if (flagSPIReadRequest)
{
flagSPIReadRequest = false;
dt = hrclock.toMicroSeconds(delta)/FIFO_WATERMARK; //delta of each sample
// delta of each sample = delta beetween interrupts / #samples
dt = hrclock.toMicroSeconds(delta) / FIFO_WATERMARK;
//dump the fifo
lsm9ds1_xlg->onSimpleUpdate();
//update each timestamp and log the sample (da integrare su driver?)
for (int i = 0; i < FIFO_WATERMARK; i++)
{
lsm9ds1XLGSample XLGsample = lsm9ds1_xlg->getLsm9ds1FIFO()[i];
......@@ -152,32 +164,42 @@ int main()
XLGsample.timestamp = XLGtimestamp;
logger.log(XLGsample);
}
LED1.low();
fifo_counter++;
}
//MAGNETOMETER UPDATE (SIMPLE)
if (miosix::getTick() - lastMagtick >= MAG_SAMPLING_PERIOD)
{
lastMagtick = miosix::getTick();
//get sample from the sensor
lsm9ds1_m->onSimpleUpdate();
//update timestamp and log the sample
lsm9ds1MSample MAGsample;
MAGsample.magData = *(lsm9ds1_m->compassDataPtr());
MAGsample.timestamp = lastMagtick;
logger.log(MAGsample);
}
//TEMPERATURE UPDATE (SIMPLE)
if (miosix::getTick() - lastTemptick >= TEMP_SAMPLING_PERIOD)
{
lastTemptick = miosix::getTick();
//get sample from the sensor
lsm9ds1_xlg->temperatureUpdate();
//update timestamp and log the sample
lsm9ds1TSample Tsample;
Tsample.tempData = *(lsm9ds1_xlg->tempDataPtr());
Tsample.timestamp = lastTemptick;
logger.log(Tsample);
}
}
//stop log
logger.stop();
LED1.low();
......@@ -186,7 +208,9 @@ int main()
Thread::sleep(10000);
reboot();
while(1);
while (1)
;
return 0;
}
......@@ -225,7 +249,6 @@ void gpioConfig()
// Select USR pushbutton
PUSHBUTTON.mode(Mode::INPUT);
}
cs_XLG.high();
......@@ -271,7 +294,9 @@ void EXTI1Config() // PC13
void printStats(void*)
{
Logger& log = Logger::instance();
while(!log.isStarted());
while (!log.isStarted())
;
while (log.isStarted())
{
LogStats stats = log.getLogStats();
......
......@@ -28,8 +28,8 @@
using namespace miosix;
typedef Gpio<GPIOA_BASE, 5> GpioSck; // questi sono i pin SPI per
// f407_discovery
// pin f407 discovery SPI1
typedef Gpio<GPIOA_BASE, 5> GpioSck;
typedef Gpio<GPIOA_BASE, 6> GpioMiso;
typedef Gpio<GPIOA_BASE, 7> GpioMosi;
......@@ -37,7 +37,6 @@ static const bool FIFO_ENABLED = false;
// SPI
SPIBus bus(SPI1);
// SPIBusConfig cfg;
GpioPin cs_XLG(GPIOE_BASE, 7);
GpioPin cs_M(GPIOE_BASE, 9);
......@@ -54,7 +53,8 @@ int main()
{
FastInterruptDisableLock dLock;
RCC->APB2ENR |= RCC_APB2ENR_SPI1EN; // SPI1 ENABLE
// SPI1 ENABLE
RCC->APB2ENR |= RCC_APB2ENR_SPI1EN;
GpioSck::mode(Mode::ALTERNATE);
GpioMiso::mode(Mode::ALTERNATE);
......@@ -73,20 +73,10 @@ int main()
LED2.mode(Mode::OUTPUT);
}
// chip select high
cs_XLG.high();
cs_M.high();
// dump regiters
/*
for(int reg=0; reg<=0x38; reg++)
{
SPISlave spislave(bus, cs_XLG, cfg);
SPITransaction spi(spislave);
uint8_t data = spi.read(reg);
printf("0x%02X-->0x%02X\n", reg,data);
}
}*/
LSM9DS1_XLG lsm9ds1X(bus, cs_XLG, LSM9DS1_XLG::AxelFSR::FS_8,
LSM9DS1_XLG::GyroFSR::FS_245,
LSM9DS1_XLG::ODR::ODR_952);
......@@ -110,18 +100,30 @@ int main()
long long first_tick = getTick();
for (;;)
{
//get timestamp
long long last_tick = getTick();
//get axel+gyro+temp data
lsm9ds1X.onSimpleUpdate();
adata = *(lsm9ds1X.accelDataPtr());
gdata = *(lsm9ds1X.gyroDataPtr());
tdata = *(lsm9ds1X.tempDataPtr());
//get magneto data
lsm9ds1M.onSimpleUpdate();
mdata = *(lsm9ds1M.compassDataPtr());
// clang-format off
printf("%d,%.3f,%.3f,%.3f,%.3f,%.3f,%.3f,%.3f,%.3f,%.3f,%.1f\n",
(int)(last_tick - first_tick), adata.getX(), adata.getY(),
adata.getZ(), gdata.getX(), gdata.getY(), gdata.getZ(),
mdata.getX(), mdata.getY(), mdata.getZ(), tdata);
// printf("%.3f,%.3f,%.3f\n", mdata.getX(), mdata.getY(), mdata.getZ());
(int)(last_tick - first_tick),
adata.getX(), adata.getY(), adata.getZ(),
gdata.getX(), gdata.getY(), gdata.getZ(),
mdata.getX(), mdata.getY(), mdata.getZ(),
tdata);
// clang-format on
}
return 0;
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment