QMA6100P 姿态传感器使用

news2025/2/25 17:09:45

QMA6100P 姿态传感器使用

项目用途:分析和记录设备位置信息变化(设备安装在车辆内部)
通讯接口:I2C,地址0x13,标准I2C通讯采用IO模拟
功能需求:读取三轴加速度

芯片初始化设置

手册上电操作描述
参考手册说明和参考代码做如下初始化:

Acce_Write_Byte(QMA6100P_REG_RESET,0xB6);
DDL_DelayMS(5);
Acce_Write_Byte(QMA6100P_REG_RESET,0x00);
DDL_DelayMS(10);

Acce_Write_Byte(0x11,0x80);
Acce_Write_Byte(0x11,0x84);
Acce_Write_Byte(0x4a,0x20);
Acce_Write_Byte(0x56,0x01);
Acce_Write_Byte(0x5f,0x80);
DDL_DelayMS(2);
Acce_Write_Byte(0x5f,0x00);
DDL_DelayMS(10);

//设置满量程刻度
Acce_Write_Byte(QMA6100P_REG_RANGE, QMA6100P_RANGE_8G);

//带宽设置
Acce_Write_Byte(QMA6100P_REG_BW_ODR, QMA6100P_BW_100);

//设置时钟和模式
Acce_Write_Byte(QMA6100P_REG_POWER_MANAGE, QMA6100P_MCLK_6_4K|0x80);

//中断配置
Acce_Write_Byte(0x21,0x03);

获取设备ID

用于验证通讯是否正常

uint8_t AcceDrvReadID(void)
{
	return Acce_Read_Byte(0x00);
}

读取加速度

short AcceDrvReadX(void)
{
	short u16Temp;
	float X;
	
	u16Temp = Acce_Read_Byte(QMA6100P_REG_XOUTL) + \
		(Acce_Read_Byte(QMA6100P_REG_XOUTH)<<8);
	
	X = (u16Temp>>2)*QMA6100P_SENSITITY_8G/1000.0;
	
	return (short)X;
}

short AcceDrvReadY(void)
{
	short u16Temp;
	float X;
	
	u16Temp = Acce_Read_Byte(QMA6100P_REG_YOUTL) + \
		(Acce_Read_Byte(QMA6100P_REG_YOUTH)<<8);
	
	X = (u16Temp>>2)*QMA6100P_SENSITITY_8G/1000.0;
	
	return X;
}

short AcceDrvReadZ(void)
{
	short u16Temp;
	float X;
	
	u16Temp = Acce_Read_Byte(QMA6100P_REG_ZOUTL) + \
		(Acce_Read_Byte(QMA6100P_REG_ZOUTH)<<8);
	
	X = (u16Temp>>2)*QMA6100P_SENSITITY_8G/1000.0;
	
	return X;
}

I2C通讯接口

#define IIC_SCL_Pin 	GPIO_PIN_05
#define IIC_SCL_Port 	GPIO_PORT_C
#define IIC_SDA_Pin 	GPIO_PIN_04
#define IIC_SDA_Port 	GPIO_PORT_C	

#define SCL_H()   		GPIO_SetPins(IIC_SCL_Port, IIC_SCL_Pin)
#define SCL_L()   		GPIO_ResetPins(IIC_SCL_Port, IIC_SCL_Pin)
#define SDA_H()   		GPIO_SetPins(IIC_SDA_Port, IIC_SDA_Pin)
#define SDA_L()   		GPIO_ResetPins(IIC_SDA_Port, IIC_SDA_Pin)
#define READ_SDA 		GPIO_ReadInputPins(IIC_SDA_Port, IIC_SDA_Pin)


static void SDA_IN(void){}
static void SDA_OUT(void){}

static void delay_us(int X)
{
	DDL_DelayUS(X);
}

static void IIC_Start(void)
{
	SDA_OUT();    
	SDA_H();	  	  
	SCL_H();
	delay_us(4);
 	SDA_L();
	delay_us(4);
	SCL_L();
}

static void IIC_Stop(void)
{
	SDA_OUT();
	SCL_L();
	SDA_L();
 	delay_us(4);
	SCL_H(); 
	SDA_H();
	delay_us(4);
}

static uint8_t IIC_Wait_Ack(void)
{
	uint8_t ucErrTime=0;
	SDA_OUT();
	SDA_H();delay_us(1);	   
	SCL_H();delay_us(1);
	SDA_IN();   
	while(READ_SDA)
	{
		ucErrTime++;
		if(ucErrTime>250)
		{
			IIC_Stop();
			return 1;
		}
	}
	SCL_L();   
	return 0; 
}

static void IIC_Ack(void)
{
	SCL_L();
	SDA_OUT();
	SDA_L();
	delay_us(2);
	SCL_H();
	delay_us(2);
	SCL_L();
}

static void IIC_NAck(void)
{
	SCL_L();
	SDA_OUT();
	SDA_H();
	delay_us(2);
	SCL_H();
	delay_us(2);
	SCL_L();
}

static void IIC_Send_Byte(uint8_t Data)
{
	uint8_t t;  
	SDA_OUT(); 	    
    SCL_L();
    for(t=0;t<8;t++)
    {              
 		if((Data&0x80)>>7)
			SDA_H();
		else
			SDA_L();
		Data<<=1; 	  
		delay_us(2);  
		SCL_H();
		delay_us(2); 
		SCL_L();	
		delay_us(2);
    }
} 

static uint8_t IIC_Read_Byte(uint8_t ack)
{
	uint8_t i,receive=0;
	SDA_IN();
	for(i=0;i<8;i++ )
	{
		SCL_L(); 
		delay_us(2);
		SCL_H();
		receive<<=1;
		if(READ_SDA) 
			receive++;			
		delay_us(1); 
	}					 
	if (!ack)
		IIC_NAck();
	else
		IIC_Ack();		
	return receive;
}
void Acce_Write_Byte(uint8_t addr, uint8_t data)
{
	IIC_Start();
	IIC_Send_Byte(ACCE_WRITE_ID);
	IIC_Wait_Ack();
	IIC_Send_Byte(addr);
	IIC_Wait_Ack();
	IIC_Send_Byte(data);
	IIC_Wait_Ack();
	IIC_Stop();
	DDL_DelayMS(2);
}

uint8_t Acce_Read_Byte(uint8_t addr)
{
	uint8_t Read_Data;
	
	IIC_Start();
	IIC_Send_Byte(ACCE_WRITE_ID);
	IIC_Wait_Ack();
	IIC_Send_Byte(addr);
	IIC_Wait_Ack();

	IIC_Start();
	IIC_Send_Byte(ACCE_READ_ID);
	IIC_Wait_Ack();
	Read_Data = IIC_Read_Byte(0);
	IIC_Stop();
	
	return Read_Data;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1087818.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

STM32 芯片怎么选型?

SMT32概览&#xff1a; STM32F051R8T6x xx 代表的含义 STM32MPU产品型号含义 STM32芯片封装&#xff1a;

浮点数运算以及溢出问题

一、浮点数加减运算的步骤 对阶&#xff1a;小阶向大阶对齐&#xff0c;阶小的那个数尾数右移&#xff0c;对于IEEE754标准表示的浮点数来说&#xff0c;右移时要注意将隐含的一位1右移到小数部分尾数加减&#xff1a;注意要先还原隐藏位尾数规格化&#xff1a;直到将第一位1移…

外汇天眼:外汇投资出入金难?教你一个快速到账的方法!

对于每一位投资者来说&#xff0c;在外汇市场中盈利赚钱才是最重要的事&#xff01;而对盈利来说最重要的事就是能够顺利地出入金&#xff01; 但在复杂的外汇市场中&#xff0c;摒弃黑平台&#xff0c;在正规平台出入金很多时候也并没有那么顺利&#xff0c;所以很多外汇投资…

MySQL常用脚本

&#x1f389;&#x1f389;欢迎来到我的CSDN主页&#xff01;&#x1f389;&#x1f389; &#x1f3c5;我是Java方文山&#xff0c;一个在CSDN分享笔记的博主。&#x1f4da;&#x1f4da; &#x1f31f;推荐给大家我的专栏《ELement》。&#x1f3af;&#x1f3af; &#x1…

Godot2D角色导航-自动寻路教程(Godot实现角色随鼠标移动)

文章目录 运行结果2D导航概述开始前的准备2D导航创建导航网格创建角色 其他文章 运行结果 2D导航概述 Godot为2D和3D游戏提供了多个对象、类和服务器&#xff0c;以便于基于网格或基于网格的导航和路径查找。 说到导航&#xff0c;就得说一下导航网格&#xff0c;导航网格定义…

Design patterns--策略模式

设计模式之策略模式 笔者经常使用Modbus TCP和Modbus RTU通信协议&#xff0c;而两种的请求数据的格式不一样&#xff0c;故而采用策略模式来健壮整个工程项目。 代码示例 #ifndef MODBUS_H #define MODBUS_H #include <string>std::string convertToHex(unsigned char…

Spring framework Day09:JSR250注入注解

前言 JSR 250 是 Java Specification Request 的缩写&#xff0c;它定义了一组用于依赖注入和生命周期管理的注解。这些注解是在 Java EE 5 规范中引入的&#xff0c;用于简化和标准化开发企业级应用程序的依赖注入和生命周期管理。 一、开始学习 本次需要学习的依然是注解&…

淘宝商品品牌数据采集接口,淘宝商品详情数据接口,淘宝API接口

采集淘宝商品品牌数据&#xff0c;可以按照以下步骤进行&#xff1a; 确定采集目标&#xff1a;确定要采集的淘宝商品品牌和具体的产品类型。选择采集工具&#xff1a;可以选择爬虫、数据抓取工具等采集工具进行数据采集。设置采集参数&#xff1a;设置采集参数&#xff0c;包…

ROS中的图像数据

无论是USB摄像头还是RGBD摄像头&#xff0c;发布的图像数据格式多种多样&#xff0c;在处理这些数据之前&#xff0c;我们首先需要了解这些数据的格式。 二维图像数据 连接USB摄像头到PC端的USB接口&#xff0c;通过以下命令启动摄像头&#xff1a; roslaunch usb_cam usb_ca…

PHP 员工工资管理系统mysql数据库web结构apache计算机软件工程网页wamp

一、源码特点 PHP 员工工资管理系统是一套完善的web设计系统&#xff0c;对理解php编程开发语言有帮助&#xff0c;系统具有完整的源代码和数据库&#xff0c;系统主要采用B/S模式开发。 php员工工资管理系统 代码 https://download.csdn.net/download/qq_41221322/884215…

睿趣科技:未来抖音开网店还有前景吗

随着科技的快速发展&#xff0c;电商平台已经成为了人们生活中不可或缺的一部分。在中国&#xff0c;抖音作为一个短视频平台&#xff0c;近年来迅速崛起&#xff0c;吸引了大量的用户和商家。那么&#xff0c;在未来&#xff0c;抖音是否还能为商家提供一个有效的电商平台呢?…

【LeetCode】2319. 判断矩阵是否是一个X矩阵

难度&#xff1a;简单 题目 如果一个正方形矩阵满足下述 全部 条件&#xff0c;则称之为一个 X 矩阵 &#xff1a; 矩阵对角线上的所有元素都 不是 0矩阵中所有其他元素都是 0 给你一个大小为 n x n 的二维整数数组 grid &#xff0c;表示一个正方形矩阵。如果 grid 是一个…

小谈设计模式(28)—解释器模式

小谈设计模式&#xff08;28&#xff09;—解释器模式 专栏介绍专栏地址专栏介绍 解释器模式角色分析抽象表达式&#xff08;Abstract Expression&#xff09;终结符表达式&#xff08;Terminal Expression&#xff09;非终结符表达式&#xff08;Non-terminal Expression&…

opencv图像卷积操作和常用的图像滤波函数

文章目录 opencv图像卷积操作原理&#xff0c;opencv中常用的图像滤波函数一、图像卷积操作原理&#xff1a;1、卷积操作原理图&#xff1a; 二、opencv常用的图像滤波函数&#xff1a;这些函数的主要作用是对图像进行平滑处理或去除噪声(核心目的是减少图像中的噪声&#xff0…

PG14归档失败解决办法archiver failed on wal_lsn

问题描述 昨晚RepmgrPG14主备主库因wal日志撑爆磁盘&#xff0c;删除主库过期wal文件重做备库后上午进行主备状态巡查&#xff0c;主库向备库发送wal文件正常&#xff0c;但是查主库状态时发现显示有1条归档失败的记录。 postgres: archiver failed on 000000010000006F000000…

spring自动装配byType和@Autowired依赖注入源码分析(史上最详细的Spring源码分析系列一)

写在前面&#xff1a;阅读spring源码需要读者对Java反射和动态代理有一定了解。关于这部分内容&#xff0c;可以参考这篇博客&#xff1a;Spring源码分析准备工作及java知识补充 一、Spring依赖注入的方式 关于spring的依赖注入&#xff0c;可以参考官方文档&#xff1a;Spring…

分享一下公众号怎么添加在线挂号功能

公众号添加在线挂号功能 一、准备阶段 在开始之前&#xff0c;你需要了解公众号在线挂号的基本流程和需求。在线挂号需要实现以下功能&#xff1a;患者可以通过公众号预约挂号、填写个人信息、选择医生和时间等。在公众号上添加在线挂号功能&#xff0c;需要结合医疗资源、时…

android 与 flutter 之间的通信

文章目录 前言集成 flutter 混合开发android 与 flutter 之间的通信总结 一、前言 因为flutter 具有跨平台的属性&#xff0c;既可以在android上跑&#xff0c;也能在ios 上跑&#xff0c;所以为了节约开发的成本&#xff0c;减少人力&#xff0c;势必就会用到它。然而已有的…

跨语言深入探讨如何实现方法增强:Java Go的多策略实现

&#x1f337;&#x1f341; 博主猫头虎 带您 Go to New World.✨&#x1f341; &#x1f984; 博客首页——猫头虎的博客&#x1f390; &#x1f433;《面试题大全专栏》 文章图文并茂&#x1f995;生动形象&#x1f996;简单易学&#xff01;欢迎大家来踩踩~&#x1f33a; &a…

YB4014是可以对单节磷酸铁锂电池进行恒流/恒压充电管理的集成电路。

概述&#xff1a; YB4014是可以对单节磷酸铁锂电池进行恒流/恒 压充电管理的集成电路。该器件内部包括功率晶 体管&#xff0c;不需要外部的电流检测电阻和阻流二极管 YB4014只需要极少的外围元器件&#xff0c;非常适合于 便携式应用的领域。热调制电路可以在器件的功 耗比较大…