美文网首页物联网loT从业者
NRF52832学习笔记(34)——倾角传感器SCL3300使用

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

作者: Leung_ManWah | 来源:发表于2020-10-26 17:12 被阅读0次

    一、简介

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

    相关文章

      网友评论

        本文标题:NRF52832学习笔记(34)——倾角传感器SCL3300使用

        本文链接:https://www.haomeiwen.com/subject/btnamktx.html