ADXL345傳感器簡介
ADXL345 是 ADI 公司推出的基于 iMEMS 技術(shù)的 3 軸、數(shù)字輸出加速度傳感器。該加速度傳感器的特點(diǎn)有:
a. 分辨率高。最高 13 位分辨率。
b. 量程可變。具有+/-2g, +/-4g, +/-8g, +/-16g 可變的測量范圍。
c. 靈敏度高。最高達(dá) 3.9mg/LSB,能測量不到 1.0°的傾斜角度變化。
d. 功耗低。 40~145uA 的超低功耗,待機(jī)模式只有 0.1uA。
e. 尺寸小。整個(gè) IC 尺寸只有 3mm5mm1mm, LGA 封裝。
ADXL 支持標(biāo)準(zhǔn)的 I2C 或 SPI 數(shù)字接口,自帶 32 級 FIFO 存儲,并且內(nèi)部有多種運(yùn)動狀態(tài)檢測和靈活的中斷方式等特性。
引腳如下所示:
實(shí)物
使用的是STM32F103ZET6單片機(jī),使用了SPI2
主要接線為:CS接PB6;SCL接PB13;SDA接PB15;SDO接PB14。
STM32CubeMX配置
使用的是STM32F103ZET6單片機(jī),使用SPI2,通過串口進(jìn)行數(shù)據(jù)顯示
時(shí)鐘配置如下:
SPI配置
使用硬件SPI,根據(jù)ADXL345的SPI時(shí)序圖,選擇SPI的模式3,片選使用軟件片選
片選引腳配置
片選使用的是PB6引腳
串口配置
特別注意(重點(diǎn)部分)
1.模塊默認(rèn)使用IIC通信,如果需要使用四線SPI通信,需要將模塊的R4電阻取掉,如果不取,就抓不到時(shí)序。原因如下圖所示:
模塊將芯片的SDO引腳通過R4電阻直接連接到GND,如果不把R4電阻取掉,接線上去讀時(shí)序是讀不到信號的。
2.對于SPI采集,需要注意一下,有的MCU會把SPI1的SCK引腳用作調(diào)試引腳,導(dǎo)致使用邏輯分析儀抓取波形的時(shí)候,SCK引腳一直處于拉高狀態(tài),解決方案:A.將SCK引腳重映射去其他引腳;B.換一組SPI
核心代碼
ADXL345.C的代碼
#include "ADXL345.h"
#include "spi.h"
#include "stdio.h"
/*
* 作者:PrairieOne
* csdn:PrairieOne
* 郵箱:prairieone1024@163.com
* 嵌入式技術(shù)交流群:826251093
*/
#define SET_SPI_CS_H HAL_GPIO_WritePin(SPI1_CS_GPIO_Port,SPI1_CS_Pin,GPIO_PIN_SET);
#define SET_SPI_CS_L HAL_GPIO_WritePin(SPI1_CS_GPIO_Port,SPI1_CS_Pin,GPIO_PIN_RESET);
//寫字節(jié)
void ADXL345_Write(uint8_t addr, uint8_t value)
{
addr &= 0x3F;
SET_SPI_CS_L;
HAL_SPI_Transmit(&hspi2, &addr, 1, 10);
HAL_SPI_Transmit(&hspi2, &value, 1, 10);
SET_SPI_CS_H;
}
//讀字節(jié)
void ADXL345_Rread(uint8_t addr, uint8_t *value)
{
addr &= 0x3F;
addr |= (0x80);
SET_SPI_CS_L;
HAL_SPI_Transmit(&hspi2, &addr, 1, 10);
HAL_SPI_Receive(&hspi2, value, 1, 10);
SET_SPI_CS_H;
}
//讀ID
uint8_t Get_Adxl345_ID(void)
{
uint8_t DEVICEID = 0x00;
uint8_t result = 0;
ADXL345_Rread(DEVICEID, &result);
return result;
}
//初始化
void ADXL345_Init(void)
{
while (Get_Adxl345_ID() != 0xE5)//e5
{
printf("ADXL345 Init Fail:%x\r\n", Get_Adxl345_ID());
HAL_Delay(1000);
}
ADXL345_Write(INT_ENABLE, 0x00);
ADXL345_Write(DATA_FORMAT, 0x0B);
ADXL345_Write(BW_RATE, 0x1A);
ADXL345_Write(POWER_CTL, 0x08);
ADXL345_Write(INT_ENABLE, 0x14);
printf("ADXL345 Init Success\r\n");
}
//讀取X軸數(shù)據(jù)
void ADXL345_XTest(void)
{
short x;
uint8_t addrxl = 0x32;
uint8_t addrxh = 0x33;
uint8_t xl, xh;
ADXL345_Rread(addrxl, &xl);
ADXL345_Rread(addrxh, &xh);
x = (short)(((uint16_t)xh << 8) + xl);
printf("X:%d\r\n", x);
}
//讀取Y軸數(shù)據(jù)
void ADXL345_YTest(void)
{
short Y;
uint8_t addrYl = 0x34;
uint8_t addrYh = 0x35;
uint8_t Yl, Yh;
ADXL345_Rread(addrYl, &Yl);
ADXL345_Rread(addrYh, &Yh);
Y = (short)(((uint16_t)Yh << 8) + Yl);
printf("Y:%d\r\n", Y);
}
//讀取Z軸數(shù)據(jù)
void ADXL345_ZTest(void)
{
short Z;
uint8_t addrZl = 0x34;
uint8_t addrZh = 0x35;
uint8_t Zl, Zh;
ADXL345_Rread(addrZl, &Zl);
ADXL345_Rread(addrZh, &Zh);
Z = (short)(((uint16_t)Zh << 8) + Zl);
printf("Z:%d\r\n", Z);
}
ADXL345.H的代碼
#ifndef ADXL345_H_
#define ADXL345_H_
#include "main.h"
/*
* 作者:PrairieOne
* csdn:PrairieOne
* 郵箱:prairieone1024@163.com
* 嵌入式技術(shù)交流群:826251093
*/
/******************ADXL345寄存器命令定義**********************/
#define DEVICE_ID 0X00 //獲取器件ID,0XE5
#define THRESH_TAP 0X1D //敲擊閥值
#define OFSX 0X1E //x軸調(diào)整偏移值
#define OFSY 0X1F
#define OFSZ 0X20
#define DUR 0X21
#define Latent 0X22
#define Window 0X23
#define THRESH_ACK 0X24
#define THRESH_INACT 0X25
#define TIME_INACT 0X26
#define ACT_INACT_CTL 0X27
#define THRESH_FF 0X28
#define TIME_FF 0X29
#define TAP_AXES 0X2A
#define ACT_TAP_STATUS 0X2B
#define BW_RATE 0X2C
#define POWER_CTL 0X2D
#define INT_ENABLE 0X2E
#define INT_MAP 0X2F
#define INT_SOURCE 0X30
#define DATA_FORMAT 0X31
#define DATA_X0 0X32
#define DATA_X1 0X33
#define DATA_Y0 0X34
#define DATA_Y1 0X35
#define DATA_Z0 0X36
#define DATA_Z1 0X37
#define FIFO_CTL 0X38
#define FIFO_STATUS 0X39
#define I_M_DEVID ((uint8_t)0xE5) //器件ID=0XE5
//初始化
void ADXL345_Init(void);
//讀取X軸數(shù)據(jù)
void ADXL345_XTest(void);
//讀取Y軸數(shù)據(jù)
void ADXL345_YTest(void);
//讀取Z軸數(shù)據(jù)
void ADXL345_ZTest(void);
#endif /* ADXL345_H_ */
main的代碼文章來源:http://www.zghlxwxcb.cn/news/detail-796778.html
/*
* 作者:PrairieOne
* csdn:PrairieOne
* 郵箱:prairieone1024@163.com
* 嵌入式技術(shù)交流群:826251093
*/
int main(void)
{
/* USER CODE BEGIN 1 */
/* USER CODE END 1 */
/* MCU Configuration--------------------------------------------------------*/
/* Reset of all peripherals, Initializes the Flash interface and the Systick. */
HAL_Init();
/* USER CODE BEGIN Init */
/* USER CODE END Init */
/* Configure the system clock */
SystemClock_Config();
/* USER CODE BEGIN SysInit */
/* USER CODE END SysInit */
/* Initialize all configured peripherals */
MX_GPIO_Init();
MX_USART1_UART_Init();
MX_SPI2_Init();
/* USER CODE BEGIN 2 */
HAL_UART_Receive_IT(&huart1, (uint8_t *)&aRxBuffer, 1);
/* USER CODE END 2 */
ADXL345_Init();
/* Infinite loop */
/* USER CODE BEGIN WHILE */
while (1)
{
//讀取X軸數(shù)據(jù)
ADXL345_XTest();
//讀取Y軸數(shù)據(jù)
ADXL345_YTest();
//讀取Z軸數(shù)據(jù)
ADXL345_ZTest();
HAL_Delay(1000);
/* USER CODE END WHILE */
/* USER CODE BEGIN 3 */
}
/* USER CODE END 3 */
}
效果展示
初始化模塊的時(shí)序圖:回讀E5代碼正確
遇事不決,可問春風(fēng)!文章來源地址http://www.zghlxwxcb.cn/news/detail-796778.html
到了這里,關(guān)于STM32+HAL庫驅(qū)動ADXL345傳感器(SPI協(xié)議)的文章就介紹完了。如果您還想了解更多內(nèi)容,請?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!