Skip to content

Commit b153186

Browse files
committed
[example] ADIS16470 IMU example for Nucleo-F429ZI
1 parent 2b4855b commit b153186

File tree

2 files changed

+154
-0
lines changed

2 files changed

+154
-0
lines changed
Lines changed: 143 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,143 @@
1+
/*
2+
* Copyright (c) 2022, Raphael Lehmann
3+
*
4+
* This file is part of the modm project.
5+
*
6+
* This Source Code Form is subject to the terms of the Mozilla Public
7+
* License, v. 2.0. If a copy of the MPL was not distributed with this
8+
* file, You can obtain one at http://mozilla.org/MPL/2.0/.
9+
*/
10+
// ----------------------------------------------------------------------------
11+
12+
#include <modm/board.hpp>
13+
#include <modm/platform/spi/spi_master_1.hpp>
14+
#include <modm/driver/inertial/adis16470.hpp>
15+
#include <optional>
16+
17+
using namespace Board;
18+
19+
using SpiMaster = SpiMaster1;
20+
using Mosi = GpioB5;
21+
using Miso = GpioB4;
22+
using Sck = GpioB3;
23+
using Cs = GpioA4;
24+
using Dr = GpioB9;
25+
using Rst = GpioB8;
26+
27+
using Adis16470 = modm::Adis16470<SpiMaster, Cs>;
28+
29+
Adis16470 imu{};
30+
31+
int
32+
main()
33+
{
34+
Board::initialize();
35+
Leds::setOutput();
36+
37+
MODM_LOG_INFO << "ADIS16470 IMU demo on Nucleo-F429ZI\n" << modm::endl;
38+
39+
SpiMaster::initialize<Board::SystemClock, 650_kHz>();
40+
SpiMaster::connect<Sck::Sck, Mosi::Mosi, Miso::Miso>();
41+
42+
Rst::setOutput();
43+
Dr::setInput(Gpio::InputType::PullUp);
44+
45+
// Reset ADS816x chip
46+
Rst::reset();
47+
modm::delay(10ms);
48+
Rst::set();
49+
50+
// Wait start-up time
51+
modm::delay(252ms);
52+
53+
MODM_LOG_INFO << "Initializing IMU..." << modm::endl;
54+
RF_CALL_BLOCKING(imu.initialize());
55+
56+
// Software reset
57+
RF_CALL_BLOCKING(imu.writeGlobCmd(modm::adis16470::GlobCmd::SoftwareReset));
58+
// Wait start-up time after reset
59+
modm::delay(252ms);
60+
61+
// Trigger self test
62+
RF_CALL_BLOCKING(imu.writeGlobCmd(modm::adis16470::GlobCmd::SensorSelfTest));
63+
// Wait for self test to complete
64+
modm::delay(14ms);
65+
66+
modm::adis16470::DiagStat_t diagStat = RF_CALL_BLOCKING(imu.readDiagStat());
67+
MODM_LOG_INFO << "Reading DIAG_STAT register = " << diagStat << modm::endl;
68+
69+
modm::delay(1ms);
70+
auto result = RF_CALL_BLOCKING(imu.readRegister(modm::adis16470::Register::PROD_ID));
71+
if (result.has_value()) {
72+
MODM_LOG_INFO << "ADIS16470 product id = " << *result << " (should be 16470==0x4056)" << modm::endl;
73+
}
74+
else {
75+
MODM_LOG_INFO << "Unable to reag PROD_ID register" << modm::endl;
76+
}
77+
78+
modm::adis16470::MscCtrl_t mscCtrl = RF_CALL_BLOCKING(imu.readMscCtrl());
79+
MODM_LOG_INFO << "Reading MSC_CTRL register = " << mscCtrl << modm::endl;
80+
81+
RF_CALL_BLOCKING(imu.setDataOutputFrequency<10_Hz>());
82+
83+
RF_CALL_BLOCKING(imu.writeRegister(modm::adis16470::Register::FILT_CTRL, 8)); // N_B = 2^8 = 64
84+
85+
mscCtrl = modm::adis16470::MscCtrl::DrPolarity | modm::adis16470::MscCtrl::PointOfPercussionAlign;
86+
MODM_LOG_INFO << "Writing MSC_CTRL register = " << mscCtrl << modm::endl;
87+
RF_CALL_BLOCKING(imu.writeMscCtrl(mscCtrl));
88+
89+
diagStat = RF_CALL_BLOCKING(imu.readDiagStat());
90+
MODM_LOG_INFO << "Reading DIAG_STAT register = " << diagStat << modm::endl;
91+
92+
mscCtrl = RF_CALL_BLOCKING(imu.readMscCtrl());
93+
MODM_LOG_INFO << "Reading MSC_CTRL register = " << mscCtrl << modm::endl;
94+
95+
// Writing and reading USER_SCR1 register
96+
std::optional<uint16_t> scr1 = RF_CALL_BLOCKING(imu.readRegister(modm::adis16470::Register::USER_SCR1));
97+
if (scr1.has_value()) {
98+
MODM_LOG_INFO << "Reading USER_SCR1 register = " << *scr1 << modm::endl;
99+
}
100+
else {
101+
MODM_LOG_INFO << "Unable to USER_SCR1 register." << modm::endl;
102+
}
103+
MODM_LOG_INFO << "Writing USER_SCR1 register = 42" << modm::endl;
104+
RF_CALL_BLOCKING(imu.writeRegister(modm::adis16470::Register::USER_SCR1, 42));
105+
scr1 = RF_CALL_BLOCKING(imu.readRegister(modm::adis16470::Register::USER_SCR1));
106+
if (scr1.has_value()) {
107+
MODM_LOG_INFO << "Reading USER_SCR1 register = " << *scr1 << modm::endl;
108+
}
109+
else {
110+
MODM_LOG_INFO << "Unable to USER_SCR1 register." << modm::endl;
111+
}
112+
113+
std::array<uint16_t, 11> data;
114+
115+
while (true)
116+
{
117+
MODM_LOG_INFO.printf("\nIMU data: ");
118+
119+
while (!Dr::read()) {}
120+
while (Dr::read()) {}
121+
122+
if( !RF_CALL_BLOCKING(imu.readRegisterBurst(data))) {
123+
MODM_LOG_INFO.printf("checksum mismatch! ");
124+
Board::LedRed::toggle();
125+
}
126+
127+
// print data anyways
128+
MODM_LOG_INFO.printf("DIAG_STAT=%05u, ", data[1]);
129+
MODM_LOG_INFO.printf("X_GYRO_OUT=%+05i, ", static_cast<int16_t>(data[2]));
130+
MODM_LOG_INFO.printf("Y_GYRO_OUT=%+05i, ", static_cast<int16_t>(data[3]));
131+
MODM_LOG_INFO.printf("Z_GYRO_OUT=%+05i, ", static_cast<int16_t>(data[4]));
132+
MODM_LOG_INFO.printf("X_ACCL_OUT=%+05i, ", static_cast<int16_t>(data[5]));
133+
MODM_LOG_INFO.printf("Y_ACCL_OUT=%+05i, ", static_cast<int16_t>(data[6]));
134+
MODM_LOG_INFO.printf("Z_ACCL_OUT=%+05i, ", static_cast<int16_t>(data[7]));
135+
MODM_LOG_INFO.printf("TEMP_OUT=%+05i (1/10 C), ", data[8]);
136+
MODM_LOG_INFO.printf("DATA_CNTR=%05u, ", data[9]);
137+
MODM_LOG_INFO.printf("checksum=%05u", data[10]);
138+
139+
Board::LedGreen::toggle();
140+
}
141+
142+
return 0;
143+
}
Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
<library>
2+
<extends>modm:nucleo-f429zi</extends>
3+
<options>
4+
<option name="modm:build:build.path">../../../build/nucleo_f429zi/imu_adis16470</option>
5+
</options>
6+
<modules>
7+
<module>modm:build:scons</module>
8+
<module>modm:platform:spi:1</module>
9+
<module>modm:driver:adis16470</module>
10+
</modules>
11+
</library>

0 commit comments

Comments
 (0)