static const Port::Mask SCLK = Port::P0;
static const Port::Mask MOSI = Port::P1;
static const Port::Mask MISO = Port::P2;
static const Port::Mask CS = Port::P3;
static const unsigned int AVERAGING_BUFFER_LENGTH = 8;
static const int PRINT_LOOP_FREQUENCY = 40;
static const ADXL345::DataRate DATA_RATE = ADXL345::DataRate::_3200_HZ;
static const ADXL345::Range RANGE = ADXL345::_2G;
void initialize (const ADXL345 &accelerometer);
const ADXL345 accelerometer(CS);
initialize(accelerometer);
auto timer =
CNT + SECOND / PRINT_LOOP_FREQUENCY;
while (1) {
int16_t buffer[AVERAGING_BUFFER_LENGTH][ADXL345::AXES];
int32_t totals[ADXL345::AXES] = {0, 0, 0};
float fValues[ADXL345::AXES];
for (unsigned int i = 0; i < AVERAGING_BUFFER_LENGTH; ++i)
accelerometer.read(buffer[i]);
for (unsigned int i = 0; i < AVERAGING_BUFFER_LENGTH; ++i)
for (unsigned int axis = 0; axis < ADXL345::AXES; ++axis)
totals[axis] += buffer[i][axis];
for (unsigned int axis = 0; axis < ADXL345::AXES; ++axis)
fValues[axis] = ADXL345::scale(totals[axis], RANGE) / AVERAGING_BUFFER_LENGTH;
pwOut.
printf(
"X: %5.2f, Y: %5.2f, Z: %5.2f\n", fValues[ADXL345::X], fValues[ADXL345::Y], fValues[ADXL345::Z]);
timer =
waitcnt2(timer, SECOND / PRINT_LOOP_FREQUENCY);
}
}
void initialize (const ADXL345 &accelerometer) {
SPI::get_instance().set_mosi(MOSI);
SPI::get_instance().set_miso(MISO);
SPI::get_instance().set_sclk(SCLK);
ADXL345::RateAndPowerMode rateAndPowerMode;
rateAndPowerMode.fields.dataRate = DATA_RATE;
accelerometer.write(ADXL345::Register::RATE_AND_POWER_MODE, rateAndPowerMode.raw);
ADXL345::DataFormat dataFormat;
dataFormat.fields.range = RANGE;
accelerometer.write(ADXL345::Register::DATA_FORMAT, dataFormat.raw);
ADXL345::FIFOControl fifoControl;
fifoControl.fields.fifoMode = ADXL345::FIFOMode::STREAM;
accelerometer.write(ADXL345::Register::FIFO_CONTROL, fifoControl.raw);
accelerometer.start();
}