NRF52832学习笔记(34)——倾角传感器SCL3300使用

一、简介

官方数据手册:https://pan.baidu.com/s/1Y0M4ImNsBvAvECy-yNUvxg 提取码:itsr

  • 超低噪声、高分辨率 0.001°/√Hz
  • SPI数字接口
  • 优越的机械阻尼特性
  • 使用温度范围:-40~125℃
  • 消耗电流1.2mA(供给电源:3.0~3.6V时)
  • 成熟的静电容量3D-MEMS技术

二、硬件连接

功能口 引脚
MISO 17
MOSI 18
CLK 20
CSN 19

三、添加SPI驱动

查看 NRF52832学习笔记(5)——SPI接口使用

官方文档对 SPI 时钟有推荐,因为 SCK 会影响 SCL3300 的噪声水平,建议时钟频率在 2MHz~4MHz 以获得最优性能。


修改 SPI 频率为 4MHz,SPI_FREQUENCY_FREQUENCY_M4

四、移植文件

链接:https://pan.baidu.com/s/1fS7LCpQW36QGIvJBoxP4gQ 提取码:3opk
board_scl3300.cboard_scl3300.h 加入工程的Application文件夹下

4.1 board_scl3300.c

/*********************************************************************
 * INCLUDES
 */
#include "nrf_delay.h"

#include "board_scl3300.h"
#include "board_spi.h"

static void writeRegister(uint32_t cmd);
static void readRegister(void);
static void delayMs(uint32_t time);
static void delayUs(uint32_t time);

/*********************************************************************
 * LOCAL VARIABLES
 */                                 
static uint8_t s_readData[4] = {0};

/*********************************************************************
 * PUBLIC FUNCTIONS
 */
/**
 @brief SCL3300的初始化函数
 @param 无
 @return 无
*/
void SCL3300_Init(void)
{
    delayMs(10);
    
    writeRegister(CHANGE_TO_MODE4);                         // 选择倾角模式
    readRegister();

    delayMs(5);
    
    writeRegister(READ_STATUS_SUMMARY);                     // 清除状态
    readRegister();
    
    writeRegister(READ_STATUS_SUMMARY);
    readRegister();
    
    writeRegister(READ_STATUS_SUMMARY);
    readRegister();
    
    writeRegister(ENABLE_ANGLE_OUTPUTS);                    // 使能角度输出
    readRegister();
}

/**
 @brief 检查SPI通信,返回值第3字节为0xC1则通信正常
 @param 无
 @return 无
*/
void SCL3300_Test(void)
{
    writeRegister(READ_ID);
    readRegister();
    // 打印s_readData[2]
}

/**
 @brief 读取角度
 @param direction -[in] 要读取的方向X,Y,Z轴
 @return 角度数
*/
float SCL3300_ReadAngle(uint8_t direction)
{
    if(direction == ANG_X)
    {
        writeRegister(READ_ANG_X);
    }
    else if(direction == ANG_Y)
    {
        writeRegister(READ_ANG_Y);
    }
    else if(direction == ANG_Z)
    {
        writeRegister(READ_ANG_Z);
    }
    readRegister();
                                                            // SPI返回结构第1字节OP+RS,
    uint16_t angle = (s_readData[1] << 8) + s_readData[2];  // 第2和第3字节为Data
                                                            // 第4字节为CRC
    float fangle = (float)angle / 16384.0 * 90.0;           // 如3976/2^14*90=21.84°
    
    return fangle;
}


/*********************************************************************
 * LOCAL FUNCTIONS
 */
/**
 @brief 写SCL3300寄存器
 @param cmd -[in] 写入命令
 @return 无
*/
static void writeRegister(uint32_t cmd)
{  
    uint8_t writeData[4] = {0};
    writeData[0] = (cmd >> 24) & 0xFF;
    writeData[1] = (cmd >> 16) & 0xFF;
    writeData[2] = (cmd >> 8) & 0xFF;
    writeData[3] = (cmd >> 0) & 0xFF;
    
    SPI_CS_LOW;
    
    SPI_ReadWriteData(writeData, NULL, 4);
    
    SPI_CS_HIGH;
    
    delayUs(10);
}

/**
 @brief 读SCL3300寄存器
 @param 无
 @return 无
*/
static void readRegister(void)
{   
    SPI_CS_LOW;
    
    SPI_ReadWriteData(NULL, s_readData, 4);

    SPI_CS_HIGH;
    
    delayUs(10);
}

/**
 @brief 毫秒级延时函数
 @param time -[in] 延时时间(毫秒)
 @return 无
*/
static void delayMs(uint32_t time)
{
    nrf_delay_ms(time);
}

/**
 @brief 微秒级延时函数
 @param time -[in] 延时时间(微秒)
 @return 无
*/
static void delayUs(uint32_t time)
{
    nrf_delay_us(time);
}

/****************************************************END OF FILE****************************************************/

4.2 board_scl3300.h

#ifndef _BOARD_SCL3300_H_
#define _BOARD_SCL3300_H_

/*********************************************************************
 * INCLUDES
 */

/*********************************************************************
 * DEFINITIONS
 */
#define ANG_X                   0
#define ANG_Y                   1
#define ANG_Z                   2

//******************************************************************/
//                          传感数据                                /
//******************************************************************/
#define READ_ACC_X              0x040000F7
#define READ_ACC_Y              0x080000FD
#define READ_ACC_Z              0x0C0000FB
#define READ_TEMPERATURE        0x140000EF
#define READ_ANG_X              0x240000C7
#define READ_ANG_Y              0x280000CD
#define READ_ANG_Z              0x2C0000CB

//******************************************************************/
//                          自我检测                                /
//******************************************************************/
#define READ_STO                0x100000E9

//******************************************************************/
//                          状态                                    /
//******************************************************************/
#define READ_STATUS_SUMMARY     0x180000E5

//******************************************************************/
//                          错误标志                                /
//******************************************************************/
#define READ_ERR_FLAG1          0x1C0000E3
#define READ_ERR_FLAG2          0x200000C1

//******************************************************************/
//                          命令                                    /
//******************************************************************/
#define READ_CMD                0x340000DF
#define CHANGE_TO_MODE1         0xB400001F  // 默认模式,1.8g full-scale 40 Hz 1st order low pass filter
#define CHANGE_TO_MODE2         0xB4000102  // 23.6g full-scale 70 Hz 1st order low pass filter
#define CHANGE_TO_MODE3         0xB4000225  // Inclination mode 13 Hz 1st order low pass filter
#define CHANGE_TO_MODE4         0xB4000338  // Inclination mode 13 Hz 1st order low pass filter Low noise mode
#define SET_POWER_DOWN_MODE     0xB400046B
#define WAKE_UP                 0xB400001F
#define SW_RESET                0xB4002098

//******************************************************************/
//                          角度控制                                /
//******************************************************************/
#define ENABLE_ANGLE_OUTPUTS    0xB0001F6F

//******************************************************************/
//                          芯片ID                                  /
//******************************************************************/
#define READ_ID                 0x40000091

//******************************************************************/
//                          串行块                                  /
//******************************************************************/
#define READ_SERIAL1            0x640000A7
#define READ_SERIAL2            0x680000AD

//******************************************************************/
//                          选择BANK                                /
//******************************************************************/
#define READ_CURRENT_BANK       0x7C0000B3
#define SWITCH_TO_BANK_0        0xFC000073 // 默认,读bank1后自动返回
#define SWITCH_TO_BANK_1        0xFC00016E

/*********************************************************************
 * API FUNCTIONS
 */
void SCL3300_Init(void);
void SCL3300_Test(void);
float SCL3300_ReadAngle(uint8_t direction);

#endif /* _BOARD_SCL3300_H_ */

五、初始化流程

开机先等待 10ms——>设置测量模式——>再等待 5ms——>读取状态——>使能角度输出。


六、倾角转换公式

七、API调用

需包含头文件 board_scl3300.h

SCL3300_Init

功能 SCL3300的初始化函数
函数定义 void SCL3300_Init(void)
参数
返回

SCL3300_Test

功能 检查SPI通信,返回值第3字节为0xC1则通信正常
函数定义 void SCL3300_Test(void)
参数
返回

SCL3300_ReadAngle

功能 读取角度
函数定义 float SCL3300_ReadAngle(uint8_t direction)
参数 direction:要读取的方向X,Y,Z轴
返回 角度数

八、使用例子

8.1 初始化

1)添加头文件

#include "board_scl3300.h"
#include "board_spi.h"

2)添加初始化代码(main.c的main函数中)

/**@brief Function for application main entry.
 */
int main(void)
{
    bool erase_bonds;

    /*-------------------------- 外设驱初始化 ---------------------------*/
    // Initialize.
    log_init();                                                                 // 日志驱动初始化                                                                  
    timers_init();                                                              // 定时器驱动初始化(在此加入自定义定时器)
    SPI_Init();                                                                 // SPI驱动初始化
    SCL3300_Init();                                                             // SCL3300三轴倾角驱动初始化
    ···
    ···
/*-------------------------- 开启应用 ---------------------------*/
    // Start execution.
    NRF_LOG_INFO("Template example started."); 
    ···
}

8.2 读取角度

float angX = SCL3300_ReadAngle(ANG_X);
NRF_LOG_INFO("X:" NRF_LOG_FLOAT_MARKER , NRF_LOG_FLOAT(angX));
float angY = SCL3300_ReadAngle(ANG_Y);
NRF_LOG_INFO("Y:" NRF_LOG_FLOAT_MARKER , NRF_LOG_FLOAT(angY));
float angZ = SCL3300_ReadAngle(ANG_Z);
NRF_LOG_INFO("Z:" NRF_LOG_FLOAT_MARKER "\n", NRF_LOG_FLOAT(angZ));

九、测量方向


• 由 Leung 写于 2020 年 10 月 26 日

• 参考:高精度三轴加速度计SCL3300驱动代码

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 216,544评论 6 501
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,430评论 3 392
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 162,764评论 0 353
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,193评论 1 292
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,216评论 6 388
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,182评论 1 299
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,063评论 3 418
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,917评论 0 274
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,329评论 1 310
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,543评论 2 332
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,722评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,425评论 5 343
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,019评论 3 326
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,671评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,825评论 1 269
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,729评论 2 368
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,614评论 2 353