第5次培训IIC基础_第1页
第5次培训IIC基础_第2页
第5次培训IIC基础_第3页
第5次培训IIC基础_第4页
第5次培训IIC基础_第5页
已阅读5页,还剩30页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、Arduino中IIC的使用 By 樵明朗本节主要内容 IIC基础 Arduino中的IIC库 E2PROME的读写 MPU6050的使用1 IIC基础 什么是什么是IIC? IIC是是PHILIP公司推出的一种总线协议,公司推出的一种总线协议,II2C总线只有两根双向总线只有两根双向信号线。一根是数据线信号线。一根是数据线SDA,另一根是时钟线,另一根是时钟线SCL。SCL和和SDA在在总线空闲时均保持高电平,需接上拉电阻总线空闲时均保持高电平,需接上拉电阻1 IIC基础 通信协议 每个接到每个接到I2C总线上的器件都有唯一的地址,通过地址识别通信对总线上的器件都有唯一的地址,通过地址识别通

2、信对象。总线上一般有一个主机和多个从机,通常为主从工作方式,象。总线上一般有一个主机和多个从机,通常为主从工作方式,由主器件启动数据的发送。由主器件启动数据的发送。 主机发送的控制信号分为地址码和数据码两部分,地址码用来选主机发送的控制信号分为地址码和数据码两部分,地址码用来选址,数据码用来通信址,数据码用来通信1 IIC基础 通信流程StartDevice AdressR/WA0A2 A1A4A5A3A6AckRegester Adressb0b1b3 b2b5b6b4b7AckDataC0C1C3 C2C5C6C4C7Ack End1 IIC基础 IIC通信格式 -起动信号 在SCL为高电

3、平期间,SDA出现下降沿则为启动信号1 IIC基础 IIC通信格式 -寻址信号 器件地址有7位和10位两种,对7位地址,高7位为地址位,最低位为方向位,方向位为0表明主机要进行写操作,方向位为1表示主机要进行读操作。1 IIC基础 IIC通信格式 -应答信号 每传输一个字节数据后,都要有一个应答信号,以确定数据是否被接收。在SCL信号为高电平期间,接收设备将SDA拉为低电平,产生应答。1 IIC基础 IIC通信格式 -数据位 IIC总线进行数据传输时,在SCL为高电平期间,SDA需保持稳定,只有在SCL为低电平期,SDA才允许变化。1 IIC基础 IIC通信格式 -时序要求1 IIC基础 II

4、C通信格式 -终止信号 全部数据传输完成后,主机发送终止信号,在SCL为高电平期间,SDA上产生一个上升沿信号,表示终止传输。1 IIC基础 IIC通信格式 -工作流程 为了保证数据传送的可靠性,标准的I2C总线的数据传送有严格的时序要求1 IIC基础 单片机模拟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),电可擦可编程只读存储器-一种掉电后数据不丢失的电可擦可编程只读存储器 Flash 属于广义的EEPROM,擦除时不再以字节为单位,而是以块为单位,一次简化了电路,数据密度更高,降低了成本2 Arduino中的IIC库 EEPROME库函数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库函数的使用-按键计数2

7、Arduino中的IIC库 EEPROME库函数的使用-按键计数#include int address = 5;int value;/ 定义按键的针脚号为2的整型常量const int buttonPin = 2;/ 记录当前按键次数int buttonPushCounter = 0;/ 定义用来记录按键次数的整型变量/按键之前的状态int buttonState = 0;int lastButtonState = 0; void setup() Serial.begin(9600); / 设置按键的针脚为输入状态 pinMode(buttonPin, INPUT); / 设置电路板上LED

8、神灯的针脚状态为输出状态 /pinMode(ledPin, OUTPUT);2 Arduino中的IIC库 EEPROME库函数的使用-按键计数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库 库函数 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的使用-基础知识2 Arduino中的IIC库 MPU6050的使用-基础知识 三轴加速度计三轴陀螺仪16 位的ADCIIC通讯2 Arduino中的IIC库 MPU6050的使用-连接图SDA =A4SCL=A52 Arduino中的IIC库 MPU6050的使用-读取数据 #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的使用-读取数据 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的使用-读取数据 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的使用-读取数据 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的使用-读取数据2 Arduino中的IIC库 MPU6050的使用-简单的状态解算加速度计的动态性不好陀螺仪得到的角度有积分误差互补滤波(Gyroscope Angle) = (Last Measured Filtered Angle) + tFiltered Angle = (Gyroscope Angle) + (1 ) (Accelerometer Angle)2 Arduino中的IIC库 MPU6050的使用-简单的状态解算 b=flo

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

最新文档

评论

0/150

提交评论