SC7A20 三轴加速度传感器 驱动

这篇具有很好参考价值的文章主要介绍了SC7A20 三轴加速度传感器 驱动。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

使用的时候需要找对文档,之前文档不对,导致读取的数据计算角度一直不成功,发现要关闭高通滤波,由于高通滤波寄存器里面的滤波阈值没有文档说明,我直接关闭掉就可以使用了,代码与硬件平台无关,需要底层IIC接口支持,软件IIC或HC32的硬件IIC可以查阅我其他博客;

连续读取的时候,需要将寄存器地址最高位置1;

/*************************************************************************************************************
 * 文件名:			SC7A20.c
 * 功能:			SC7A20 三轴加速度传感器支持
 * 作者:			cp1300@139.com
 * 创建时间:		2022-07-01
 * 最后修改时间:	2022-07-01
 * 详细:			https://www.doc88.com/p-80659792307153.html?r=1
 *					如果想一次读写多个寄存器,需要将寄存器地址最高位置1,也就是寄存器地址|0x80
*************************************************************************************************************/
#include "system.h"
#include "SC7A20.h"
#include "math.h"
#include <stdio.h>

#define SC7A20_REG_WHO_AM_I     0x0F
#define SC7A20_REG_CTRL_1		0x20
#define SC7A20_REG_CTRL_2		0x21
#define SC7A20_REG_CTRL_3		0x22
#define SC7A20_REG_CTRL_4		0x23
#define SC7A20_REG_X_L          0x28
#define SC7A20_REG_X_H          0x29
#define SC7A20_REG_Y_L          0x2A
#define SC7A20_REG_Y_H          0x2B
#define SC7A20_REG_Z_L          0x2C
#define SC7A20_REG_Z_H          0x2D
#define SC7A20_REG_STATUS		0x27



/*************************************************************************************************************************
*函数        	:	bool SC7A20_Init(SC7A20_HANDLE *pHandle, u8 SlaveAddr, 
						bool (*IIC_ReadReg)(u8 SlaveAddr, u8 RegAddr, u8 *pDataBuff, u16 ByteNum), 
						bool (*IIC_WriteReg)(u16 SlaveAddr, u8 RegAddr, u8 *pDataBuff, u16 ByteNum))
*功能        	:	SC7A20初始化
*参数        	:	pHandle:句柄;SlaveAddr:芯片IIC写地址;IIC_ReadReg:IIC读取接口;IIC_WriteReg:IIC写入接口;
*返回        	:	TRUE:初始化成功;FALSE:初始化失败
*依赖			: 	底层宏定义
*作者       		:	cp1300@139.com
*时间     		:	2022-07-01
*最后修改时间		:	2022-07-01
*说明        	:	
*************************************************************************************************************************/
bool SC7A20_Init(SC7A20_HANDLE *pHandle, u8 SlaveAddr, 
	bool (*IIC_ReadReg)(u8 SlaveAddr, u8 RegAddr, u8 *pDataBuff, u16 ByteNum), 
	bool (*IIC_WriteReg)(u16 SlaveAddr, u8 RegAddr, u8 *pDataBuff, u16 ByteNum))
{
	u16 i,j;
	u8 tempreg;
	u8 buff[16];
	
	if(pHandle == NULL) 
	{
		ERROR_S("无效的句柄\r\n");
		SYS_DelayMS(5000);
		return FALSE;
	}
	pHandle->SlaveAddr = SlaveAddr;										//记录地址
	pHandle->IIC_ReadReg = IIC_ReadReg;									//IIC接口
	pHandle->IIC_WriteReg = IIC_WriteReg;								//IIC接口
	
	tempreg = 0;

	Delay_MS(50);

	for (i = 0; i < 10; i++)
	{
		buff[0] = buff[1] = 0;
		if (pHandle->IIC_ReadReg(pHandle->SlaveAddr, SC7A20_REG_WHO_AM_I, buff, 1) == FALSE)
		{
			INFO_S("Sensor通讯失败\r\n");
		}
		else if(buff[0] == 0x11)
		{



			break;
		}
		else
		{
			INFO_S("无效的id0x%02X\r\n", buff[0]);
		}

		SYS_DelayMS(100);
	}


	tempreg = 0x47;
	pHandle->IIC_WriteReg(pHandle->SlaveAddr, SC7A20_REG_CTRL_1, &tempreg, 1);//50Hz+正常模式xyz使能
	tempreg = 0x00;
	pHandle->IIC_WriteReg(pHandle->SlaveAddr, SC7A20_REG_CTRL_2, &tempreg, 1);//关闭滤波器,手册上面没有滤波器截止频率设置说明,开启后无法测量静止状态下的重力加速度
	tempreg = 0x00;
	pHandle->IIC_WriteReg(pHandle->SlaveAddr, SC7A20_REG_CTRL_3, &tempreg, 1); //关闭中断
	tempreg = 0x88;
	pHandle->IIC_WriteReg(pHandle->SlaveAddr, SC7A20_REG_CTRL_4, &tempreg, 1); //读取完成再更新,小端模式,、2g+正常模式,高精度模式

	if (i < 10) return TRUE;
	return FALSE;
}

s16 SC7A20_12bitComplement(uint8_t msb, uint8_t lsb)
{
	s16 temp;

	temp = msb << 8 | lsb;
	temp = temp >> 4;   //只有高12位有效
	temp = temp & 0x0fff;
	if (temp & 0x0800) //负数 补码==>原码
	{
		temp = temp & 0x07ff; //屏弊最高位      
		temp = ~temp;
		temp = temp + 1;
		temp = temp & 0x07ff;
		temp = -temp;       //还原最高位
	}
	return temp;
}


/*************************************************************************************************************************
*函数        	:	bool SC7A20_ReadAcceleration(SC7A20_HANDLE* pHandle, s16* pXa, s16* pYa, s16* pZa)
*功能        	:	SC7A20读取加速度值
*参数        	:	pHandle:句柄;pXa,pYa,pZa 三轴加速度值
*返回        	:	TRUE:成功;FALSE:失败
*依赖			: 	底层宏定义
*作者       		:	cp1300@139.com
*时间     		:	2022-07-01
*最后修改时间		:	2022-07-01
*说明        	:
*************************************************************************************************************************/
bool SC7A20_ReadAcceleration(SC7A20_HANDLE* pHandle, s16* pXa, s16* pYa, s16* pZa)
{
	u8 buff[6];
	u8 i;
	s16 temp;

	memset(buff, 0, 6);
	if (pHandle->IIC_ReadReg(pHandle->SlaveAddr, SC7A20_REG_X_L|BIT7, buff, 6) == FALSE)
	{
		return FALSE;
	}
	else
	{
		
		pHandle->IIC_ReadReg(pHandle->SlaveAddr, 0x27, &i, 1);
		
		/*for (i = 0; i < 6; i++)
		{
			uart_printf("%02X ",buff[i]);
			
		}

		uart_printf("r\n");*/

		//X轴
		*pXa = buff[1];
		*pXa <<= 8;
		*pXa |= buff[0];
		*pXa >>= 4;	//取12bit精度

		//Y轴
		*pYa = buff[3];
		*pYa <<= 8;
		*pYa |= buff[2];
		*pYa >>= 4;	//取12bit精度
		
		//Z轴
		*pZa = buff[5];
		*pZa <<= 8;
		*pZa |= buff[4];
		*pZa >>= 4;	//取12bit精度

		return TRUE;
	}

}

#define PI 3.1415926535898
/*************************************************************************************************************************
*函数        	:	bool SC7A20_GetZAxisAngle(SC7A20_HANDLE* pHandle, s16 AcceBuff[3], float* pAngleZ)
*功能        	:	SC7A20 获取Z轴倾角
*参数        	:	pHandle:句柄;AcceBuff:3个轴的加速度;pAngleZ:Z方向倾角
*返回        	:	TRUE:成功;FALSE:失败
*依赖			: 	底层宏定义
*作者       		:	cp1300@139.com
*时间     		:	2022-07-02
*最后修改时间		:	2022-07-02
*说明        	:
*************************************************************************************************************************/
bool SC7A20_GetZAxisAngle(SC7A20_HANDLE* pHandle, s16 AcceBuff[3], float* pAngleZ)
{
	double fx, fy, fz;
	double A;
	s16 Xa, Ya, Za;





	if (SC7A20_ReadAcceleration(pHandle, &Xa, &Ya, &Za) == FALSE) return FALSE;		//ADXL362 读取加速度数据
	//uart_printf("Xa:%d \tYa:%d \tZa:%d \r\n",Xa,Ya,Za);
	AcceBuff[0] = Xa;	//x轴加速度
	AcceBuff[1] = Ya;	//y轴加速度
	AcceBuff[2] = Za;	//z轴加速度

	fx = Xa;
	fx *= 2.0 / 4096;
	fy = Ya;
	fy *= 2.0 / 4096;
	fz = Za;
	fz *= 2.0 / 4096;

	//uart_printf("fx:%.04f\tfy:%.04f\tfz:%.04f\t\r\n",fx,fy,fz);

	//Z方向
	A = fx * fx + fy * fy;
	A = sqrt(A);
	A = (double)A / fz;
	A = atan(A);
	A = A * 180 / PI;

	*pAngleZ = A;
	uart_printf("=======角度:%.04f\r\n",*pAngleZ);


	return TRUE;
}

 文章来源地址https://www.toymoban.com/news/detail-516406.html

/*************************************************************************************************************
 * 文件名:			SC7A20.h
 * 功能:			SC7A20 三轴加速度传感器支持
 * 作者:			cp1300@139.com
 * 创建时间:		2022-07-01
 * 最后修改时间:	2022-07-01
 * 详细:
*************************************************************************************************************/
#ifndef _SC7A20_H_
#define _SC7A20_H_
#include "system.h"


//SC7A20 句柄
typedef struct
{
	bool (*IIC_ReadReg)(u8 SlaveAddr, u8 RegAddr, u8 *pDataBuff, u16 ByteNum);		//IIC读取寄存器接口
	bool (*IIC_WriteReg)(u16 SlaveAddr, u8 RegAddr, u8 *pDataBuff, u16 ByteNum);	//IIC写入寄存器接口
	u8 SlaveAddr;
	u8 ModeConfigData;						//记录模式配置值
}SC7A20_HANDLE;



//SC7A20初始化
bool SC7A20_Init(SC7A20_HANDLE *pHandle, u8 SlaveAddr, 
	bool (*IIC_ReadReg)(u8 SlaveAddr, u8 RegAddr, u8 *pDataBuff, u16 ByteNum), 
	bool (*IIC_WriteReg)(u16 SlaveAddr, u8 RegAddr, u8 *pDataBuff, u16 ByteNum));

bool SC7A20_ReadAcceleration(SC7A20_HANDLE* pHandle, s16* pXa, s16* pYa, s16* pZa);//SC7A20读取加速度值
bool SC7A20_GetZAxisAngle(SC7A20_HANDLE* pHandle, s16 AcceBuff[3], float* pAngleZ);//SC7A20 获取Z轴倾角

#endif /*_SC7A20_H_*/

测试代码

/*************************************************************************************************************
 * 文件名:			SC7A20_Test.c
 * 功能:			SC7A20测试
 * 作者:			cp1300@139.com
 * 创建时间:		2022-07-01
 * 最后修改时间:	2022-07-01
 * 详细:			
*************************************************************************************************************/
#include "system.h"
#include "hc32f46x_system.h"
#include "test.h"
#include "SoftwareIIC.h"
#include "board.h"
#include "SC7A20.h"

static SC7A20_HANDLE sg_Temp_SC7A20_Handle;



//读取寄存器接口
static bool SC7A20_IIC_ReadReg(u8 SlaveAddr, u8 RegAddr, u8 *pDataBuff, u16 ByteNum)
{
	if (IIC_MasterReadReg(SC7A20_IIC_CH, SlaveAddr, RegAddr, TRUE, pDataBuff, ByteNum) != IIC_OK) return FALSE;
	else return TRUE;
}
	

//写寄存器接口
static bool SC7A20_IIC_WriteReg(u16 SlaveAddr, u8 RegAddr, u8 *pDataBuff, u16 ByteNum)
{
	if (IIC_MasterWriteReg(SC7A20_IIC_CH, SlaveAddr, RegAddr, TRUE, pDataBuff, ByteNum) != IIC_OK) return FALSE;
	else return TRUE;
}

//SC7A20测试
void SC7A20_Test(void)
{
	u8 buff[7];
	s16 acc[3];
	float zAngle;
	
	SC7A20_IO_Init();
	IIC_Init(SC7A20_IIC_CH, 300, 100);//硬件IIC初始化

	//SC7A20初始化
	SC7A20_Init(&sg_Temp_SC7A20_Handle, SC7A20_ADDR, SC7A20_IIC_ReadReg, SC7A20_IIC_WriteReg);

	while (1)
	{
		if (FALSE == SC7A20_GetZAxisAngle(&sg_Temp_SC7A20_Handle, acc, &zAngle))//SC7A20读取加速度值
		{
			INFO_S("加速度数据读取失败\r\n");
		}
		else
		{
			INFO_S("Z:%f\r\n", zAngle);
		}

		SYS_DelayMS(500);
	}

}	

sc7a20,HC32,SC7A20,SC7A20驱动,STM32 SC7A20

 sc7a20,HC32,SC7A20,SC7A20驱动,STM32 SC7A20

 sc7a20,HC32,SC7A20,SC7A20驱动,STM32 SC7A20

 

到了这里,关于SC7A20 三轴加速度传感器 驱动的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 无线传感器基础:获取手机传感器、加速度

    一些实验过程中的疑问: 如何知道设备上有哪些传感器? 如果手机不支持的传感器,程序运行往往不会抛出异常,只是无法获得传感器传回的数据。那么如何知道设备上有哪些传感器可用呢?有两种方式,一种是直接方式,一种是间接方式。直接方式就是遍历获取得到传感

    2024年02月02日
    浏览(42)
  • 【STM32 CubeMX】adxl345加速度传感器

    提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 本篇文章使用I2C进行通信 在嵌入式系统中,加速度传感器是一种常见的传感器,用于检测物体的加速度或者倾斜角度。ADXL345是一款常用的数字三轴加速度传感器,由ADI(Analog Devices)公司制造。它具有

    2024年02月21日
    浏览(30)
  • 物联网AI MicroPython传感器学习 之 ADXL345 3轴加速度传感器

    学物联网,来万物简单IoT物联网!! ADXL345是一款完整的3轴加速度测量系统,可选择的测量范围有士2g,士4g,士8g或士16g。它既能测量运动或冲击导致的动态加速度,也能测量静止加速度,例如重力加速度,这样的特性让它可作为倾斜传感器使用。该传感器还具备单击 /双击

    2024年03月26日
    浏览(38)
  • 【Android App】物联网中查看手机支持的传感器及实现摇一摇功能-加速度传感器(附源码和演示 超详细)

    需要源码请点赞关注收藏后评论区留言~~~ 传感器Sensor是一系列感应器的总称,是Android设备用来感知周围环境和运动信息的工具。 因为具体的感应信息依赖于相关硬件,所以虽然Android定义了众多感应器,但是并非每部手机都能支持这么多感应器。 传感器一般借助于硬件监听

    2024年02月09日
    浏览(37)
  • 怎么加速网速?如何加速网络下载速度真正提高网速

    怎么加速网速?我们经常在下载东西的时候,会觉得网速很不给力。其实这不仅关系到你的带宽,还关系到你的电脑。下面我介绍一个比较适合新手的方法,使我们计算机发挥到最佳下载模式。达到宽带最大利用率。 软媒魔方电脑大师 V6.25 绿色免费版 类型: 系统增强 大小:

    2024年02月07日
    浏览(28)
  • 跑出创新加速度,AI基础软件成AIGC产业发展加速器

    2023年中国国际服务贸易交易会(以下简称“服贸会”)受世界瞩目正在火热进行,9月4日,服贸会专题论坛之“2023中国AIGC创新发展论坛” 在大会期间成功举办, 九章云极DataCanvas公司副总裁周晓凌受邀出席论坛,并发表题为“AI基础软件促进大模型与AIGC应用快速发展”的精

    2024年02月09日
    浏览(37)
  • [足式机器人]Part3 机构运动学与动力学分析与建模 Ch00-5 刚体的加速度与角加速度

    本文仅供学习使用,总结很多本现有讲述运动学或动力学书籍后的总结,从矢量的角度进行分析,方法比较传统,但更易理解,并且现有的看似抽象方法,两者本质上并无不同。 2024年底本人学位论文发表后方可摘抄 若有帮助请引用 本文参考: . 食用方法 求解逻辑:速度与

    2024年01月25日
    浏览(49)
  • ABB、FANUC机器人点位加速度用法

    机器人在点位与点位之间的运动,会存在速度上的变化,加速度指令的添加可以减小机器人在运动中,由高速到低速间惯性的带来的影响,修正机器人的路径误差,让机器人的运动更加顺滑。 ABB机器人加速度指令为ACCSET指令 ACCSET指令中的第一个参数是设置加速度,第二个参

    2024年04月16日
    浏览(40)
  • 自动驾驶仿真:基于Carsim开发的加速度请求模型

    1、自动驾驶行业中,算法端对于纵向控制的功能预留接口基本都是 加速度 ,我们需要给控制器仿真加速度的信号,控制器才会实现对纵向功能的控制。 2、Carsim或者其他动力学软件,主要提供者节气门开度和主缸压力进行控制。我们在进行联合仿真时,往往都要通过PID的方

    2024年02月11日
    浏览(23)
  • 「实在RPA·烟草数字员工」助力烟草行业数字化转型加速度

    烟草行业作为烟草产业链上重要一环,外部连接烟草工业企业、零售客户、消费者,内部包含营销、专卖、烟叶、物流等诸多业务,信息系统众多,企业数据量庞大。因此,清楚地了解自身存在的痛点,找到适合自身业务需求的转型路径,搭建一个高适配的灵活全面的数字化

    2024年02月06日
    浏览(120)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包