智能车学习(十一)——陀螺仪学习

一、学习说明

感觉就是配置I2C通信,然后直接移植51代码。。。

二、代码分享:

1、头文件:

#ifndef I2C_GYRO_H_
#define I2C_GYRO_H_

/***********函数声明***********/

extern  void Gyro_Init(void);
extern  void Read_GY(void);

/*****************************/

/***********全局变量声明***********/

extern float Gyro_X ;
extern float Gyro_Y ;
extern float Gyro_Z ;

/*********************************/

#endif

2、源文件:

#include "include.h"
#include "common.h"
#include "gpio.h"
#include "I2C_GYRO.h"
#include "lptmr.h"

/***********管脚声明***********/

#define L3G_S_I2C_SDA       (PTE21)//(PTB3)//(PTE0) //(PTE22)//(PTC1)//
#define L3G_S_I2C_SCL       (PTE5)//(PTB2)//(PTE1)//(PTE20)//(PTC0)//

/*****************************/

//IO方向设置
#define L3G_I2C_SDA_IN()   DDRE21 = 0//输入模式
#define L3G_I2C_SDA_OUT()  DDRE21 = 1//输出模式

//IO操作函数
#define L3G_I2C_SCL        PTE5_OUT //SCL
#define L3G_I2C_SDA        PTE21_OUT //SDA
#define L3G_I2C_READ_SDA   PTE21_IN  //输入SDA 

/***********全局变量声明***********/
float Gyro_X = 0;
float Gyro_Y = 0;
float Gyro_Z = 0;
/********************************/

//**********L3G4200D内部寄存器地址*********
#define L3G_WHO_AM_I 0x0F
#define L3G_CTRL_REG1 0x20
#define L3G_CTRL_REG2 0x21
#define L3G_CTRL_REG3 0x22
#define L3G_CTRL_REG4 0x23
#define L3G_CTRL_REG5 0x24
#define L3G_REFERENCE 0x25
#define L3G_OUT_TEMP 0x26
#define L3G_STATUS_REG 0x27
#define L3G_OUT_X_L 0x28
#define L3G_OUT_X_H 0x29
#define L3G_OUT_Y_L 0x2A
#define L3G_OUT_Y_H 0x2B
#define L3G_OUT_Z_L 0x2C
#define L3G_OUT_Z_H 0x2D
#define L3G_FIFO_CTRL_REG 0x2E
#define L3G_FIFO_SRC_REG 0x2F
#define L3G_INT1_CFG 0x30
#define L3G_INT1_SRC 0x31
#define L3G_INT1_TSH_XH 0x32
#define L3G_INT1_TSH_XL 0x33
#define L3G_INT1_TSH_YH 0x34
#define L3G_INT1_TSH_YL 0x35
#define L3G_INT1_TSH_ZH 0x36
#define L3G_INT1_TSH_ZL 0x37
#define L3G_INT1_DURATION 0x38
//****************************************
#define    L3G_SlaveAddress   0xD2      //定义器件在IIC总线中的从地址,根据ALT  ADDRESS地址引脚不同修改
#define    L3G_SlaveAddfire   0x69      //定义器件在IIC总线中的从地址,根据ALT  ADDRESS地址引脚不同修改

//============================================================================
//函数名称:void L3G_I2C_Config(void)
//函数返回:无
//参数说明:无
//功能概要:配置I2C管脚
//============================================================================
void L3G_I2C_Config(void)
{
  //L3G_I2C_SDA_OUT();
  gpio_init(L3G_S_I2C_SDA,GPO,0);
  gpio_init(L3G_S_I2C_SCL,GPO,1);

  L3G_I2C_SCL=1;
  L3G_I2C_SDA=1;
}

//============================================================================
//函数名称:void L3G_I2C_Start(void)
//函数返回:无
//参数说明:无
//功能概要:I2C启动
//============================================================================
void L3G_I2C_Start(void)
{
  L3G_I2C_SDA_OUT();
  L3G_I2C_SDA=1;
  L3G_I2C_SCL=1;
  lptmr_delay_us(1);
  L3G_I2C_SDA=0;
  lptmr_delay_us(1);
  L3G_I2C_SCL=0;
}

//============================================================================
//函数名称:void L3G_I2C_Stop(void)
//函数返回:无
//参数说明:无
//功能概要:I2C停止
//============================================================================
void L3G_I2C_Stop(void)
{
  L3G_I2C_SDA_OUT();
  L3G_I2C_SDA=0;
  L3G_I2C_SCL=1;
  lptmr_delay_us(1);
  L3G_I2C_SDA=1;
  lptmr_delay_us(1);
  L3G_I2C_SCL=0;
}

//============================================================================
//函数名称:void L3G_I2C_Mack(void)
//函数返回:无
//参数说明:无
//功能概要:
//============================================================================
void L3G_I2C_Mack(void)
{
  L3G_I2C_SDA_OUT();
  L3G_I2C_SDA=0;
  L3G_I2C_SCL=1;
  lptmr_delay_us(1);
  L3G_I2C_SCL=0;
  L3G_I2C_SDA=1;
}

//============================================================================
//函数名称:void L3G_I2C_Mnack(void)
//函数返回:无
//参数说明:无
//功能概要:读取完的完成停顿信号
//============================================================================
void L3G_I2C_Mnack(void)
{
  L3G_I2C_SDA_OUT();
  L3G_I2C_SDA=1;
  lptmr_delay_us(1);
  L3G_I2C_SCL=1;
  lptmr_delay_us(1);
  L3G_I2C_SCL=0;
  lptmr_delay_us(1);
  //L3G_I2C_SDA=0;
}

//============================================================================
//函数名称:uint8_t L3G_I2C_Cack(void)
//函数返回:无
//参数说明:无
//功能概要:发送间隔函数
//============================================================================
uint8_t L3G_I2C_Cack(void)
{
  L3G_I2C_SDA_IN();
  L3G_I2C_SCL=0;
  lptmr_delay_us(1);
  L3G_I2C_SCL=1;
  lptmr_delay_us(1);
  if(L3G_I2C_READ_SDA)
  {
    //L3G_I2C_Stop();
    //return 0xff;
  }
  L3G_I2C_SCL=0;
  L3G_I2C_SDA_OUT();
  return 0;
}

//============================================================================
//函数名称:void L3G_I2C_WriteByte(unsigned char data)
//函数返回:无
//参数说明:无
//功能概要:I2C发送一个字节的数据
//============================================================================
void L3G_I2C_WriteByte(unsigned char data)
{
  unsigned char i=8;
  L3G_I2C_SDA_OUT();
  while(i--)
  {
    lptmr_delay_us(1);
    if(data & 0x80)
      L3G_I2C_SDA=1;
    else
      L3G_I2C_SDA=0;
    lptmr_delay_us(1);
    L3G_I2C_SCL=1;
    lptmr_delay_us(1);
    L3G_I2C_SCL=0;
    data<<=1;
  }
}

//============================================================================
//函数名称:uint8_t L3G_I2C_ReadByte(void)
//函数返回:无
//参数说明:无
//功能概要:I2C接收一个字节的数据
//============================================================================
uint8_t L3G_I2C_ReadByte(void)
{
  unsigned char i;
  unsigned char data=0;
  char temp;
  L3G_I2C_SDA_IN();
  for(i=0;i<8;i++)
  {
    data<<=1;
    lptmr_delay_us(1);
    L3G_I2C_SCL=1;
    temp=L3G_I2C_READ_SDA;
    if(temp)
      data++;
    lptmr_delay_us(1);
    L3G_I2C_SCL=0;
  }
  return data;
}

//============================================================================
//函数名称:uint8_t L3G_I2C_WR_REG(uint8_t dev_addr, uint8_t reg_addr, uint8_t writeData)
//函数返回:无
//参数说明:无
//功能概要:I2C向一个地址写一个数据
//============================================================================
uint8_t L3G_I2C_WR_REG(uint8_t dev_addr, uint8_t reg_addr, uint8_t writeData)
{
  L3G_I2C_Start();
  L3G_I2C_WriteByte(dev_addr);
  L3G_I2C_Cack();
  L3G_I2C_WriteByte(reg_addr);
  L3G_I2C_Cack();
  L3G_I2C_WriteByte(writeData);
  L3G_I2C_Cack();
  L3G_I2C_Stop();

  return 0;
}

//============================================================================
//函数名称:uint8_t L3G_I2C_RD_REG(uint8_t dev_addr, uint8_t reg_addr)
//函数返回:无
//参数说明:无
//功能概要:I2C从一个地址读一个数据
//============================================================================
uint8_t L3G_I2C_RD_REG(uint8_t dev_addr, uint8_t reg_addr)
{
  uint8_t read_reg = 0;
  L3G_I2C_Start();
  L3G_I2C_WriteByte(dev_addr);
  L3G_I2C_Cack();
  L3G_I2C_WriteByte(reg_addr);
  L3G_I2C_Cack();
  L3G_I2C_Start();
  L3G_I2C_WriteByte(dev_addr + 1);
  L3G_I2C_Cack();
  read_reg = L3G_I2C_ReadByte();
  L3G_I2C_Mnack();
  L3G_I2C_Stop();

  return read_reg;
}

//============================================================================
//函数名称:uint8_t L3G_I2C_RD_Buffer(uint8_t dev_addr, uint8_t reg_addr, uint8_t data_num, uint8_t *readBuffer)
//函数返回:无
//参数说明:无
//功能概要:I2C向一个地址写一连串数据
//============================================================================
uint8_t L3G_I2C_RD_Buffer(uint8_t dev_addr, uint8_t reg_addr, uint8_t data_num, uint8_t *readBuffer)
{
  uint8_t i = 0;
  L3G_I2C_Start();
  L3G_I2C_WriteByte(dev_addr);
  L3G_I2C_Cack();
  L3G_I2C_WriteByte(reg_addr);
  L3G_I2C_Cack();
  L3G_I2C_Start();
  L3G_I2C_WriteByte(dev_addr + 1);
  L3G_I2C_Cack();

  for(i = 0; i < data_num; i++){
    *(readBuffer+i) = L3G_I2C_ReadByte();
    if(i == data_num - 1)
      L3G_I2C_Mnack();
    else
      L3G_I2C_Mack();
  }
  L3G_I2C_Stop();

  return 0;
}

//============================================================================
//函数名称:void Gyro_Init( __RAMFUNC  void)
//函数返回:无
//参数说明:无
//功能概要://初始化为指定模式
//============================================================================
void Gyro_Init(void)
{
  L3G_I2C_Config();
  L3G_I2C_WR_REG(L3G_SlaveAddress,L3G_CTRL_REG1,0xcf);    //数据手册30  0xbf 400hz 20~110截止频率
  L3G_I2C_WR_REG(L3G_SlaveAddress,L3G_CTRL_REG2,0x20);//前两位00,后两位高通滤波器模式选择,后四位截止频率  0x29
  L3G_I2C_WR_REG(L3G_SlaveAddress,L3G_CTRL_REG3,0x00);
  L3G_I2C_WR_REG(L3G_SlaveAddress,L3G_CTRL_REG4,0x30);
  L3G_I2C_WR_REG(L3G_SlaveAddress,L3G_CTRL_REG5,0x00);
}

//============================================================================
//函数名称:void Read_GY(void)
//函数返回:无
//参数说明:无
//功能概要:陀螺仪传感器测量值读取接口
//============================================================================

uint8_t tmpBuffer[6] = {0};

void Read_GY(void)
{
  //int16_t x_h = 0,x_l = 0,y_l = 0,y_h = 0,z_h = 0,z_l = 0;//Gyro_X = 0,Gyro_Y = 0,Gyro_Z = 0;
  //Gyro_Init();
  L3G_I2C_RD_Buffer(L3G_SlaveAddress,0xA8,6,tmpBuffer);

  /*
  Gyro_X = ((short)((tmpBuffer[1]<<8)|tmpBuffer[0]))>>2;// 14位精度

  Gyro_Y = ((short)((tmpBuffer[3]<<8)|tmpBuffer[2]))>>2;// 14位精度

  Gyro_Z = ((short)((tmpBuffer[5]<<8)|tmpBuffer[4]))>>2;// 14位精度
  */

  int temp;

  temp = ((short)((tmpBuffer[1]<<8)|tmpBuffer[0]))>>4;//2;// 14位精度  1g数值为1024(原本为4096,但是右移了(无效位2位)(有效位14位)两位)
  Gyro_X = (double)Gyro_X*0.5+(double)temp*0.5;

  temp = ((short)((tmpBuffer[3]<<8)|tmpBuffer[2]))>>4;//2;// 14位精度
  Gyro_Y = (double)Gyro_Y*0.5+(double)temp*0.5;

  temp = ((short)((tmpBuffer[5]<<8)|tmpBuffer[4]))>>4;//2;// 14位精度
  Gyro_Z = (double)Gyro_Z*0.5+(double)temp*0.5;
}
时间: 2024-12-28 00:55:52

智能车学习(十一)——陀螺仪学习的相关文章

20145216史婧瑶《信息安全系统设计基础》第十一周学习总结

20145216史婧瑶<信息安全系统设计基础>第十一周学习总结 教材内容总结 第八章 异常控制流 平滑:指在存储器中指令都是相邻的. 突变:出现不相邻,通常由诸如跳转.调用.和返回等指令造成. 异常控制流ECF:即这些突变. 关于ECF: 1.ECF是操作系统用来实现I/O.进程和虚拟存器的基本机制 2.应用程序通过使用一个叫做陷阱或者系统调用的ECF形式,向操作系统请求服务 3.ECF是计算机系统中实现并发的基本机制 4.软件异常机制--C++和Java有try,catch,和throw,C

第十周、第十一周学习总结

第十周.第十一周学习总结 ——王林 学科 WEB 数据结构 计算机网络基础 进度 第15章的后半部分.第十六章 第六章后半部分 项目5 主要内容 第十周首先主要学习了JavaScript的内置对象.其次第十一周为详细学习JS的字符串对象.数值处理对象.数组对象等,JS的综合运用实例以及JS对象编程与事件处理. 两周内,进行了对钱一周树的学习——树的定义.基本术语.树的双亲.孩子.兄弟表示法及实现.二叉树等. 两周内,计算机网络基础主要学习了路由器的相关概述,包括了解路由协议到配置路由器的动手实践

第十一周学习总结

信息安全系统设计基础第十一周学习总结 [学习时间:8h] [学习内容:<深入理解计算机系统>第八章 ] 一.知识梳理 8.1节(主要涉及异常的入门级介绍) 1.异常控制流(ECF) 概念:最简单的“平滑序列”类型的控制流是指PC中相邻的指令在存储器中也相邻.而异常控制流则是指程序变量表示的内部程序状态中的变化.系统状态的变化等突发情况使得控制系统做出的反映. 作用: 应用程序如何与操作系统实现交互.应用程序使用系统调用(system call)的ECF形式向操作系统请求服务: 实现并发的基本机

Oracle学习(十一):PL/SQL

1.知识点:可以对照下面的录屏进行阅读 PL/SQL程序结构 declare 说明部分 (变量说明,光标申明,例外说明 ] begin 语句序列 (DML语句]- exception 例外处理语句 End; / ------------------------------------------------------------------ --第一个PL/SQL程序:HelloWorld set serveroutput on --如果要在屏幕上输出信息,需要将serveroutput开关打

20145321 《信息安全系统设计基础》第十一周学习总结

20145321 <信息安全系统设计基础>第十一周学习总结 代码实践 exec1.c 程序代码 #include <stdio.h> #include <unistd.h> int main() { char *arglist[3]; arglist[0] = "ls"; arglist[1] = "-l"; arglist[2] = 0 ;//NULL printf("* * * About to exec ls -l

全栈JavaScript之路(十一)学习 Attr 类型 节点

元素的特性在DOM 中用Attr 类型的节点表示.在所有浏览器中都可以访问 Attr 类型的构造函数与原型. 从技术上讲,Attr 类型节点 就是指,元素的 Attrbutes 属性 中的节点.构造器函数为; function Attr() { [native code] } 尽管 也是称之为节点,但是:Attr 类型的节点不是文档树的一部分! Attr 类型 节点 的特性: nodeType:2 nodeName: 值为特性的名称 nodeValue: 值为特性的值 prasentNode:n

springMVC3学习(十一)--文件上传CommonsMultipartFile

使用springMVC提供的CommonsMultipartFile类进行读取文件 需要用到上传文件的两个jar包 commons-logging.jar.commons-io-xxx.jar 1.在spring配置文件中配置文件上传解析器 <!-- 文件上传解析器 --> <bean id="multipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipar

20145311 《信息安全系统设计基础》第十一周学习总结

20145311 <信息安全系统设计基础>第十一周学习总结 教材学习内容总结 异常控制流 从一条指令到另外一条指令由诸如跳转.调用和返回真阳一些程序指令造成.异常控制流发生在计算机系统的各个层次,在硬件层.操作系统层.应用层都可能产生异常异常位于硬件和操作系统交界的部分异常是异常控制流的一种形式,一部分是由硬件实现的,一部分是由操作系统实现的在处理器中,状态变化称为事件处理器检测到事件时,会通过异常表进行间接过程调用,到一个专门设计用来处理这类事件的操作系统子程序.系统中为每种类型的异常都分配

第十一周学习进度

  第十一周学习进度 学习时间 10 博客量 2 代码量 300 学习到的知识点 软件测试的重要性与内容,安卓程序的编写 总结:通过这周的学习,我明白了软件测试的重要性,以前一直觉得软件测试是打酱油的事,并不重要.

【赚取智能手环】PHP开发学习门户有奖答题活动火热进行中!

为感谢大家一直以来对于PHP开发学习门户的关注和支持,特此举办一个有奖答题活动,凡参与活动的竞猜用户,按答题正确数目,提交答案时间进行排名,前30名活动排名用户将获得我们精心准备的礼物奖品,赶快参加吧! 活动时间:2014.11.23 10:00 至 2014.11.25 20:00 活动地址:http://bbs.phpthinking.com/thread-305-1-1.html 活动奖品: 第1名,智能手环+U型枕+耳机收纳盒 第2名,智能手环+耳机收纳盒 第3-5名,U型枕+耳机收纳盒