

The ICM-20948 is a highly integrated 9-axis motion tracking device that combines a 3-axis gyroscope, a 3-axis accelerometer, and a 3-axis magnetometer in a single compact package. This sensor is designed for applications requiring precise motion and orientation tracking, such as robotics, drones, augmented reality (AR), virtual reality (VR), and mobile devices. Its small size, low power consumption, and high performance make it an ideal choice for embedded systems and IoT applications.








The ICM-20948 offers a wide range of features and capabilities. Below are its key technical specifications:
| Parameter | Value |
|---|---|
| Gyroscope Range | ±250, ±500, ±1000, ±2000 degrees per second |
| Accelerometer Range | ±2g, ±4g, ±8g, ±16g |
| Magnetometer Range | ±4900 µT |
| Gyroscope Resolution | 16-bit |
| Accelerometer Resolution | 16-bit |
| Magnetometer Resolution | 16-bit |
| Communication Interface | I²C (up to 400 kHz) and SPI (up to 7 MHz) |
| Operating Voltage | 1.71V to 3.6V |
| Operating Temperature | -40°C to +85°C |
| Power Consumption | 2.5 mA (typical, in full operation mode) |
| Package Size | 3 mm x 3 mm x 1 mm |
The ICM-20948 is typically available in a 24-pin QFN package. Below is the pin configuration:
| Pin Number | Pin Name | Description |
|---|---|---|
| 1 | VDD | Power supply input (1.71V to 3.6V) |
| 2 | GND | Ground connection |
| 3 | SCL/SCLK | I²C clock line / SPI clock |
| 4 | SDA/SDI | I²C data line / SPI data input |
| 5 | AD0/SDO | I²C address select / SPI data output |
| 6 | INT | Interrupt output |
| 7 | FSYNC | Frame synchronization input/output |
| 8-24 | NC | No connection (reserved for future use) |
The ICM-20948 can be used in a variety of circuits and is compatible with microcontrollers such as the Arduino UNO. Below are the steps to use the ICM-20948 in a circuit:
Below is an example Arduino sketch to read data from the ICM-20948 using the I²C interface:
#include <Wire.h>
// ICM-20948 I2C address (default is 0x68 if AD0 is connected to GND)
#define ICM20948_ADDRESS 0x68
// Register addresses
#define WHO_AM_I 0x00
#define ACCEL_XOUT_H 0x2D
void setup() {
Wire.begin(); // Initialize I2C communication
Serial.begin(9600); // Initialize serial communication for debugging
// Check if the ICM-20948 is connected
Wire.beginTransmission(ICM20948_ADDRESS);
Wire.write(WHO_AM_I); // Request the WHO_AM_I register
Wire.endTransmission();
Wire.requestFrom(ICM20948_ADDRESS, 1);
if (Wire.available()) {
byte whoAmI = Wire.read();
if (whoAmI == 0xEA) { // Expected WHO_AM_I response for ICM-20948
Serial.println("ICM-20948 detected!");
} else {
Serial.println("ICM-20948 not detected. Check connections.");
}
}
}
void loop() {
// Read accelerometer data
Wire.beginTransmission(ICM20948_ADDRESS);
Wire.write(ACCEL_XOUT_H); // Request accelerometer X-axis high byte
Wire.endTransmission();
Wire.requestFrom(ICM20948_ADDRESS, 6); // Request 6 bytes (X, Y, Z)
if (Wire.available() == 6) {
int16_t accelX = (Wire.read() << 8) | Wire.read();
int16_t accelY = (Wire.read() << 8) | Wire.read();
int16_t accelZ = (Wire.read() << 8) | Wire.read();
Serial.print("Accel X: ");
Serial.print(accelX);
Serial.print(" Y: ");
Serial.print(accelY);
Serial.print(" Z: ");
Serial.println(accelZ);
}
delay(500); // Wait 500ms before the next reading
}
ICM-20948 Not Detected
Inaccurate Sensor Readings
No Data from the Sensor
Q: Can the ICM-20948 be used with SPI instead of I²C?
A: Yes, the ICM-20948 supports both I²C and SPI communication. For SPI, connect the SCL/SCLK, SDA/SDI, and AD0/SDO pins to the appropriate SPI pins on your microcontroller.
Q: How do I calibrate the ICM-20948?
A: Calibration involves collecting raw data from the gyroscope, accelerometer, and magnetometer, and applying offsets to account for biases. Many libraries provide built-in calibration functions.
Q: What is the maximum sampling rate of the ICM-20948?
A: The ICM-20948 supports a maximum sampling rate of 1125 Hz for the gyroscope and accelerometer.
By following this documentation, you can effectively integrate the ICM-20948 into your projects for precise motion and orientation tracking.