程序问答   发布时间:2022-06-01  发布网站:大佬教程  code.js-code.com
大佬教程收集整理的这篇文章主要介绍了LIS3DSH x y z 轴不正确大佬教程大佬觉得挺不错的,现在分享给大家,也给大家做个参考。

如何解决LIS3DSH x y z 轴不正确?

开发过程中遇到LIS3DSH x y z 轴不正确的问题如何解决?下面主要结合日常开发的经验,给出你关于LIS3DSH x y z 轴不正确的解决方法建议,希望对你解决LIS3DSH x y z 轴不正确有所启发或帮助;

我曾尝试使用 SPI 协议使用 liS3DSH 传感器。我在 STM32L0 探索套件 LoRa 上应用了程序。但是没有用。

我的问题是 liS3DSH x-y-z 轴输出值无效且值未更改。无论我向哪个方向旋转设备,但我检查 liS3DSH 的 ID 是否正确(0011 1111

组件

  • STM32L0 探索套件 LoRa

  • liS3DSH (https://www.amazon.com/LIS3DSH-High-Resolution-Three-axis-Accelerometer-Triaxial/dp/B07QS5D9K9/ref=sr_1_4?dchild=1&keywords=LIS3DSH&qid=1615701212&sr=8-4)

初始化 SPI2

...

@H_607_22@voID HW_SPI2_Init(voID) { /*##-1- Configure the SPI2 peripheral */ /* Set the SPI parameters */ hspi2.Instance = SPI2; hspi2.Init.baudratePrescaler = SpiFrequency(10000000); hspi2.Init.Direction = SPI_DIRECTION_2lines; hspi2.Init.Mode = SPI_MODE_MASTER; hspi2.Init.CLKPolarity = SPI_PolARITY_LOW; // CPol = 0 hspi2.Init.CLKPhase = SPI_PHASE_2EDGE; // CPHA = 1 // hspi2.Init.CLKPhase = SPI_PHASE_1EDGE; // CPHA = 0 hspi2.Init.DataSize = SPI_DATASIZE_8BIT; // hspi2.Init.DataSize = SPI_DATASIZE_16BIT; hspi2.Init.CRCCalculation = SPI_CRCCALculaTION_disABLE; hspi2.Init.FirstBit = SPI_FirsTBIT_MSB; hspi2.Init.NSS = SPI_NSS_SOFT; hspi2.Init.TIMode = SPI_TIMODE_disABLE; hspi2.Init.CRCpolynomial = 10; SPI2_CLK_ENABLE(); // Enable clock for SPI 2 if (HAL_SPi_init(&hspi2) != HAL_OK) { /* Initialization Error */ Error_Handler(); } /*##-2- Configure the SPI GPIOs */ HW_SPI2_IoInit(); }

...

初始化 liS3DSH

@H_607_22@voID HW_SPI2_IoInit(voID) { GPIO_InitTypeDef initStruct = {0}; initStruct.Mode = GPIO_MODE_AF_PP; initStruct.Pull = GPIO_PulLUP ; initStruct.Speed = GPIO_SPEED_FAST; initStruct.Alternate = SPI2_AF; HW_GPIO_Init(liS3DH_SCLK_PORT,liS3DH_SCLK_PIN,&initStruct); HW_GPIO_Init(liS3DH_MISO_PORT,liS3DH_MISO_PIN,&initStruct); HW_GPIO_Init(liS3DH_MOSI_PORT,liS3DH_MOSI_PIN,&initStruct); initStruct.Mode = GPIO_MODE_OUTPUT_PP; initStruct.Pull = GPIO_nopulL; HW_GPIO_Init(liS3DH_NSS_PORT,liS3DH_NSS_PIN,&initStruct); HW_GPIO_Write(liS3DH_NSS_PORT,1); }

CS 开启或关闭

@H_607_22@voID HW_SPI2_CS_ON (voID) { HW_GPIO_Write(liS3DH_NSS_PORT,0); } voID HW_SPI2_CS_OFF (voID) { HW_GPIO_Write(liS3DH_NSS_PORT,1); }

读取 ID

@H_607_22@uint8_t liS3DSH_DH_checK_ID (voID) { uint8_t addr = liS3Dx_WHO_AM_I_ADDR | liS3Dx_READ; HW_SPI2_CS_ON(); HW_SPI2_SPI_1byte_Write_and_Read(addr); HW_SPI2_CS_OFF(); UsingTypeint_liS3DSH_DH.ID = au8BufferRead_SPI2[0]; return UsingTypeint_liS3DSH_DH.ID; }

读取 X 轴(仅)(不正确)

@H_607_22@voID liS3DSH_DH_GET_XYZ (voID) { uint8_t addr = liS3Dx_OUT_X_L_ADDR | liS3Dx_READ ; HW_SPI2_CS_ON(); HW_SPI2_SPI_1byte_Write_and_Read(addr); HW_SPI2_CS_OFF(); addr = liS3Dx_OUT_X_H_ADDR | liS3Dx_READ ; HW_SPI2_CS_ON(); HW_SPI2_SPI_1byte_Write_and_Read(addr); HW_SPI2_CS_OFF(); }

HW_SPI2_1byte_Write_and_Read

@H_607_22@bool HW_SPI2_SPI_1byte_Write_and_Read(uint8_t u8Address) { if(HAL_SPI_Transmit(&hspi2,(uint8_t *)&u8Address,1,HAL_MAX_DELAY) == HAL_OK){ if(HAL_SPI_Receive(&hspi2,(uint8_t *)&au8BufferRead_SPI2[0],HAL_MAX_DELAY) == HAL_OK){ return true; } } return false; }

信号

output X L

output X H

解决方法

不确定您是否在使用状态机并准确注册 LIS3DSH 的访问。

作为参请参阅 https://github.com/STMicroelectronics/stm32-lis3dsh/blob/main/lis3dsh.h 中的寄存器映射(从第 95 行开始)和 https://github.com/STMicroelectronics/stm32-lis3dsh/blob/main/lis3dsh.c 中的代码

实际读写SPI总线的函数是void ACCELERO_IO_Write(uint8_t *pBuffer,uint8_t WriteAddr,uint16_t numbyteToWritE)void ACCELERO_IO_Read(uint8_t *pBuffer,uint8_t ReadAddr,uint16_t numbyteToRead)

这在 https://documentation.Help/STM32F4-Discovery-BSP/stm32f4__discovery_8c_source.html 中的第 560 和 594 行定义

void ACCELERO_IO_Write(uint8_t *pBuffer,uint16_t numbyteToWritE) 中,实际的 SPI 写入在第 574 至 582 行完成

@H_607_22@00574 SPIx_WriteRead(WriteAddr); 00577 while(numbyteToWrite >= 0x01) 00578 { 00579 SPIx_WriteRead(*pBuffer); 00580 numbyteToWrite--; 00581 pBuffer++; 00582 }

(和往常一样,SPI 先激活寄存器,然后写入数据...)

SPIx_WriteRead(WriteAddr); 中,WriteAddr 取自 https://github.com/STMicroelectronics/stm32-lis3dsh/blob/main/lis3dsh.h 中的寄存器映射,从第 9 行开始

(上面STM为LIS3DSH编写的代码很好,这个实现非常干净和结构化)

LIS3DSH 的数据表在 https://www.st.com/resource/en/datasheet/lis3dsh.pdf 中,参手册更详细,在 https://www.st.com/resource/en/application_note/dm00026768-lis3dsh-3axis-digital-output-accelerometer-stmicroelectronics.pdf 中还包括状态机的解释,必须在设备工作前进行配置

大佬总结

以上是大佬教程为你收集整理的LIS3DSH x y z 轴不正确全部内容,希望文章能够帮你解决LIS3DSH x y z 轴不正确所遇到的程序开发问题。

如果觉得大佬教程网站内容还不错,欢迎将大佬教程推荐给程序员好友。

本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。
标签:xyz