第5次培訓(xùn)IIC基礎(chǔ)_第1頁
第5次培訓(xùn)IIC基礎(chǔ)_第2頁
第5次培訓(xùn)IIC基礎(chǔ)_第3頁
第5次培訓(xùn)IIC基礎(chǔ)_第4頁
第5次培訓(xùn)IIC基礎(chǔ)_第5頁
已閱讀5頁,還剩30頁未讀 繼續(xù)免費閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)

文檔簡介

1、Arduino中IIC的使用 By 樵明朗本節(jié)主要內(nèi)容 IIC基礎(chǔ) Arduino中的IIC庫 E2PROME的讀寫 MPU6050的使用1 IIC基礎(chǔ) 什么是什么是IIC? IIC是是PHILIP公司推出的一種總線協(xié)議,公司推出的一種總線協(xié)議,II2C總線只有兩根雙向總線只有兩根雙向信號線。一根是數(shù)據(jù)線信號線。一根是數(shù)據(jù)線SDA,另一根是時鐘線,另一根是時鐘線SCL。SCL和和SDA在在總線空閑時均保持高電平,需接上拉電阻總線空閑時均保持高電平,需接上拉電阻1 IIC基礎(chǔ) 通信協(xié)議 每個接到每個接到I2C總線上的器件都有唯一的地址,通過地址識別通信對總線上的器件都有唯一的地址,通過地址識別通

2、信對象??偩€上一般有一個主機(jī)和多個從機(jī),通常為主從工作方式,象。總線上一般有一個主機(jī)和多個從機(jī),通常為主從工作方式,由主器件啟動數(shù)據(jù)的發(fā)送。由主器件啟動數(shù)據(jù)的發(fā)送。 主機(jī)發(fā)送的控制信號分為地址碼和數(shù)據(jù)碼兩部分,地址碼用來選主機(jī)發(fā)送的控制信號分為地址碼和數(shù)據(jù)碼兩部分,地址碼用來選址,數(shù)據(jù)碼用來通信址,數(shù)據(jù)碼用來通信1 IIC基礎(chǔ) 通信流程StartDevice AdressR/WA0A2 A1A4A5A3A6AckRegester Adressb0b1b3 b2b5b6b4b7AckDataC0C1C3 C2C5C6C4C7Ack End1 IIC基礎(chǔ) IIC通信格式 -起動信號 在SCL為高電

3、平期間,SDA出現(xiàn)下降沿則為啟動信號1 IIC基礎(chǔ) IIC通信格式 -尋址信號 器件地址有7位和10位兩種,對7位地址,高7位為地址位,最低位為方向位,方向位為0表明主機(jī)要進(jìn)行寫操作,方向位為1表示主機(jī)要進(jìn)行讀操作。1 IIC基礎(chǔ) IIC通信格式 -應(yīng)答信號 每傳輸一個字節(jié)數(shù)據(jù)后,都要有一個應(yīng)答信號,以確定數(shù)據(jù)是否被接收。在SCL信號為高電平期間,接收設(shè)備將SDA拉為低電平,產(chǎn)生應(yīng)答。1 IIC基礎(chǔ) IIC通信格式 -數(shù)據(jù)位 IIC總線進(jìn)行數(shù)據(jù)傳輸時,在SCL為高電平期間,SDA需保持穩(wěn)定,只有在SCL為低電平期,SDA才允許變化。1 IIC基礎(chǔ) IIC通信格式 -時序要求1 IIC基礎(chǔ) II

4、C通信格式 -終止信號 全部數(shù)據(jù)傳輸完成后,主機(jī)發(fā)送終止信號,在SCL為高電平期間,SDA上產(chǎn)生一個上升沿信號,表示終止傳輸。1 IIC基礎(chǔ) IIC通信格式 -工作流程 為了保證數(shù)據(jù)傳送的可靠性,標(biāo)準(zhǔn)的I2C總線的數(shù)據(jù)傳送有嚴(yán)格的時序要求1 IIC基礎(chǔ) 單片機(jī)模擬IIC總線通信-起始信號Void I2CStart(void)SDA = 1; Delay(); SCL = 1; Delay(); SDA = 0; Delay();2 Arduino中的IIC庫 EEPROM簡介 RAM(RamdomAccessMemory,讀寫存儲器) ROM(Read Only Memory,只讀存儲器) P

5、ROM(Programmable ROM,可編程ROM) EPROM(Erasable Programmable ROM,可擦除可編程ROM) EEPROM (Electrically Erasable Programmable Read-Only Memory),電可擦可編程只讀存儲器-一種掉電后數(shù)據(jù)不丟失的電可擦可編程只讀存儲器 Flash 屬于廣義的EEPROM,擦除時不再以字節(jié)為單位,而是以塊為單位,一次簡化了電路,數(shù)據(jù)密度更高,降低了成本2 Arduino中的IIC庫 EEPROME庫函數(shù)read() /Reads a byte from the EEPROMwrite() /Wri

6、te a byte to the EEPROMupdate() / value is written only if differs from the one already saved at the same address.get() /Read any data type or object from the EEPROMput() /Write any data type or object to the EEPROMEEPROM /using the identifier EEPROM like an array2 Arduino中的IIC庫 EEPROME庫函數(shù)的使用-按鍵計數(shù)2

7、Arduino中的IIC庫 EEPROME庫函數(shù)的使用-按鍵計數(shù)#include int address = 5;int value;/ 定義按鍵的針腳號為2的整型常量const int buttonPin = 2;/ 記錄當(dāng)前按鍵次數(shù)int buttonPushCounter = 0;/ 定義用來記錄按鍵次數(shù)的整型變量/按鍵之前的狀態(tài)int buttonState = 0;int lastButtonState = 0; void setup() Serial.begin(9600); / 設(shè)置按鍵的針腳為輸入狀態(tài) pinMode(buttonPin, INPUT); / 設(shè)置電路板上LED

8、神燈的針腳狀態(tài)為輸出狀態(tài) /pinMode(ledPin, OUTPUT);2 Arduino中的IIC庫 EEPROME庫函數(shù)的使用-按鍵計數(shù)void loop() buttonState = digitalRead(buttonPin);if (buttonState != lastButtonState) if(buttonState = HIGH) delay(20);/延時20ms if(buttonState = HIGH) buttonPushCounter+; EEPROM.write(address, buttonPushCounter);value = EEPROM.rea

9、d(address);Serial.print(value,DEC); / 串口輸出 Serial.print(n); lastButtonState = buttonState; value = EEPROM.read(address); Serial.println(value,DEC); / 串口輸出 2 Arduino中的IIC庫 庫函數(shù) Wire.begin() or Wire.begin(address) / Initiate the Wire library Wire.requestFrom() / request bytes from a slave device Wire.b

10、eginTransmission(address) / Begin a transmission Wire.endTransmission() /Ends a transmission to a slave device write() /Writes data read() /Reads a byte Wire.available() /Returns the number of bytes available for retrieval with read()2 Arduino中的IIC庫 使用例程1 #include voidsetup() Wire.begin(); / join i2

11、c bus (address optional for master)Serial.begin(9600);/ start serial for outputvoidloop() Wire.requestFrom(2,6); / request 6 bytes from slave device #2while(Wire.available() / slave may send less than requested charc=Wire.read(); / receive a byte as character Serial.print(c); / print the characterde

12、lay(500);2 Arduino中的IIC庫 MPU6050的使用-基礎(chǔ)知識2 Arduino中的IIC庫 MPU6050的使用-基礎(chǔ)知識 三軸加速度計三軸陀螺儀16 位的ADCIIC通訊2 Arduino中的IIC庫 MPU6050的使用-連接圖SDA =A4SCL=A52 Arduino中的IIC庫 MPU6050的使用-讀取數(shù)據(jù) #include const int MPU_addr=0 x68; / I2C address of the MPU-6050 int16_t AcX,AcY,AcZ,GyX,GyY,GyZ; void setup() Wire.begin(); Wire

13、.beginTransmission(MPU_addr); Wire.write(0 x6B); / PWR_MGMT_1 register Wire.write(0); / set to zero (wakes up the MPU-6050) Wire.endTransmission(true); Serial.begin(9600); 2 Arduino中的IIC庫 MPU6050的使用-讀取數(shù)據(jù) void loop() Wire.beginTransmission(MPU_addr); Wire.write(0 x3B); / starting with register 0 x3B

14、(ACCEL_XOUT_H) Wire.endTransmission(false); Wire.requestFrom(MPU_addr,14,true); / request a total of 14 registers AcX=Wire.read()8|Wire.read(); / 0 x3B (ACCEL_XOUT_H) & 0 x3C (ACCEL_XOUT_L) AcY=Wire.read()8|Wire.read(); / 0 x3D (ACCEL_YOUT_H) & 0 x3E (ACCEL_YOUT_L) AcZ=Wire.read()8|Wire.read(); / 0

15、x3F (ACCEL_ZOUT_H) & 0 x40 (ACCEL_ZOUT_L) /Tmp=Wire.read()8|Wire.read(); 0 x41 (TEMP_OUT_H) & 0 x42 (TEMP_OUT_L) GyX=Wire.read()8|Wire.read(); / 0 x43 (GYRO_XOUT_H) & 0 x44 (GYRO_XOUT_L) GyY=Wire.read()8|Wire.read(); / 0 x45 (GYRO_YOUT_H) & 0 x46 (GYRO_YOUT_L) GyZ=Wire.read()8|Wire.read(); / 0 x47 (

16、GYRO_ZOUT_H) & 0 x48 (GYRO_ZOUT_L)2 Arduino中的IIC庫 MPU6050的使用-讀取數(shù)據(jù) void loop() Wire.beginTransmission(MPU_addr); Wire.write(0 x3B); / starting with register 0 x3B (ACCEL_XOUT_H) Wire.endTransmission(false); Wire.requestFrom(MPU_addr,14,true); / request a total of 14 registers AcX=Wire.read()8|Wire.re

17、ad(); / 0 x3B (ACCEL_XOUT_H) & 0 x3C (ACCEL_XOUT_L) AcY=Wire.read()8|Wire.read(); / 0 x3D (ACCEL_YOUT_H) & 0 x3E (ACCEL_YOUT_L) AcZ=Wire.read()8|Wire.read(); / 0 x3F (ACCEL_ZOUT_H) & 0 x40 (ACCEL_ZOUT_L) Tmp=Wire.read()8|Wire.read(); / 0 x41 (TEMP_OUT_H) & 0 x42 (TEMP_OUT_L) GyX=Wire.read()8|Wire.re

18、ad(); / 0 x43 (GYRO_XOUT_H) & 0 x44 (GYRO_XOUT_L) GyY=Wire.read()8|Wire.read(); / 0 x45 (GYRO_YOUT_H) & 0 x46 (GYRO_YOUT_L) GyZ=Wire.read()8|Wire.read(); / 0 x47 (GYRO_ZOUT_H) & 0 x48 (GYRO_ZOUT_L)2 Arduino中的IIC庫 MPU6050的使用-讀取數(shù)據(jù) Serial.print(AcX = ); Serial.print(AcX); Serial.print( | AcY = ); Seria

19、l.print(AcY); Serial.print( | AcZ = ); Serial.print(AcZ); Serial.print( | Tmp = ); Serial.print(Tmp/340.00+36.53); /equation for temperature in degrees C from datasheet Serial.print( | GyX = ); Serial.print(GyX); Serial.print( | GyY = ); Serial.print(GyY); Serial.print( | GyZ = ); Serial.println(GyZ); delay(333); 2 Arduino中的IIC庫 MPU6050的使用-讀取數(shù)據(jù)2 Arduino中的IIC庫 MPU6050的使用-簡單的狀態(tài)解算加速度計的動態(tài)性不好陀螺儀得到的角度有積分誤差互補(bǔ)濾波(Gyroscope Angle) = (Last Measured Filtered Angle) + tFiltered Angle = (Gyroscope Angle) + (1 ) (Accelerometer Angle)2 Arduino中的IIC庫 MPU6050的使用-簡單的狀態(tài)解算 b=flo

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論