使用的时候需要找对文档,之前文档不对,导致读取的数据计算角度一直不成功,发现要关闭高通滤波,由于高通滤波寄存器里面的滤波阈值没有文档说明,我直接关闭掉就可以使用了,代码与硬件平台无关,需要底层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 三轴加速度传感器 驱动相关推荐

  1. 三轴加速度传感器bma150驱动解析

    BMA150 博世 三轴加速度传感器 SPI(4线,3线),i2c,中断引脚 频响+/- 2g,4g,8g;带宽25~1500hz,中断触发内部加速度求值 低功耗,快速唤醒 包含数据寄存器,控制寄存器 ...

  2. 三轴加速度传感器和六轴惯性传感器_美泰产品推介MSV3100A三轴加速度传感器

    1 产品介绍 MSV3100A三轴加速度传感器 MSV3100A是一款三轴向模拟输出的MEMS加速度传感器.传感器由三个相互正交的微加速度计和信号变换电路组成.能够承受高达10,000g的冲击载荷和恒 ...

  3. 溢出检测单符号位法_设计经验:如何用三轴加速度传感器检测倾斜角?

    本文介绍了三轴加速度传感器的特性,并通过一个典型的应用--检测倾斜角--对单轴.双轴和三轴加速度传感器进行了比较,并给出了选型建议. 在前两篇文章中,我们介绍了单/双轴加速度传感器在来检测倾斜角上的应 ...

  4. ADI Blackfin DSP处理器-BF533的开发详解59:DSP控制ADXL345三轴加速度传感器的应用2(含源码)

    硬件准备 ADSP-EDU-BF533:BF533开发板 AD-HP530ICE:ADI DSP仿真器 软件准备 Visual DSP++软件 硬件链接 MEMS三轴加速度传感器 我做了一个三轴加速度 ...

  5. ADI Blackfin DSP处理器-BF533的开发详解58:DSP控制ADXL345三轴加速度传感器的应用(含源码)

    硬件准备 ADSP-EDU-BF533:BF533开发板 AD-HP530ICE:ADI DSP仿真器 软件准备 Visual DSP++软件 硬件链接 MEMS三轴加速度传感器 我做了一个三轴加速度 ...

  6. ADI Blackfin DSP处理器-BF533的开发详解60:DSP控制ADXL345三轴加速度传感器-电子水平仪(含源码)

    硬件准备 ADSP-EDU-BF533:BF533开发板 AD-HP530ICE:ADI DSP仿真器 软件准备 Visual DSP++软件 硬件链接 MEMS三轴加速度传感器 我做了一个三轴加速度 ...

  7. ADI Blackfin DSP处理器-BF533的开发详解61:DSP控制ADXL345三轴加速度传感器-LCD(含源码)

    硬件准备 ADSP-EDU-BF533:BF533开发板 AD-HP530ICE:ADI DSP仿真器 软件准备 Visual DSP++软件 硬件链接 MEMS三轴加速度传感器 我做了一个三轴加速度 ...

  8. ADI Blackfin DSP处理器-BF533的开发详解62:DSP控制ADXL345三轴加速度传感器-贪食蛇游戏(含源码)

    硬件准备 ADSP-EDU-BF533:BF533开发板 AD-HP530ICE:ADI DSP仿真器 软件准备 Visual DSP++软件 硬件链接 MEMS三轴加速度传感器 我做了一个三轴加速度 ...

  9. android SENSOR_ACCELEROMETER 三轴加速度传感器

    先看效果图: package org.ninetripods.mq.asdasdasdasdasdas; import android.content.Context; import android. ...

  10. ST公司 Lis2dh12 三轴加速度传感器,计算加速度值转成角度值

    目录 概述 项目上使用了一款Lis2dh12三轴加速度传感器.开发前要准备的工作. 1.原理图: 1.1.创建lis2dh12.c文件 1.2.在此重点说明,如果想调传感器的中断灵敏度,注意:关注1. ...

最新文章

  1. go map的定义及使用
  2. 2019日历全年一张_带上这份2019全年活动日历,旅行打卡不迷路
  3. 移动端下网页border:1px显示
  4. C++学习笔记-----存在多态调用时,为基类定义虚析构函数
  5. Codeforces 408D Long Path (DP)
  6. 解决:Navicat for mysql 设置外键出错
  7. scala的函数(day02)
  8. 【VS】项目属性配置(中)
  9. 数字图像处理 冈萨雷斯(第四版)韦伯比的理解
  10. 用css制作网页目录,利用CSS制作树状目录(菜单)
  11. 云+社区杂货摊年终上新,定制礼盒发发发!
  12. Redis 的高并发实战:抢购系统 --浅奕
  13. 苹果计算机 win10,苹果怎么装win10苹果装win10详细教程【图文】
  14. 计算机论文折线图,干货 | 画论文折线图、曲线图?几个代码模板轻松搞定!
  15. 联想小新使用Alt+insert快捷键
  16. 假脱机技术Spooling和守护进程
  17. 用矩阵表示图形旋转缩放变换
  18. 计算机开始菜单提供哪些功能,什么是开始菜单 -电脑资料
  19. 可乐瓶游戏c语言,小班活动玩可乐瓶教案
  20. 学习微信小程序,getUserInfo与getUserProfile

热门文章

  1. 算法 | 生命游戏 (Game of Life)
  2. netty权威指南 微云_Netty权威指南 第2版.pdf
  3. 外行人都能看得懂的机器学习,错过了血亏!
  4. STM32F107各种接口程序合集工程文件
  5. 在线html解压,javascript实现网页端解压并查看zip文件
  6. window10 修改jdk版本,从jdk10降到jdk1.8,java -version版本没有变化的问题解决
  7. 西门子PLC常用指令
  8. 【Spring学习笔记七】-Spring MVC基本配置和实例
  9. linux操作系统结构体系,Linux操作系统结构分析 郭玉东.pdf
  10. Internet信息服务(IIS)管理器--IIS部署发布网站