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;
}
/************************************************************************************************************** 文件名: 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 三轴加速度传感器 驱动相关推荐
- 三轴加速度传感器bma150驱动解析
BMA150 博世 三轴加速度传感器 SPI(4线,3线),i2c,中断引脚 频响+/- 2g,4g,8g;带宽25~1500hz,中断触发内部加速度求值 低功耗,快速唤醒 包含数据寄存器,控制寄存器 ...
- 三轴加速度传感器和六轴惯性传感器_美泰产品推介MSV3100A三轴加速度传感器
1 产品介绍 MSV3100A三轴加速度传感器 MSV3100A是一款三轴向模拟输出的MEMS加速度传感器.传感器由三个相互正交的微加速度计和信号变换电路组成.能够承受高达10,000g的冲击载荷和恒 ...
- 溢出检测单符号位法_设计经验:如何用三轴加速度传感器检测倾斜角?
本文介绍了三轴加速度传感器的特性,并通过一个典型的应用--检测倾斜角--对单轴.双轴和三轴加速度传感器进行了比较,并给出了选型建议. 在前两篇文章中,我们介绍了单/双轴加速度传感器在来检测倾斜角上的应 ...
- ADI Blackfin DSP处理器-BF533的开发详解59:DSP控制ADXL345三轴加速度传感器的应用2(含源码)
硬件准备 ADSP-EDU-BF533:BF533开发板 AD-HP530ICE:ADI DSP仿真器 软件准备 Visual DSP++软件 硬件链接 MEMS三轴加速度传感器 我做了一个三轴加速度 ...
- ADI Blackfin DSP处理器-BF533的开发详解58:DSP控制ADXL345三轴加速度传感器的应用(含源码)
硬件准备 ADSP-EDU-BF533:BF533开发板 AD-HP530ICE:ADI DSP仿真器 软件准备 Visual DSP++软件 硬件链接 MEMS三轴加速度传感器 我做了一个三轴加速度 ...
- ADI Blackfin DSP处理器-BF533的开发详解60:DSP控制ADXL345三轴加速度传感器-电子水平仪(含源码)
硬件准备 ADSP-EDU-BF533:BF533开发板 AD-HP530ICE:ADI DSP仿真器 软件准备 Visual DSP++软件 硬件链接 MEMS三轴加速度传感器 我做了一个三轴加速度 ...
- ADI Blackfin DSP处理器-BF533的开发详解61:DSP控制ADXL345三轴加速度传感器-LCD(含源码)
硬件准备 ADSP-EDU-BF533:BF533开发板 AD-HP530ICE:ADI DSP仿真器 软件准备 Visual DSP++软件 硬件链接 MEMS三轴加速度传感器 我做了一个三轴加速度 ...
- ADI Blackfin DSP处理器-BF533的开发详解62:DSP控制ADXL345三轴加速度传感器-贪食蛇游戏(含源码)
硬件准备 ADSP-EDU-BF533:BF533开发板 AD-HP530ICE:ADI DSP仿真器 软件准备 Visual DSP++软件 硬件链接 MEMS三轴加速度传感器 我做了一个三轴加速度 ...
- android SENSOR_ACCELEROMETER 三轴加速度传感器
先看效果图: package org.ninetripods.mq.asdasdasdasdasdas; import android.content.Context; import android. ...
- ST公司 Lis2dh12 三轴加速度传感器,计算加速度值转成角度值
目录 概述 项目上使用了一款Lis2dh12三轴加速度传感器.开发前要准备的工作. 1.原理图: 1.1.创建lis2dh12.c文件 1.2.在此重点说明,如果想调传感器的中断灵敏度,注意:关注1. ...
最新文章
- go map的定义及使用
- 2019日历全年一张_带上这份2019全年活动日历,旅行打卡不迷路
- 移动端下网页border:1px显示
- C++学习笔记-----存在多态调用时,为基类定义虚析构函数
- Codeforces 408D Long Path (DP)
- 解决:Navicat for mysql 设置外键出错
- scala的函数(day02)
- 【VS】项目属性配置(中)
- 数字图像处理 冈萨雷斯(第四版)韦伯比的理解
- 用css制作网页目录,利用CSS制作树状目录(菜单)
- 云+社区杂货摊年终上新,定制礼盒发发发!
- Redis 的高并发实战:抢购系统 --浅奕
- 苹果计算机 win10,苹果怎么装win10苹果装win10详细教程【图文】
- 计算机论文折线图,干货 | 画论文折线图、曲线图?几个代码模板轻松搞定!
- 联想小新使用Alt+insert快捷键
- 假脱机技术Spooling和守护进程
- 用矩阵表示图形旋转缩放变换
- 计算机开始菜单提供哪些功能,什么是开始菜单 -电脑资料
- 可乐瓶游戏c语言,小班活动玩可乐瓶教案
- 学习微信小程序,getUserInfo与getUserProfile
热门文章
- 算法 | 生命游戏 (Game of Life)
- netty权威指南 微云_Netty权威指南 第2版.pdf
- 外行人都能看得懂的机器学习,错过了血亏!
- STM32F107各种接口程序合集工程文件
- 在线html解压,javascript实现网页端解压并查看zip文件
- window10 修改jdk版本,从jdk10降到jdk1.8,java -version版本没有变化的问题解决
- 西门子PLC常用指令
- 【Spring学习笔记七】-Spring MVC基本配置和实例
- linux操作系统结构体系,Linux操作系统结构分析 郭玉东.pdf
- Internet信息服务(IIS)管理器--IIS部署发布网站