智能车学习(十)——MMA8451加速度计的使用
一、驱动说明:
就是使用I2C的通信方式驱动这款加速度计就行了,代码的话选择使用51单片机的代码进行移植。
二、代码分享:
1、头文件:
#ifndef MMA8451_H
#define MMA8451_H /***********函数声明***********/ void MMA8451_Init(void);
void Read_Gray(void); /*****************************/ /***********全局变量声明***********/
extern int delay_time; extern double Gray_X ;
extern double Gray_Y ;
extern double Gray_Z ; /*****************************/ #endif
2、源文件:
#include "include.h"
#include "common.h"
#include "i2c.h"
#include "MMA8451.h"
#include "port.h"
#include "gpio.h"
#include "lptmr.h" double Gray_X ;
double Gray_Y ;
double Gray_Z ; //管脚定义
#define MMA_S_I2C_SDA (PTA16)//(PTB3)//(PTE0) //(PTE22)//(PTC1)//
#define MMA_S_I2C_SCL (PTA14)//(PTB2)//(PTE1)//(PTE20)//(PTC0)// //IO方向设置
#define MMA_I2C_SDA_IN() DDRA16 = 0//输入模式
#define MMA_I2C_SDA_OUT() DDRA16 = 1//输出模式 //IO操作函数
#define MMA_I2C_SCL PTA14_OUT //SCL
#define MMA_I2C_SDA PTA16_OUT //SDA
#define MMA_I2C_READ_SDA PTA16_IN //输入SDA //**********MMA8451内部寄存器地址*********
#define WHO_AM_I 0x0D
#define CTRL_REG1 0x2A
#define CTRL_REG2 0x2B
#define CTRL_REG3 0x2C
#define CTRL_REG4 0x2D
#define CTRL_REG5 0x2E
//#define REFERENCE 0x25
//#define OUT_TEMP 0x26
#define STATUS_REG 0x00
#define OUT_X_H 0x01
#define OUT_X_L 0x02
#define OUT_Y_H 0x03
#define OUT_Y_L 0x04
#define OUT_Z_H 0x05
#define OUT_Z_L 0x06
#define XYZ_DATA_CFG 0x0E #define SlaveAddress 0x38 //定义器件在I2C总线中的从地址,根据ALT ADDRESS地址引脚不同修改
#define SlaveAddfire 0x69 //定义器件在I2C总线中的从地址,根据ALT ADDRESS地址引脚不同修改 //============================================================================
//函数名称:void MMA_I2C_Config(__RAMFUNC void)
//函数返回:无
//参数说明:无
//功能概要:初始化I2C
//============================================================================
void MMA_I2C_Config(void)
{
//MMA_I2C_SDA_OUT();
gpio_init(MMA_S_I2C_SDA,GPO,1);
gpio_init(MMA_S_I2C_SCL,GPO,1); MMA_I2C_SCL=1;
MMA_I2C_SDA=1;
} //============================================================================
//函数名称:void MMA_I2C_Start(__RAMFUNC void)
//函数返回:无
//参数说明:无
//功能概要:I2C通信开始
//============================================================================
void MMA_I2C_Start(void)
{
MMA_I2C_SDA_OUT(); MMA_I2C_SDA = 1;
MMA_I2C_SCL = 1;
lptmr_delay_us(1); MMA_I2C_SDA = 0;
lptmr_delay_us(1);
MMA_I2C_SCL = 0;
} //============================================================================
//函数名称:void MMA_I2C_Stop(void)
//函数返回:无
//参数说明:无
//功能概要:I2C通信结束
//============================================================================
void MMA_I2C_Stop(void)
{
MMA_I2C_SDA_OUT();
MMA_I2C_SDA = 0;
MMA_I2C_SCL = 1; lptmr_delay_us(1);
MMA_I2C_SDA = 1;
lptmr_delay_us(1);
MMA_I2C_SCL = 0;
} void MMA_I2C_Mack(void)
{
MMA_I2C_SDA_OUT(); MMA_I2C_SDA=0;
MMA_I2C_SCL=1; lptmr_delay_us(1); MMA_I2C_SCL=0;
MMA_I2C_SDA=1;
} void MMA_I2C_Mnack(void)
{
MMA_I2C_SDA_OUT();
MMA_I2C_SDA=1;
lptmr_delay_us(1);
MMA_I2C_SCL=1;
lptmr_delay_us(1);
MMA_I2C_SCL=0;
lptmr_delay_us(1);
//MMA_I2C_SDA=0;
} uint8_t MMA_I2C_Cack(void)
{
MMA_I2C_SDA_IN();;
MMA_I2C_SCL=0;
lptmr_delay_us(1);
MMA_I2C_SCL=1;
lptmr_delay_us(1); if(MMA_I2C_READ_SDA)
{
//MMA_I2C_Stop();
//return 0xff;
} MMA_I2C_SCL=0;
MMA_I2C_SDA_OUT();
return 0;
} void MMA_I2C_WriteByte(unsigned char data)
{
unsigned char i=8;
MMA_I2C_SDA_OUT(); while(i--)
{
lptmr_delay_us(1);
if(data & 0x80)
MMA_I2C_SDA=1;
else
MMA_I2C_SDA=0; lptmr_delay_us(1);
MMA_I2C_SCL=1;
lptmr_delay_us(1);
MMA_I2C_SCL=0;
data<<=1;
}
} uint8_t MMA_I2C_ReadByte(void)
{
unsigned char i;
unsigned char data=0;
char temp; MMA_I2C_SDA_IN(); for(i=0;i<8;i++)
{
data<<=1;
lptmr_delay_us(1);
MMA_I2C_SCL = 1;
temp = MMA_I2C_READ_SDA;
if(temp)
data++;
lptmr_delay_us(1);
MMA_I2C_SCL = 0;
}
return data;
} uint8_t MMA_I2C_WR_REG(uint8_t dev_addr, uint8_t reg_addr, uint8_t writeData)
{
MMA_I2C_Start();
MMA_I2C_WriteByte(dev_addr);
MMA_I2C_Cack();
MMA_I2C_WriteByte(reg_addr);
MMA_I2C_Cack();
MMA_I2C_WriteByte(writeData); MMA_I2C_Cack();
MMA_I2C_Stop(); return 0;
} uint8_t MMA_I2C_RD_REG(uint8_t dev_addr, uint8_t reg_addr)
{
uint8_t read_reg = 0;
MMA_I2C_Start();
MMA_I2C_WriteByte(dev_addr);
MMA_I2C_Cack();
MMA_I2C_WriteByte(reg_addr);
MMA_I2C_Cack();
MMA_I2C_Start();
MMA_I2C_WriteByte(dev_addr + 1);
MMA_I2C_Cack();
read_reg=MMA_I2C_ReadByte();
MMA_I2C_Mnack();
MMA_I2C_Stop(); return read_reg;
} uint8_t MMA_I2C_RD_Buffer(uint8_t dev_addr, uint8_t reg_addr, uint8_t data_num, uint8_t *readBuffer)
{
uint8_t i = 0;
MMA_I2C_Start();
MMA_I2C_WriteByte(dev_addr);
MMA_I2C_Cack();
MMA_I2C_WriteByte(reg_addr);
MMA_I2C_Cack();
MMA_I2C_Start();
MMA_I2C_WriteByte(dev_addr + 1);
MMA_I2C_Cack(); for(i = 0; i < data_num; i++){
*(readBuffer+i) = MMA_I2C_ReadByte();
if(i == data_num - 1)
MMA_I2C_Mnack();
else
MMA_I2C_Mack();
}
MMA_I2C_Stop(); return 0;
} /*----------------*加速度传感器初始化*----------------*/
void MMA8451_Init(void)//初始化为指定模式
{
MMA_I2C_Config();
MMA_I2C_WR_REG(SlaveAddress,CTRL_REG1,0x05); //数据手册30 0xbf 400hz 20~110截止频率
MMA_I2C_WR_REG(SlaveAddress,CTRL_REG2,0x02); //前两位00,后两位高通滤波器模式选择,后四位截止频率 0x29
MMA_I2C_WR_REG(SlaveAddress,XYZ_DATA_CFG,0x10);
} /*-------------*加速度传感器测量值读取接口*------------*/
uint8_t MMA_tmpBuffer[6] = {0}; void Read_Gray(void)
{
MMA_I2C_RD_Buffer(SlaveAddress,0x81,6,MMA_tmpBuffer); int temp; temp = ((short)((MMA_tmpBuffer[0]<<8)|MMA_tmpBuffer[1]))>>4;//2;// 14位精度 1g数值为1024(原本为4096,但是右移了(无效位2位)(有效位14位)两位)
Gray_X = (double)Gray_X*0.5+(double)temp*0.5; temp = ((short)((MMA_tmpBuffer[2]<<8)|MMA_tmpBuffer[3]))>>4;//2;// 14位精度
Gray_Y = (double)Gray_Y*0.5+(double)temp*0.5; temp = ((short)((MMA_tmpBuffer[4]<<8)|MMA_tmpBuffer[5]))>>4;//2;// 14位精度
Gray_Z = (double)Gray_Z*0.5+(double)temp*0.5;
} /*--------------------------------------------------------------------------------------
1.如何确定加速度计或者陀螺仪的IIC通信控制字,理解握手原理,掌握寻址的方法
2.软件调试,结合管脚图
3.数据通信速度匹配问题---如何确定延时的大小
----------------------------------------------------------------------------------------*/
三、使用方法:
#include "include.h"
#include "OLED.h"
#include "init.h"
#include "KeySquare.h"
#include "lptmr.h"
#include "Menu.h"
#include "flash.h"
#include "MMA8451.h" void main()
{
DISABLE_INTERRUPTS; //MPU上电,各模块功能初始化前需要关中断
system_init(); //各模块功能初始化
ENABLE_INTERRUPTS; //开中断使能 //加速度计初始化
MMA8451_Init(); //初始化
OLED_Init();
flash_init(); //屏幕刷屏
OLED_Clear(); while(1)
{
Read_Gray();
OLED_Clear();
OLED_Write_Float(0,0,Gray_X);
OLED_Write_Float(2,0,Gray_Y);
OLED_Write_Float(4,0,Gray_Z);
lptmr_delay_ms(100); //Menu_Key_Detect();
}
}
智能车学习(十)——MMA8451加速度计的使用的更多相关文章
- 智能车学习(十五)——K60野火2013版例程
一.中断函数注册方法: 1.格式: 配置某个功能的中断 注册中断函数 开启中断 2.一个例子 pit_init_ms(PIT0,);//定时中断初始化 set_vector_handler(PIT0_ ...
- 智能车学习(十六)——CCD学习
一.使用硬件 1.兰宙CCD四代 优点:可以调节运放来改变放大倍数 缺点:使用软排线(容易坏),CCD容易起灰,需要多次调节 2.野火K60底层 二.CCD硬件电路 ( ...
- 智能车学习(二十二)——浅谈速度控制
一.经典PID控制 使用遇限反向PID会比较适合有加减速的车子,使用变速积分适合跑匀速的车子.然后这种方法的条件下,一定要尽可能缩短控制周期.. 二.PID加棒棒控制 针对 ...
- 智能车学习(二十)——浅谈C车硬连接与软连接
一.为何要追求软连接? 车子进行软连接之后,可以达到一种效果,就是在高速过程中,车子如果快要发生侧翻的时候,只会跳一个后轮,且只是轻微,而前轮如果进行的内倾,就可以让前轮最大面积接触,增大 ...
- 智能车学习(十八)——电机学习
一.C车电机选择 1.摘要: 因为C车模在四轮车的优势是有两个电机,可以进行主动差速,劣势是电机太弱了....所以如何选择电机,就是个钱的问题了,电机多一点,就比较好选,但是C车电机跑多了就 ...
- 智能车学习(十四)——K60单片机GPIO学习
一.头文件: #ifndef __MK60_GPIO_H__ #define __MK60_GPIO_H__ #include "MK60_gpio_cfg.h" /* * 定义管 ...
- 智能车学习(十二)——智能车原理
一.直立行走任务分解 1.任务分解 (1) 控制车模平衡:通过控制两个电机正反向运动保持车模直立平衡状态 (2) 控制车模速度:通过调节车模的倾角来实现车模速度控制,实际上最后还是演变成通过控制电机的 ...
- 智能车学习(二十三)——浅谈心得体会
因为毕竟是竞赛,跟学校挂钩,没办法开源代码和算法完成思路,所以不能详细写太多,如果可以等价交换的话,应该还是可以向领导申请一下的. 在厦大信科通信系,参加这个比赛,大家都觉得性 ...
- 智能车学习(六)——OLED屏幕使用
一.代码展示 1.头文件: #ifndef OLED_H_ #define OLED_H_ extern unsigned char Draw[]; extern const unsigned cha ...
随机推荐
- ios nsdataformatter奇怪的问题
用nsdataformatter在中文格式下测试, a 标识的是上午,下午,不是AM,pm. 我在24小时格式的机器上测试,存入了一个 时间,却解析不出来了! static NSString *Hom ...
- 推荐一篇 OAuth 2.0 必读文章
http://www.cnblogs.com/artech/p/oauth-03.html 共计有3篇相关内容,请仔细阅读! 再说一下我用box api 开发时的问题,在 box 程序登记页面: 对于 ...
- ios 使用xib时,在UIScrollView中添建内容view时,使用约束的注意
请参与一下链接:http://segmentfault.com/a/1190000002462033 简单的说下,就是必须写满一个view的6个约束,就是上下左右高宽,让scrollview 能够根据 ...
- ACM/ICPC 之 最短路-Floyd+SPFA(BFS)+DP(ZOJ1232)
这是一道非常好的题目,融合了很多知识点. ZOJ1232-Adventrue of Super Mario 这一题折磨我挺长时间的,不过最后做出来非常开心啊,哇咔咔咔 题意就不累述了,注释有写,难点在 ...
- HDU 4942 Game on S♂play(线段树、模拟、扩栈)
比赛的时候想到这题的大概做法,但由于卡别的水题...就赛后做了... 题意:给一个二叉树,每个结点有一个w[i],有3种操作,0 x表示左旋x,1 x表示右旋x,3 x表示询问x结点的价值,其中,价值 ...
- 【linux】gcc命令
来源:http://man.linuxde.net/gcc 语法 gcc(选项)(参数) 选项 -o:指定生成的输出文件: -E:仅执行编译预处理: -S:将C代码转换为汇编代码: -wall:显示警 ...
- 20145213祁玮のJava课程总结
20145213のJava学习总结 每周学习笔记 1.第一周读书笔记 2.第二周读书笔记 3.第三周读书笔记 4.第四周读书笔记 5.第五周读书笔记 6.第六周读书笔记 7.第七周读书笔记 8.第八周 ...
- 【Excel 4.0 函数】REGISTER 的两种形式以及VBA等效语句
形式1 REGISTER("SAMPLE.DLL", "MyFunction", "AIC") 形式1等效 VBA语句 Declare Fu ...
- php数据访问基础
建一个连接(造一个连接对象) $db = new MySqli("IP地址或者域名,若果是本地则用localhost","用户名","数据库密码&qu ...
- 解决sqlite3_key的问题
报错内容显示如下: ld: warning: ignoring file /Users/rowling/Library/Developer/Xcode/DerivedData/zhinengbango ...