亚洲春色中文字幕久久久-三上亚,一吻二脱三床四吻胸,国产真实伦对白视频全集,在线毛片观看,精品成品入口黄网,国产毛aⅴ片久久久,亚洲AV色香蕉一区二区三区老师,萧皇后A级艳片,色情日本视频更新,99久久亚洲精品日本无码
標題:
基于stm32l452+rt-thread 的adxl355驅動
[打印本頁]
作者:
lgm470895
時間:
2026-4-30 14:37
標題:
基于stm32l452+rt-thread 的adxl355驅動
基于stm32l452+rt-thread 的adxl355驅動,附件是源碼
#include "bsp_adxl355.h"
static struct rt_spi_device *adxl355_spi = RT_NULL;
static uint8_t adxl355_inited = 0;
// Hardware Pin Configuration
#define ADXL355_CS_GPIO_PORT GPIOD
#define ADXL355_CS_GPIO_PIN GPIO_PIN_0
/* SPI Read/Write with NULL pointer protection */
static rt_err_t adxl355_write_reg(uint8_t reg, uint8_t val)
{
if (!adxl355_spi) return RT_ERROR;
uint8_t tx_buf[2] = {(reg<<1) | 0x00, val};
return rt_spi_transfer(adxl355_spi, tx_buf, RT_NULL, 2);
}
static uint8_t adxl355_read_reg(uint8_t reg)
{
if (!adxl355_spi) return 0xFF;
uint8_t tx_buf[2] = {(reg<<1) | 0x1, 0xFF};
uint8_t rx_buf[2] = {0};
rt_spi_transfer(adxl355_spi, tx_buf, rx_buf, 2);
return rx_buf[1];
}
/* Public Functions */
rt_bool_t adxl355_data_ready(void)
{
return (adxl355_read_reg(ADXL355_REG_STATUS) & ADXL355_STATUS_DATA_RDY) ? RT_TRUE : RT_FALSE;
}
void adxl355_read_accel(accel_data_t *data)
{
uint8_t tx[10] = { (ADXL355_REG_XDATA3<<1) | 0x01, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF };
uint8_t rx[10] = {0};
int32_t x, y, z;
if (adxl355_data_ready() == RT_FALSE) {
rt_kprintf("adxl355 not ready\n");
}
rt_spi_transfer(adxl355_spi, tx, rx, 10);
// 合并數據:rx[1]是高8位,rx[2]是中8位,rx[3]是低4位(有效位)
x = ((int32_t)rx[1] << 12) | ((int32_t)rx[2] << 4) | (rx[3] >> 4);
y = ((int32_t)rx[4] << 12) | ((int32_t)rx[5] << 4) | (rx[6] >> 4);
z = ((int32_t)rx[7] << 12) | ((int32_t)rx[8] << 4) | (rx[9] >> 4);
// 符號擴展到 32 位
if (x & 0x80000) x |= 0xFFF00000;
if (y & 0x80000) y |= 0xFFF00000;
if (z & 0x80000) z |= 0xFFF00000;
data->x = (float)x * ADXL355_SCALE_8G; // SCALE_8G = 8.0f / 524288.0f
data->y = (float)y * ADXL355_SCALE_8G;
data->z = (float)z * ADXL355_SCALE_8G;
}
void adxl355_read_temp(temp_data_t *data)
{
uint8_t buf[3] = {0}; // 3字節:地址響應 + TEMP2 + TEMP1
int16_t temp_raw;
if (!adxl355_inited || !data) return;
// 發送寄存器地址(TEMP2,左移一位 + 讀位),然后讀取2字節數據
rt_spi_transfer(adxl355_spi, (uint8_t[]){(ADXL355_REG_TEMP2<<1) | 0x01}, buf, 3);
temp_raw = ((int16_t)buf[1] << 4) | (buf[2] >> 4); // 12位有效數據
// 符號擴展(如果最高位為1)
if (temp_raw & 0x800) temp_raw |= 0xF000;
// 正確轉換:25°C + 原始值 * 0.065 °C/LSB
data->temp = 25.0f + (float)temp_raw * 0.065f;
}
/* Initialization (SPI Mode0, 100kHz, Auto CS) */
rt_err_t adxl355_init(void)
{
rt_err_t ret;
if (adxl355_inited) return RT_EOK;
// Attach SPI device
ret = rt_hw_spi_device_attach(
ADXL355_SPI_BUS_NAME,
ADXL355_SPI_DEVICE_NAME,
ADXL355_CS_GPIO_PORT,
ADXL355_CS_GPIO_PIN
);
if (ret != RT_EOK)
{
rt_kprintf("[ADXL355] SPI device attach failed! Check SPI2 configuration\n");
return ret;
}
// Find SPI device
adxl355_spi = (struct rt_spi_device *)rt_device_find(ADXL355_SPI_DEVICE_NAME);
if (!adxl355_spi)
{
rt_kprintf("[ADXL355] SPI device find failed!\n");
return RT_ERROR;
}
// SPI Configuration (ADXL355 official: Mode0, 100kHz)
struct rt_spi_configuration cfg = {
.mode = RT_SPI_MASTER | RT_SPI_MODE_0 | RT_SPI_MSB,
.data_width = 8,
.max_hz = 5 * 1000 *1000,
};
rt_spi_configure(adxl355_spi, &cfg);
// Soft reset ADXL355
adxl355_write_reg(ADXL355_REG_RESET, 0x52);
rt_thread_mdelay(100);
// Read chip ID
uint8_t devid = adxl355_read_reg(ADXL355_REG_DEVID_AD);
uint8_t partid = adxl355_read_reg(ADXL355_REG_PARTID);
rt_kprintf("[ADXL355] DEVID:0x%02X, PARTID:0x%02X\n", devid, partid);
if (devid != 0xAD || partid != 0xED)
{
rt_kprintf("[ADXL355] Communication failed! Check wiring\n");
return RT_ERROR;
}
// Configure sensor
adxl355_write_reg(ADXL355_REG_RANGE, ADXL355_RANGE_8G);
adxl355_write_reg(ADXL355_REG_POWER_CTL, ADXL355_MODE_MEASUREMENT);
rt_thread_mdelay(50);
adxl355_inited = 1;
rt_kprintf("[ADXL355] Initialization succeeded!\n");
return RT_EOK;
}
/* Test function */
void adxl355_test(void)
{
accel_data_t accel;
temp_data_t temp;
if (adxl355_init() != RT_EOK)
{
rt_kprintf("[ADXL355] Init failed!\n");
return;
}
while (1)
{
if (adxl355_data_ready())
{
adxl355_read_accel(&accel);
adxl355_read_temperature(&temp);
rt_kprintf("X:%.4f g | Y:%.4f g | Z:%.4f g | Temp:%.1f C\n",
accel.x, accel.y, accel.z, temp.temp);
}
rt_thread_mdelay(200);
}
}
復制代碼
adxl355.zip
(3.29 KB, 下載次數: 0)
2026-4-30 14:36 上傳
點擊文件名下載附件
在rt-thread 上穩定運行
下載積分: 黑幣 -5
作者:
joyb
時間:
2026-5-3 09:22
ADXL355是美國ADI公司推出的一款低噪聲、低漂移、低功耗的三軸MEMS加速度計,具備數字輸出和優異的長期穩定性,廣泛應用于精密測量領域。
產品概述與關鍵特性
ADXL355是其模擬輸出版本ADXL354的數字輸出型號,兩者共同構成了一個高性能加速度計系列。其核心優勢在于為精密應用提供了極高的測量穩定性,同時極大減少了校準工作量。具體特性包括:
卓越的穩定性與低噪聲:采用氣密封裝,保證了出色的長期穩定性。所有軸的0g失調漂移最大值僅為0.15 mg/°C,噪聲密度低至22.5μg/√Hz。與消費級加速度計相比,其噪聲和偏置漂移引起的傾斜誤差顯著降低,在25°C恒溫條件下,補償后的傾斜精度可達0.005°。
靈活的測量范圍與數字接口:支持±2g、±4g和±8g三種可選的測量范圍。提供數字SPI和I2C接口,并集成20位ADC、可編程數字濾波器以及數據插值程序,便于系統集成和同步采樣。
低功耗與寬工作范圍:在測量模式下功耗為200μA,待機模式下僅為21μA,非常適合電池供電的無線傳感節點。工作溫度范圍為-40°C至+125°C,供電電壓(使用內部穩壓器)為2.25V至3.6V。
主要應用領域
得益于上述特性,ADXL355在多個需要高精度慣性測量的領域發揮著關鍵作用:
慣性測量單元(IMU)與姿態航向參考系統(AHRS):其低噪聲和低漂移特性,使其在無人機、機器人等平臺的定向和導航系統中表現優異,即使在惡劣環境下也能實現最小的傾斜誤差。
結構健康監測(SHM)與狀態監控:低噪聲使其能夠進行高分辨率振動測量,適用于風輪機塔監控、橋梁、建筑等結構的早期缺陷檢測。
傾斜傳感與平臺穩定:優異的直流穩定性和溫度重復性,使其成為傾角儀和平臺穩定系統的理想選擇。
地震成像與機器人:同樣適用于需要精密運動捕捉和振動分析的應用場景。
獲取與參考資源
您可以訪問ADI公司官方網站查看ADXL355的完整數據手冊、用戶手冊等詳細資料(
www.analog.com/cn/products/adxl355.html
)。
歡迎光臨 (http://www.denmoz.com/bbs/)
Powered by Discuz! X3.1