一、簡(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.c 、 board_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 日