

The ICM20948 is a 9-axis motion tracking device that integrates a 3-axis gyroscope, a 3-axis accelerometer, and a 3-axis magnetometer into a single compact chip. This versatile sensor is widely used in applications requiring precise orientation and motion sensing, such as robotics, drones, smartphones, and wearable devices. Its small size, low power consumption, and high accuracy make it an ideal choice for embedded systems and IoT applications.








The following table outlines the key technical specifications of the ICM20948:
| Parameter | Value |
|---|---|
| Gyroscope Range | ±250, ±500, ±1000, ±2000 dps |
| Accelerometer Range | ±2g, ±4g, ±8g, ±16g |
| Magnetometer Range | ±4900 µT |
| Gyroscope Sensitivity | 16.4 LSB/dps (at ±2000 dps) |
| Accelerometer Sensitivity | 16384 LSB/g (at ±2g) |
| Magnetometer Sensitivity | 0.15 µT/LSB |
| Operating Voltage | 1.71V to 3.6V |
| Communication Interface | I²C (up to 400 kHz) / SPI (up to 7 MHz) |
| Operating Temperature | -40°C to +85°C |
| Package Size | 3 mm × 3 mm × 1 mm |
The ICM20948 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 | VDDIO | I/O voltage supply |
| 3 | GND | Ground |
| 4 | SCL/SCLK | I²C clock / SPI clock |
| 5 | SDA/SDI | I²C data / SPI data input |
| 6 | SDO/ADO | SPI data output / I²C address select |
| 7 | INT1 | Interrupt 1 output |
| 8 | INT2 | Interrupt 2 output |
| 9-24 | NC | No connection |
Below is an example of how to interface the ICM20948 with an Arduino UNO using the I²C protocol:
#include <Wire.h>
// ICM20948 I2C address (default is 0x68 when ADO is low)
#define ICM20948_ADDR 0x68
// Register addresses
#define WHO_AM_I 0x00
#define PWR_MGMT_1 0x06
#define ACCEL_XOUT_H 0x2D
void setup() {
Wire.begin(); // Initialize I2C communication
Serial.begin(9600); // Initialize serial communication
// Wake up the ICM20948
Wire.beginTransmission(ICM20948_ADDR);
Wire.write(PWR_MGMT_1); // Power management register
Wire.write(0x01); // Set clock source
Wire.endTransmission();
// Verify communication by reading the WHO_AM_I register
Wire.beginTransmission(ICM20948_ADDR);
Wire.write(WHO_AM_I);
Wire.endTransmission();
Wire.requestFrom(ICM20948_ADDR, 1);
if (Wire.available()) {
byte whoAmI = Wire.read();
Serial.print("WHO_AM_I: 0x");
Serial.println(whoAmI, HEX);
} else {
Serial.println("Failed to communicate with ICM20948");
}
}
void loop() {
// Read accelerometer data
Wire.beginTransmission(ICM20948_ADDR);
Wire.write(ACCEL_XOUT_H); // Start with the high byte of X-axis
Wire.endTransmission();
Wire.requestFrom(ICM20948_ADDR, 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); // Delay for readability
}
No Response from the Sensor:
Incorrect or No Data:
Magnetometer Not Working:
Q: Can I use the ICM20948 with a 5V microcontroller?
A: Yes, but you must use a level shifter to convert the 5V logic to 3.3V for the ICM20948.
Q: How do I calibrate the sensor?
A: Calibration involves collecting raw data while rotating the sensor in all axes and applying algorithms to compute offsets and scale factors.
Q: What is the maximum sampling rate?
A: The ICM20948 supports a maximum output data rate of 1 kHz for the gyroscope and accelerometer.
By following this documentation, you can effectively integrate the ICM20948 into your projects and troubleshoot common issues.