物联网loT从业者

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

2020-10-26  本文已影响0人  Leung_ManWah

一、简介

官方数据手册: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驱动代码

上一篇下一篇

猜你喜欢

热点阅读