---
# System prepended metadata

title: 【embeded_linux】i2c邏輯分析儀波形圖分析
tags: [Embedded_linux]

---

:::warning
在 Linux Kernel 中，驅動程式碼的本質就是將對硬體寄存器的讀寫操作封裝成函式或介面，提供給上層應用程式或用戶空間的程式碼使用。
:::

# MPU-6050 內部框圖  

![MPU6050 Block Diagram](https://hackmd.io/_uploads/rJsJ0R09Je.png)  
[參考mpu6050 datasheet](chrome-extension://efaidnbmnnnibpcajpcglclefindmkaj/https://invensense.tdk.com/wp-content/uploads/2015/02/MPU-6000-Datasheet1.pdf)
## **感測器部分**  

### **1. 加速度計（Accelerometer）**  
- 由 **X、Y、Z** 三軸的加速度計組成，每個軸都有對應的 **自測試（Self Test）** 功能。  
- 加速度計的輸出經過 **類比數位轉換器（ADC）**，轉換為數位訊號，供後續處理使用。  

### **2. 陀螺儀（Gyroscope）**  
- 由 **X、Y、Z** 三軸的陀螺儀組成，每個軸同樣具備 **自測試（Self Test）** 功能。  
- 陀螺儀數據經過 **ADC 轉換**，提供角速度的數位輸出。  

### **3. 溫度感測器（Temp Sensor）**  
- 內建溫度感測器，透過 **ADC 轉換**，提供數位化溫度數據。  

 > [i2c驅動實驗](https://hackmd.io/@a0979552111/Sy-Ka98Vkl)中的驅動程式僅考慮加速度計與陀螺儀寄存器的數據，不涉及溫度感測器。



# [i2c驅動實驗](https://hackmd.io/@a0979552111/Sy-Ka98Vkl)使用的寄存器名稱和地址


| 寄存器地址 | 寄存器名稱     | 說明                         |
|------------|----------------|------------------------------|
| 0x68       | WHO_AM_I       | mpu6050裝置識別寄存器                |
| 0x6B       | PWR_MGMT_1     | 電源管理 1                    |
| 0x19       | SMPLRT_DIV     | 取樣率除頻設定                |
| 0x1A       | CONFIG         | 設定寄存器                    |
| 0x1C       | ACCEL_CONFIG   | 加速度計設定                  |
| 0x3B       | ACCEL_XOUT_H   | X 軸加速度高位元              |
| 0x3C       | ACCEL_XOUT_L   | X 軸加速度低位元              |
| 0x3D       | ACCEL_YOUT_H   | Y 軸加速度高位元              |
| 0x3E       | ACCEL_YOUT_L   | Y 軸加速度低位元              |
| 0x3F       | ACCEL_ZOUT_H   | Z 軸加速度高位元              |
| 0x40       | ACCEL_ZOUT_L   | Z 軸加速度低位元              |
| 0x43       | GYRO_XOUT_H    | X 軸陀螺儀高位元              |
| 0x44       | GYRO_XOUT_L    | X 軸陀螺儀低位元              |
| 0x45       | GYRO_YOUT_H    | Y 軸陀螺儀高位元              |
| 0x46       | GYRO_YOUT_L    | Y 軸陀螺儀低位元              |
| 0x47       | GYRO_ZOUT_H    | Z 軸陀螺儀高位元              |
| 0x48       | GYRO_ZOUT_L    | Z 軸陀螺儀低位元              |

參考連結[mpu6050Register-Map](chrome-extension://efaidnbmnnnibpcajpcglclefindmkaj/https://invensense.tdk.com/wp-content/uploads/2015/02/MPU-6000-Register-Map1.pdf)
# mpu6050驅動流程圖

```mermaid
graph TD
    A[啟動 MPU6050] --> B[初始化 MPU6050 寄存器]
    B --> C[設置 PWR_MGMT_1 寄存器]
    C --> D[設置 SMPLRT_DIV 設定取樣率]
    D --> E[設置 CONFIG 設定低通濾波器]
    E --> F[設置 ACCEL_CONFIG 設定加速度計量程]
    F --> G[設置 GYRO_CONFIG 設定陀螺儀量程]
    G --> H[初始化完成，開始讀取數據]
    
    H --> I[讀取加速度計數據 ACCEL_XOUT_H ~ ACCEL_ZOUT_L]
    I --> J[讀取陀螺儀數據 GYRO_XOUT_H ~ GYRO_ZOUT_L]
    J --> K[數據轉換與處理]
    K --> L[應用層使用數據]
```

# 信號詳解
> 只取第一個周期的訊號來觀測
[信號下載](https://drive.google.com/file/d/1URItZW0ZQbc9RHBEAiORFkxSKXXql_eC/view?usp=sharing)
## 1.初始化mpu6050

![image](https://hackmd.io/_uploads/SJxVFe1sJl.png)
PWR_MGMT_1寄存器 設置為0x00 作用是啟動內部 8MHz 振盪器

---
![image](https://hackmd.io/_uploads/HyVdKx1ikg.png)
![image](https://hackmd.io/_uploads/rJzJ9gJiye.png)

:::success
**CONFIG(0x1A)** 和 **SMPLRT_DIV(0x19)** 這兩個寄存器的配置是相關聯的，通常需要一起查看與調整。  

- **CONFIG 寄存器 (0x1A)**：主要用於設置低通濾波器的頻率和外部時鐘源等參數，會影響感測資料的取樣率。  
- **SMPLRT_DIV 寄存器 (0x19)**：設定感測器的取樣率分頻器，其最終取樣率是由內部時鐘頻率經過低通濾波設定，再經由此分頻器決定的。  

CONFIG 是用來調整感測器的濾波，決定「訊號要不要變平滑」。

SMPLRT_DIV 是用來設定感測器「每秒輸出幾筆資料」。

兩者一起控制 MPU6050 最終回報的資料品質與速度。

:::
### SMPLRT_DIV 寄存器內容說明
The Sample Rate is generated by dividing the gyroscope output rate by SMPLRT_DIV:  Sample Rate = Gyroscope Output Rate / (1 + SMPLRT_DIV) where Gyroscope Output Rate = 8kHz when the DLPF is disabled (DLPF_CFG = 0 or 7), and 1kHz when the DLPF is enabled (see Register 26). 
:::warning
因CONFIG寄存器 中的DLPF_CFG位置 被設置為6，Gyroscope Output Rate為8khz，SMPLRT_DIV被設置為7，8k/(1+7)=1k，採樣頻率被設置為1khz
:::
### CONFIG寄存器內容說明
![image](https://hackmd.io/_uploads/HybfWWJjJe.png)
![image](https://hackmd.io/_uploads/HJzXZWkoyg.png)
SMPLRT_DIV(0x19) 設置為0x07對應的採樣頻率為 1kHz。CONFIG(0x1A) 設置為 0x06，配置低通濾波器帶寬為 5Hz，並且加速度計的延遲為 19ms，陀螺儀的延遲為 18.6ms。

---
![image](https://hackmd.io/_uploads/rkq-cg1iJe.png)
ACCEL_CONFIG(0x1c) 設置為0x01  將量程範圍設置為正負4g



## 2.讀取數據
指定寄存器位址並讀取數值
![image](https://hackmd.io/_uploads/H1izdb1sJe.png)
(0x3B) X 軸加速度高位元  (0xF7) 讀取到的資料
![image](https://hackmd.io/_uploads/BknZd-1j1g.png)
(0x3C) X 軸加速度低位元  (0x88) 讀取到的資料

![image](https://hackmd.io/_uploads/BksPubkjye.png)
(0x3D) Y 軸加速度高位元  (0x05) 讀取到的資料
![image](https://hackmd.io/_uploads/Hy7ROZysJg.png)
(0x3E) Y 軸加速度低位元  (0x1A) 讀取到的資料

![image](https://hackmd.io/_uploads/B1ayFbkj1e.png)
(0x3F) Z 軸加速度高位元  (0x40) 讀取到的資料
![image](https://hackmd.io/_uploads/H1uSFWyoyl.png)
(0x40) Z 軸加速度低位元  (0xAE) 讀取到的資料


![image](https://hackmd.io/_uploads/S1enmq-1o1x.png)
(0x43) X 軸陀螺儀高位元  (0xFE) 讀取到的資料
![image](https://hackmd.io/_uploads/BJercWks1l.png)
(0x44) X 軸陀螺儀低位元  (0x0F) 讀取到的資料

![image](https://hackmd.io/_uploads/B1MT5-yjkg.png)
(0x45) Y 軸陀螺儀高位元  (0xFF) 讀取到的資料
![image](https://hackmd.io/_uploads/H1bR5Wyj1g.png)
(0x46) Y 軸陀螺儀低位元  (0xC2) 讀取到的資料
![image](https://hackmd.io/_uploads/H1zkjWyiJg.png)

![image](https://hackmd.io/_uploads/BJols-koyx.png)
(0x47) Z 軸陀螺儀高位元  (0xFF) 讀取到的資料
![image](https://hackmd.io/_uploads/SJyGi-JjJx.png)
(0x48) Z 軸陀螺儀低位元  (0x9E) 讀取到的資料

