NRF52832學(xué)習(xí)筆記(34)——傾角傳感器SCL3300使用

一、簡(jiǎn)介

官方數(shù)據(jù)手冊(cè):https://pan.baidu.com/s/1Y0M4ImNsBvAvECy-yNUvxg 提取碼:itsr

  • 超低噪聲叨叙、高分辨率 0.001°/√Hz
  • SPI數(shù)字接口
  • 優(yōu)越的機(jī)械阻尼特性
  • 使用溫度范圍:-40~125℃
  • 消耗電流1.2mA(供給電源:3.0~3.6V時(shí))
  • 成熟的靜電容量3D-MEMS技術(shù)

二锭弊、硬件連接

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

三、添加SPI驅(qū)動(dòng)

查看 NRF52832學(xué)習(xí)筆記(5)——SPI接口使用

官方文檔對(duì) SPI 時(shí)鐘有推薦擂错,因?yàn)?SCK 會(huì)影響 SCL3300 的噪聲水平味滞,建議時(shí)鐘頻率在 2MHz~4MHz 以獲得最優(yōu)性能。


修改 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的初始化函數(shù)
 @param 無
 @return 無
*/
void SCL3300_Init(void)
{
    delayMs(10);
    
    writeRegister(CHANGE_TO_MODE4);                         // 選擇傾角模式
    readRegister();

    delayMs(5);
    
    writeRegister(READ_STATUS_SUMMARY);                     // 清除狀態(tài)
    readRegister();
    
    writeRegister(READ_STATUS_SUMMARY);
    readRegister();
    
    writeRegister(READ_STATUS_SUMMARY);
    readRegister();
    
    writeRegister(ENABLE_ANGLE_OUTPUTS);                    // 使能角度輸出
    readRegister();
}

/**
 @brief 檢查SPI通信行楞,返回值第3字節(jié)為0xC1則通信正常
 @param 無
 @return 無
*/
void SCL3300_Test(void)
{
    writeRegister(READ_ID);
    readRegister();
    // 打印s_readData[2]
}

/**
 @brief 讀取角度
 @param direction -[in] 要讀取的方向X攒暇,Y,Z軸
 @return 角度數(shù)
*/
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返回結(jié)構(gòu)第1字節(jié)OP+RS子房,
    uint16_t angle = (s_readData[1] << 8) + s_readData[2];  // 第2和第3字節(jié)為Data
                                                            // 第4字節(jié)為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 毫秒級(jí)延時(shí)函數(shù)
 @param time -[in] 延時(shí)時(shí)間(毫秒)
 @return 無
*/
static void delayMs(uint32_t time)
{
    nrf_delay_ms(time);
}

/**
 @brief 微秒級(jí)延時(shí)函數(shù)
 @param time -[in] 延時(shí)時(shí)間(微秒)
 @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

//******************************************************************/
//                          傳感數(shù)據(jù)                                /
//******************************************************************/
#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

//******************************************************************/
//                          自我檢測(cè)                                /
//******************************************************************/
#define READ_STO                0x100000E9

//******************************************************************/
//                          狀態(tài)                                    /
//******************************************************************/
#define READ_STATUS_SUMMARY     0x180000E5

//******************************************************************/
//                          錯(cuò)誤標(biāo)志                                /
//******************************************************************/
#define READ_ERR_FLAG1          0x1C0000E3
#define READ_ERR_FLAG2          0x200000C1

//******************************************************************/
//                          命令                                    /
//******************************************************************/
#define READ_CMD                0x340000DF
#define CHANGE_TO_MODE1         0xB400001F  // 默認(rèn)模式形用,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 // 默認(rèn),讀bank1后自動(dòng)返回
#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_ */

五证杭、初始化流程

開機(jī)先等待 10ms——>設(shè)置測(cè)量模式——>再等待 5ms——>讀取狀態(tài)——>使能角度輸出田度。


六、傾角轉(zhuǎn)換公式

七解愤、API調(diào)用

需包含頭文件 board_scl3300.h

SCL3300_Init

功能 SCL3300的初始化函數(shù)
函數(shù)定義 void SCL3300_Init(void)
參數(shù)
返回

SCL3300_Test

功能 檢查SPI通信镇饺,返回值第3字節(jié)為0xC1則通信正常
函數(shù)定義 void SCL3300_Test(void)
參數(shù)
返回

SCL3300_ReadAngle

功能 讀取角度
函數(shù)定義 float SCL3300_ReadAngle(uint8_t direction)
參數(shù) direction:要讀取的方向X,Y送讲,Z軸
返回 角度數(shù)

八奸笤、使用例子

8.1 初始化

1)添加頭文件

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

2)添加初始化代碼(main.c的main函數(shù)中)

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

    /*-------------------------- 外設(shè)驅(qū)初始化 ---------------------------*/
    // Initialize.
    log_init();                                                                 // 日志驅(qū)動(dòng)初始化                                                                  
    timers_init();                                                              // 定時(shí)器驅(qū)動(dòng)初始化(在此加入自定義定時(shí)器)
    SPI_Init();                                                                 // SPI驅(qū)動(dòng)初始化
    SCL3300_Init();                                                             // SCL3300三軸傾角驅(qū)動(dòng)初始化
    ···
    ···
/*-------------------------- 開啟應(yīng)用 ---------------------------*/
    // 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));

九惋啃、測(cè)量方向


? 由 Leung 寫于 2020 年 10 月 26 日

? 參考:高精度三軸加速度計(jì)SCL3300驅(qū)動(dòng)代碼

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市监右,隨后出現(xiàn)的幾起案子边灭,更是在濱河造成了極大的恐慌,老刑警劉巖健盒,帶你破解...
    沈念sama閱讀 211,948評(píng)論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件绒瘦,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡扣癣,警方通過查閱死者的電腦和手機(jī)惰帽,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,371評(píng)論 3 385
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來搏色,“玉大人善茎,你說我怎么就攤上這事∑到危” “怎么了?”我有些...
    開封第一講書人閱讀 157,490評(píng)論 0 348
  • 文/不壞的土叔 我叫張陵烁焙,是天一觀的道長(zhǎng)航邢。 經(jīng)常有香客問我,道長(zhǎng)骄蝇,這世上最難降的妖魔是什么膳殷? 我笑而不...
    開封第一講書人閱讀 56,521評(píng)論 1 284
  • 正文 為了忘掉前任,我火速辦了婚禮九火,結(jié)果婚禮上赚窃,老公的妹妹穿的比我還像新娘。我一直安慰自己岔激,他們只是感情好勒极,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,627評(píng)論 6 386
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著虑鼎,像睡著了一般辱匿。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上炫彩,一...
    開封第一講書人閱讀 49,842評(píng)論 1 290
  • 那天匾七,我揣著相機(jī)與錄音,去河邊找鬼江兢。 笑死昨忆,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的杉允。 我是一名探鬼主播邑贴,決...
    沈念sama閱讀 38,997評(píng)論 3 408
  • 文/蒼蘭香墨 我猛地睜開眼席里,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來了痢缎?” 一聲冷哼從身側(cè)響起胁勺,我...
    開封第一講書人閱讀 37,741評(píng)論 0 268
  • 序言:老撾萬榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎独旷,沒想到半個(gè)月后署穗,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 44,203評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡嵌洼,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,534評(píng)論 2 327
  • 正文 我和宋清朗相戀三年案疲,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片麻养。...
    茶點(diǎn)故事閱讀 38,673評(píng)論 1 341
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡褐啡,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出鳖昌,到底是詐尸還是另有隱情备畦,我是刑警寧澤,帶...
    沈念sama閱讀 34,339評(píng)論 4 330
  • 正文 年R本政府宣布许昨,位于F島的核電站懂盐,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏糕档。R本人自食惡果不足惜莉恼,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,955評(píng)論 3 313
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望速那。 院中可真熱鬧俐银,春花似錦、人聲如沸端仰。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,770評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)榆俺。三九已至售躁,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間茴晋,已是汗流浹背陪捷。 一陣腳步聲響...
    開封第一講書人閱讀 32,000評(píng)論 1 266
  • 我被黑心中介騙來泰國(guó)打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留诺擅,地道東北人市袖。 一個(gè)月前我還...
    沈念sama閱讀 46,394評(píng)論 2 360
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親苍碟。 傳聞我的和親對(duì)象是個(gè)殘疾皇子酒觅,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,562評(píng)論 2 349