OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 7824|回复: 1

基于STM32CUBEIDE 开发LSM6DSL高效率6轴陀螺仪

[复制链接]

53

主题

567

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
2099
金钱
2099
注册时间
2017-2-11
在线时间
306 小时
发表于 2020-12-14 16:30:32 | 显示全部楼层 |阅读模式
本帖最后由 jiangyy 于 2021-3-25 13:28 编辑

企业微信截图_1607933246701.img.png

  STMicro 的 LSM6DSL 和 LSM6DSM 采用创新型电源管理技术、增强型陀螺仪设计,且具有高效的数据批处理能力。相比目前最新的 LSM6DS3 和 LSM6DS3H 器件,这些器件的功耗减少多达 50%。 符合最常见的创新型操作系统要求,可帮助开发人员实现常见移动平台的个性化和省电功能的价值最大化。 这些运动检测器件已获得 Google Daydream 和 Tango 认证,并支持 android 移动产品上身临其境的虚拟和增强现实技术。
此外,最新型传感器通过提高升压陀螺仪精度来支持增强型用户体验,如光学防抖 (OIS)、视觉定位检测和手势识别,而且还集成了加速计驱动型步伐检测、步伐计数和计步器,以及倾斜和大幅度运动检测,从而减轻手持式设备和应用开发人员的工作。
在这两个模块中,LSM6DSM 针对摄像头 OIS 采用了专门的附加处理和串行端口。 陀螺仪的噪声降低了 40% 并采用了可配置率滤波器,这两个特性使现有器件 (LSM6DS3H).的摄像头 OIS 性能得以提升。 相比使用分立式 OIS 传感器的解决方案,LSM6DSM 不仅元件少,占据板空间小,而且功耗不到替代性设计的 1/6。

特性
  • 3 轴加速计:具有 ±2 g、±4 g、±8 g、±16g 满量程范围
  • 3 轴 MEMS 陀螺仪:±125 dps、±245 dps、±500 dps、±1000dps 和 ±2000 dps
  • 工作电流:0.4 mA(正常组合模式):0.65 mA(高性能组合模式)
  • 封装:2.5 mm x 3.0 mm x 0.83 mm、LGA-14
  • 模拟电源电压范围:1.71 V 至 3.6 V
  • 具有批采集功能的智能化 FIFO,可达 4 KB
  • 地磁传感器用于外部磁传感器纠正的软、硬熨平

  基于STM32CUBEIDE,开发此陀螺仪,基本已调试完成,分享代码如下:
  一、IIC底层驱动
  1.头文件
  1. /*
  2. * bsp_i2c4.h
  3. *
  4. *  Created on: Dec 13, 2020
  5. *      Author: jiangyuanyuan
  6. */

  7. #ifndef INC_BSP_I2C4_H_
  8. #define INC_BSP_I2C4_H_

  9. #include "gpio.h"
  10. #include "bsp_delay.h"

  11. //IO方向设置

  12. #define I2C_4_SDA_IN()                          {GPIOD->MODER&=~(3<<(13*2));GPIOD->MODER|=0<<13*2;}        //PD13输入模式
  13. #define I2C_4_SDA_OUT()                         {GPIOD->MODER&=~(3<<(13*2));GPIOD->MODER|=1<<13*2;}         //PD13输出模式

  14. //IO操作
  15. #define I2C_4_SCL(n)                                   (n?HAL_GPIO_WritePin(GPIOD,GPIO_PIN_12,GPIO_PIN_SET):HAL_GPIO_WritePin(GPIOD,GPIO_PIN_12,GPIO_PIN_RESET))//SCL
  16. #define I2C_4_SDA(n)                                  (n?HAL_GPIO_WritePin(GPIOD,GPIO_PIN_13,GPIO_PIN_SET):HAL_GPIO_WritePin(GPIOD,GPIO_PIN_13,GPIO_PIN_RESET))//SDA
  17. #define I2C_4_READ_SDA                          HAL_GPIO_ReadPin(GPIOD,GPIO_PIN_13)//输入SDA

  18. //I2C_4所有操作函数
  19. void I2C_4_Init(void);                                                                //初始化IIC的IO口
  20. void I2C_4_Start(void);                                                                //发送IIC开始信号
  21. void I2C_4_Stop(void);                                                                        //发送IIC停止信号
  22. void I2C_4_Send_Byte(uint8_t txd);                                    //IIC发送一个字节
  23. uint8_t I2C_4_Read_Byte(uint8_t ack);                                //IIC读取一个字节
  24. uint8_t I2C_4_Wait_Ack(void);                                                       //IIC等待ACK信号
  25. void I2C_4_Ack(void);                                                                               //IIC发送ACK信号
  26. void I2C_4_NAck(void);                                                                //IIC不发送ACK信号

  27. void I2C_4_Write_One_Byte(uint8_t daddr,uint8_t addr,uint8_t data);
  28. uint8_t I2C_4_Read_One_Byte(uint8_t daddr,uint8_t addr);


  29. #endif /* INC_BSP_I2C4_H_ */
复制代码
2.C文件
  1. /*
  2. * bsp_i2c4.c
  3. *
  4. *  Created on: Dec 13, 2020
  5. *      Author: jiangyuanyuan
  6. */

  7. #include "bsp_i2c4.h"

  8. //产生I2C_4起始信号
  9. void I2C_4_Start(void)
  10. {
  11.         I2C_4_SDA_OUT();     //sda线输出
  12.         I2C_4_SDA(1);
  13.         I2C_4_SCL(1);
  14.         delay_us(4);//4
  15.          I2C_4_SDA(0);//START:when CLK is high,DATA change form high to low
  16.         delay_us(4);//4
  17.         I2C_4_SCL(0);//钳住I2C总线,准备发送或接收数据
  18. }

  19. //产生I2C_4停止信号
  20. void I2C_4_Stop(void)
  21. {
  22.         I2C_4_SDA_OUT();//sda线输出
  23.         I2C_4_SCL(0);
  24.         I2C_4_SDA(0);//STOP:when CLK is high DATA change form low to high
  25.          delay_us(4);//4
  26.         I2C_4_SCL(1);
  27.         I2C_4_SDA(1);//发送I2C总线结束信号
  28.         delay_us(4);//4
  29. }

  30. //等待应答信号到来
  31. //返回值:1,接收应答失败
  32. //        0,接收应答成功
  33. uint8_t I2C_4_Wait_Ack(void)
  34. {
  35.         uint8_t ucErrTime=0;
  36.         I2C_4_SDA_IN();      //SDA设置为输入
  37.         I2C_4_SDA(1);
  38.         delay_us(5);//5
  39.         I2C_4_SCL(1);
  40.         delay_us(5);//5
  41.         while(I2C_4_READ_SDA)                                   //PBin7
  42.         {
  43.                 ucErrTime++;
  44.                 if(ucErrTime>250)
  45.                 {
  46.                         I2C_4_Stop();
  47.                         return 1;
  48.                 }
  49.         }
  50.         I2C_4_SCL(0);//时钟输出0
  51.         return 0;
  52. }

  53. //产生ACK应答
  54. void I2C_4_Ack(void)
  55. {
  56.         I2C_4_SCL(0);
  57.         I2C_4_SDA_OUT();
  58.         I2C_4_SDA(0);
  59.         delay_us(2);//2
  60.         I2C_4_SCL(1);
  61.         delay_us(2);//2
  62.         I2C_4_SCL(0);
  63. }

  64. //不产生ACK应答
  65. void I2C_4_NAck(void)
  66. {
  67.         I2C_4_SCL(0);
  68.         I2C_4_SDA_OUT();
  69.         I2C_4_SDA(1);
  70.         delay_us(2);//2
  71.         I2C_4_SCL(1);
  72.         delay_us(2);//2
  73.         I2C_4_SCL(0);
  74. }

  75. //I2C_4发送一个字节
  76. //返回从机有无应答
  77. //1,有应答
  78. //0,无应答
  79. void I2C_4_Send_Byte(uint8_t txd)
  80. {
  81.     uint8_t t;
  82.     I2C_4_SDA_OUT();
  83.     I2C_4_SCL(0);//拉低时钟开始数据传输
  84.     for(t=0;t<8;t++)
  85.     {
  86.         //I2C_4_SDA=(txd&0x80)>>7;
  87.                 if((txd&0x80)>>7)
  88.                         I2C_4_SDA(1);
  89.                 else
  90.                         I2C_4_SDA(0);
  91.                 txd<<=1;
  92.                 delay_us(1);
  93.                 I2C_4_SCL(1);
  94.                 delay_us(1);
  95.                 I2C_4_SCL(0);
  96.                 delay_us(1);
  97.     }
  98. }

  99. //读1个字节,ack=1时,发送ACK,ack=0,发送nACK
  100. uint8_t I2C_4_Read_Byte(uint8_t ack)
  101. {
  102.         unsigned char i,receive=0;
  103.         I2C_4_SDA_IN();         //SDA设置为输入
  104.         for(i=0;i<8;i++ )
  105.         {
  106.                 I2C_4_SCL(0);
  107.                 delay_us(2);
  108.                 I2C_4_SCL(1);
  109.                 receive<<=1;
  110.                 if(I2C_4_READ_SDA)
  111.                         receive++;
  112.                 delay_us(1);
  113.         }
  114.         if (!ack)
  115.                 I2C_4_NAck();//发送nACK
  116.         else
  117.                 I2C_4_Ack(); //发送ACK
  118.         return receive;
  119. }
复制代码
二、ISM6DSL应用层
  1.头文件

  1. /*
  2. * bsp_lsm6dsl.h
  3. *
  4. *  Created on: Dec 13, 2020
  5. *      Author: jiangyuanyuan
  6. */

  7. #ifndef INC_BSP_LSM6DSL_H_
  8. #define INC_BSP_LSM6DSL_H_
  9. #include "stdio.h"
  10. #include "bsp_i2c4.h"
  11. #include "bsp_lcd.h"

  12. #define SENSITIVITY_LIS3MDL_16Ga     1711.0              //LSB/Ga

  13. /* I2C Addresses */
  14. #define ACC_GYRO_ADDRESS                     0xD6

  15. /* sensor output data */
  16. #define LSM6DSL_OUTX_L_G                          0X22
  17. #define LSM6DSL_OUTX_H_G                          0X23
  18. #define LSM6DSL_OUTY_L_G                          0X24
  19. #define LSM6DSL_OUTY_H_G                          0X25
  20. #define LSM6DSL_OUTZ_L_G                          0X26
  21. #define LSM6DSL_OUTZ_H_G                          0X27

  22. #define LSM6DSL_OUTX_L_XL                          0X28
  23. #define LSM6DSL_OUTX_H_XL                          0X29
  24. #define LSM6DSL_OUTY_L_XL                          0X2A
  25. #define LSM6DSL_OUTY_H_XL                          0X2B
  26. #define LSM6DSL_OUTZ_L_XL                          0X2C
  27. #define LSM6DSL_OUTZ_H_XL                          0X2D
  28. /* sensor control reg */
  29. #define LSM6DSL_CTRL1_XL                                    0X10

  30. #define LSM6DSL_CTRL2_G                                    0X11
  31. #define LSM6DSL_CTRL3_C                                    0X12
  32. #define LSM6DSL_CTRL4_C                                    0X13
  33. #define LSM6DSL_CTRL5_C                                    0X14
  34. #define LSM6DSL_CTRL6_G                                    0X15
  35. #define LSM6DSL_CTRL7_G                                    0X16
  36. #define LSM6DSL_CTRL8_XL                                  0X17
  37. #define LSM6DSL_CTRL9_XL                                  0X18
  38. #define LSM6DSL_CTRL10_C                                  0X19
  39. #define LSM6DSL_INT1_CTRL                          0X0D
  40. #define LSM6DSL_INT2_CTRL                          0X0E
  41. #define LSM6DSL_WHO_AM_I                        0x0F    //get id


  42. #define LSM6DSL_SENSORHUB1_REG                  0X2E
  43. #define LSM6DSL_SENSORHUB2_REG                  0X2F
  44. #define LSM6DSL_SENSORHUB3_REG                  0X30
  45. #define LSM6DSL_SENSORHUB4_REG                  0X31
  46. #define LSM6DSL_SENSORHUB5_REG                  0X32
  47. #define LSM6DSL_SENSORHUB6_REG                  0X33
  48. #define LSM6DSL_SENSORHUB7_REG                  0X34
  49. #define LSM6DSL_SENSORHUB8_REG                  0X35
  50. #define LSM6DSL_SENSORHUB9_REG                  0X36
  51. #define LSM6DSL_SENSORHUB10_REG                  0X37
  52. #define LSM6DSL_SENSORHUB11_REG                  0X38
  53. #define LSM6DSL_SENSORHUB12_REG                  0X39
  54. #define LSM6DSL_FIFO_STATUS1                                  0X3A
  55. #define LSM6DSL_FIFO_STATUS2                                  0X3B
  56. #define LSM6DSL_FIFO_STATUS3                                  0X3C
  57. #define LSM6DSL_FIFO_STATUS4                                  0X3D
  58. #define LSM6DSL_FIFO_DATA_OUT_L                      0X3E
  59. #define LSM6DSL_FIFO_DATA_OUT_H                  0X3F
  60. #define LSM6DSL_TIMESTAMP0_REG                  0X40
  61. #define LSM6DSL_TIMESTAMP1_REG                  0X41
  62. #define LSM6DSL_TIMESTAMP2_REG                  0X42
  63. #define LSM6DSL_STEP_TIMESTAMP_L                  0X49
  64. #define LSM6DSL_STEP_TIMESTAMP_H                  0X4A
  65. #define LSM6DSL_STEP_COUNTER_L                          0X4B
  66. #define LSM6DSL_STEP_COUNTER_H                  0X4C
  67. #define LSM6DSL_SENSORHUB13_REG                  0X4D
  68. #define LSM6DSL_SENSORHUB14_REG                  0X4E
  69. #define LSM6DSL_SENSORHUB15_REG                  0X4F
  70. #define LSM6DSL_SENSORHUB16_REG                  0X50
  71. #define LSM6DSL_SENSORHUB17_REG                  0X51
  72. #define LSM6DSL_SENSORHUB18_REG                  0X52
  73. #define LSM6DSL_FUNC_SRC1                                          0X53
  74. #define LSM6DSL_FUNC_SRC2                                          0X54
  75. #define LSM6DSL_TAP_CFG                                                  0X58
  76. #define LSM6DSL_TAP_THS_6D                                          0X59
  77. #define LSM6DSL_INT_DUR2                                          0X5A
  78. #define LSM6DSL_WAKE_UP_THS                                  0X5B
  79. #define LSM6DSL_WAKE_UP_DUR                                  0X5C
  80. #define LSM6DSL_FREE_FALL                                          0X5D
  81. #define LSM6DSL_MD1_CFG                                                  0X5E
  82. #define LSM6DSL_MD2_CFG                                                  0X5F

  83. /************** Access Device RAM  *******************/
  84. #define LSM6DSL_MASTER_CMD_CODE                                          0X60
  85. #define LSM6DSL_SENS_SYNC_SPI_ERROR_CODE                  0X61

  86. /************** Embedded functions register mapping  *******************/
  87. #define LSM6DSL_OUT_MAG_RAW_X_L               0x66
  88. #define LSM6DSL_OUT_MAG_RAW_X_H              0x67
  89. #define LSM6DSL_OUT_MAG_RAW_Y_L               0x68
  90. #define LSM6DSL_OUT_MAG_RAW_Y_H              0x69
  91. #define LSM6DSL_OUT_MAG_RAW_Z_L               0x6A
  92. #define LSM6DSL_OUT_MAG_RAW_Z_H              0x6B
  93. #define LSM6DSL_X_OFS_USR                                      0x73
  94. #define LSM6DSL_Y_OFS_USR                                      0x74
  95. #define LSM6DSL_Z_OFS_USR                                       0x75

  96. #define LSM6DSL_STATUS_REG                   0x1E

  97. /*******************************************************************************
  98. * Register      : CTRL1_XL
  99. * Address       : 0X10
  100. * Bit Group Name: FS_XL
  101. * Permission    : RW
  102. *******************************************************************************/
  103. typedef enum {
  104.         LSM6DSL_FS_XL_2g                  = 0x00,
  105.         LSM6DSL_FS_XL_16g                   = 0x04,
  106.         LSM6DSL_FS_XL_4g                  = 0x08,
  107.         LSM6DSL_FS_XL_8g                  = 0x0C,
  108. } LSM6DSL_FS_XL_t;
  109. /*******************************************************************************
  110. * Register      : CTRL1_XL
  111. * Address       : 0X10
  112. * Bit Group Name: ODR_XL
  113. * Permission    : RW
  114. *******************************************************************************/
  115. typedef enum {
  116.         LSM6DSL_ODR_XL_POWER_DOWN                  = 0x00,
  117.         LSM6DSL_ODR_XL_13Hz                        = 0x10,
  118.         LSM6DSL_ODR_XL_26Hz                        = 0x20,
  119.         LSM6DSL_ODR_XL_52Hz                        = 0x30,
  120.         LSM6DSL_ODR_XL_104Hz                          = 0x40,
  121.         LSM6DSL_ODR_XL_208Hz                          = 0x50,
  122.         LSM6DSL_ODR_XL_416Hz                          = 0x60,
  123.         LSM6DSL_ODR_XL_833Hz                          = 0x70,
  124.         LSM6DSL_ODR_XL_1660Hz                         = 0x80,
  125.         LSM6DSL_ODR_XL_3330Hz                          = 0x90,
  126.         LSM6DSL_ODR_XL_6660Hz                          = 0xA0,
  127.         LSM6DSL_ODR_XL_13330Hz                  = 0xB0,
  128. } LSM6DSL_ODR_XL_t;

  129. /*select io device*/
  130. typedef enum
  131. {
  132.   USE_SPI = 0,
  133.   USE_I2C = 1
  134. }io_device;

  135. void Lsm_Init_iic(void);
  136. void Lsm_Get_Rawacc(void);
  137. void Lsm_Get_Rawgryo(void);
  138. #endif /* INC_BSP_LSM6DSL_H_ */
复制代码

  2.C文件

  1. /*
  2. * bsp_lsm6dsl.c
  3. *
  4. *  Created on: Dec 13, 2020
  5. *      Author: jiangyuanyuan
  6. */

  7. #include "bsp_lsm6dsl.h"

  8. void LSM_WriteOneByte(uint8_t Add,uint8_t WriteAddr,uint8_t DataToWrite)     //I2C_4从指定地址写入一个字节
  9. {
  10.         I2C_4_Start();
  11.         I2C_4_Send_Byte(Add);                                      //发送I2C_4地址
  12.         I2C_4_Wait_Ack();
  13.         I2C_4_Send_Byte(WriteAddr);                             //发送地址
  14.         I2C_4_Wait_Ack();
  15.         I2C_4_Send_Byte(DataToWrite);                           //发送字节
  16.         I2C_4_Wait_Ack();
  17.         I2C_4_Stop();                                           //产生一个停止条件
  18. }

  19. uint8_t LSM_ReadOneByte(uint8_t Add,uint8_t ReadAddr)                  //I2C_4从指定地址读取一个字节
  20. {
  21.         uint8_t temp=0;
  22.         I2C_4_Start();
  23.         I2C_4_Send_Byte(Add);                                     //发送I2C_4地址
  24.         I2C_4_Wait_Ack();
  25.         I2C_4_Send_Byte(ReadAddr);                             //发送地址
  26.         I2C_4_Wait_Ack();
  27.         I2C_4_Start();
  28.         I2C_4_Send_Byte(Add+1);                           //进入接收模式
  29.         I2C_4_Wait_Ack();
  30.         temp=I2C_4_Read_Byte(0);
  31.         I2C_4_Stop();                                           //产生一个停止条件
  32.         return temp;
  33. }

  34. uint8_t LSM_Write(uint8_t Add,uint8_t WriteAddr,uint8_t *pBuffer,uint8_t NumToWrite)//在指定的地址里面写入LSM的指定个数据
  35. {
  36.         uint8_t i;
  37.         I2C_4_Start();
  38.         I2C_4_Send_Byte(Add<<1);                                      //发送I2C_4地址
  39.         I2C_4_Wait_Ack();
  40.         I2C_4_Send_Byte(WriteAddr);                             //发送地址
  41.         I2C_4_Wait_Ack();
  42.         for(i=0;i<NumToWrite;i++)
  43.         {
  44.         I2C_4_Send_Byte(*(pBuffer+1));
  45.                 if(I2C_4_Wait_Ack()==0)
  46.                 {
  47.                         I2C_4_Stop();
  48.                         return 0;
  49.                 }
  50.         }
  51.         I2C_4_Stop();
  52.         return 1;
  53. }

  54. void LSM_Read(uint8_t Add,uint8_t ReadAddr,uint8_t *pBuffer,uint8_t NumToRead)   //在LSM里面的指定地址开始读出指定个数的数据
  55. {
  56.         uint8_t i;
  57.         I2C_4_Start();
  58.         I2C_4_Send_Byte(Add<<1);                                                      //发送I2C_4地址
  59.         I2C_4_Wait_Ack();
  60.         I2C_4_Send_Byte(ReadAddr);                                             //发送地址
  61.         I2C_4_Wait_Ack();

  62.         I2C_4_Start();
  63.         I2C_4_Send_Byte((Add<<1)+1);                                      //发送I2C_4地址
  64.         I2C_4_Wait_Ack();
  65.         for(i=0;i<NumToRead-1;i++)
  66.         {
  67.                 pBuffer[i]=I2C_4_Read_Byte(1);                             //不发送应答
  68.         }
  69.           pBuffer[i]=I2C_4_Read_Byte(0);                               //发送应答
  70. }

  71. float calcAccel(int16_t input)
  72. {
  73.         uint16_t accelRange = 2;
  74.         float output = (float)input * 0.061 * (accelRange >> 1) / 1000;
  75.         return output;
  76. }

  77. /***************************************USE IIC MODEL************************************/

  78. void Lsm_Init_iic(void)                                                                             //IIC协议
  79. {
  80. //        while(LSM_ReadOneByte(ACC_GYRO_ADDRESS,LSM6DSL_WHO_AM_I)!=0x6A);                       //检查ID是否存在
  81.         LSM_WriteOneByte(ACC_GYRO_ADDRESS,LSM6DSL_CTRL2_G,0X1C);                                             //陀螺仪12.5hz,2000dps
  82.         LSM_WriteOneByte(ACC_GYRO_ADDRESS,LSM6DSL_CTRL10_C,0x38);                                       //使能陀螺仪X,Y,Z轴

  83.         //唤醒中断寄存器配置
  84.         LSM_WriteOneByte(ACC_GYRO_ADDRESS,LSM6DSL_CTRL1_XL,0x60);
  85.         LSM_WriteOneByte(ACC_GYRO_ADDRESS,LSM6DSL_TAP_CFG,0x90);
  86.         LSM_WriteOneByte(ACC_GYRO_ADDRESS,LSM6DSL_WAKE_UP_DUR,0x00);
  87.         LSM_WriteOneByte(ACC_GYRO_ADDRESS,LSM6DSL_WAKE_UP_THS,0x02);
  88.         LSM_WriteOneByte(ACC_GYRO_ADDRESS,LSM6DSL_MD1_CFG,0x20);
  89.         //6D Orientation Configuration   根据需求自行添加  (正反面值有差异)
  90.         LSM_WriteOneByte(ACC_GYRO_ADDRESS,LSM6DSL_TAP_THS_6D,0x40);
  91.         LSM_WriteOneByte(ACC_GYRO_ADDRESS,LSM6DSL_CTRL8_XL,0x01);
  92. }

  93. short ax,ay,az;
  94. float Ax,Ay,Az;
  95. //获取加速度值
  96. void Lsm_Get_Rawacc(void)
  97. {
  98.         char ucBuff[20] = {'\0'};
  99. //        short ax,ay,az;
  100.         uint8_t buf[6];
  101.         if((LSM_ReadOneByte(ACC_GYRO_ADDRESS,LSM6DSL_STATUS_REG)&0x01)!=0)                              //有数据生成
  102.         {
  103.                 buf[0]= LSM_ReadOneByte(ACC_GYRO_ADDRESS,LSM6DSL_OUTX_H_XL);
  104.                 buf[1]= LSM_ReadOneByte(ACC_GYRO_ADDRESS,LSM6DSL_OUTX_L_XL);
  105.                 buf[2]= LSM_ReadOneByte(ACC_GYRO_ADDRESS,LSM6DSL_OUTY_H_XL);
  106.                 buf[3]= LSM_ReadOneByte(ACC_GYRO_ADDRESS,LSM6DSL_OUTY_L_XL);
  107.                 buf[4]= LSM_ReadOneByte(ACC_GYRO_ADDRESS,LSM6DSL_OUTZ_H_XL);
  108.                 buf[5]= LSM_ReadOneByte(ACC_GYRO_ADDRESS,LSM6DSL_OUTZ_L_XL);
  109.                 ax=(buf[0]<<8)|buf[1];
  110.                 ay=(buf[2]<<8)|buf[3];
  111.                 az=(buf[4]<<8)|buf[5];
  112.                 delay_ms(20);
  113.         }
  114.         Ax = ax/SENSITIVITY_LIS3MDL_16Ga;
  115.         memset(ucBuff, '\0', sizeof(ucBuff));
  116.     sprintf(ucBuff,"Ax:%.2f",Ax);
  117.     LCD_ShowString(0, 130, 240, 12, 12, ucBuff);
  118.     memset(ucBuff, '\0', sizeof(ucBuff));
  119.     Ay = ay/SENSITIVITY_LIS3MDL_16Ga;
  120.     sprintf(ucBuff,"Ay:%.2f",Ay);
  121.     LCD_ShowString(0, 142, 240, 12, 12, ucBuff);
  122.     memset(ucBuff, '\0', sizeof(ucBuff));
  123.     Az = az/SENSITIVITY_LIS3MDL_16Ga;
  124.     sprintf(ucBuff,"Az:%.2f",Az);
  125.     LCD_ShowString(0, 154, 240, 12, 12, ucBuff);
  126. }

  127. short gx,gy,gz;
  128. //获取陀螺仪值
  129. void Lsm_Get_Rawgryo(void)
  130. {
  131.         char ucBuff[20] = {'\0'};
  132. //        short gx,gy,gz;
  133.         uint8_t buf[6];
  134.         if((LSM_ReadOneByte(ACC_GYRO_ADDRESS,LSM6DSL_STATUS_REG)&0x02)!=0)                              //有数据生成
  135.         {
  136.                 buf[0]= LSM_ReadOneByte(ACC_GYRO_ADDRESS,LSM6DSL_OUTX_H_G);
  137.                 buf[1]= LSM_ReadOneByte(ACC_GYRO_ADDRESS,LSM6DSL_OUTX_L_G);
  138.                 buf[2]= LSM_ReadOneByte(ACC_GYRO_ADDRESS,LSM6DSL_OUTY_H_G);
  139.                 buf[3]= LSM_ReadOneByte(ACC_GYRO_ADDRESS,LSM6DSL_OUTY_L_G);
  140.                 buf[4]= LSM_ReadOneByte(ACC_GYRO_ADDRESS,LSM6DSL_OUTZ_H_G);
  141.                 buf[5]= LSM_ReadOneByte(ACC_GYRO_ADDRESS,LSM6DSL_OUTZ_L_G);
  142.                 gx=(buf[0]<<8)|buf[1];
  143.                 gy=(buf[2]<<8)|buf[3];
  144.                 gz=(buf[4]<<8)|buf[5];
  145.                 delay_ms(20);
  146.         }
  147.         memset(ucBuff, '\0', sizeof(ucBuff));
  148.     sprintf(ucBuff,"gx:%10d",gx);
  149.     LCD_ShowString(0, 166, 240, 12, 12, ucBuff);
  150.     memset(ucBuff, '\0', sizeof(ucBuff));
  151.     sprintf(ucBuff,"gy:%10d",gy);
  152.     LCD_ShowString(0, 178, 240, 12, 12, ucBuff);
  153.     memset(ucBuff, '\0', sizeof(ucBuff));
  154.     sprintf(ucBuff,"gz:%10d",gz);
  155.     LCD_ShowString(0, 190, 240, 12, 12, ucBuff);
  156. }
复制代码
3.main.c文件
  1. int main(void)
  2. {
  3.   /* USER CODE BEGIN 1 */

  4.   /* USER CODE END 1 */

  5.   /* MCU Configuration--------------------------------------------------------*/

  6.   /* Reset of all peripherals, Initializes the Flash interface and the Systick. */
  7.   HAL_Init();

  8.   /* USER CODE BEGIN Init */

  9.   /* USER CODE END Init */

  10.   /* Configure the system clock */
  11.   SystemClock_Config();

  12.   /* USER CODE BEGIN SysInit */
  13.   delay_init();
  14.   /* USER CODE END SysInit */

  15.   /* Initialize all configured peripherals */
  16.   MX_GPIO_Init();
  17.   MX_RTC_Init();
  18.   MX_SDMMC1_SD_Init();
  19.   MX_FATFS_Init();
  20.   MX_TIM2_Init();
  21.   MX_SPI1_Init();
  22.   MX_RNG_Init();
  23.   /* USER CODE BEGIN 2 */
  24.   HAL_TIM_Base_Start_IT(&htim2);
  25.   /* USER CODE END 2 */

  26.   /* Infinite loop */
  27.   /* USER CODE BEGIN WHILE */
  28.   LCD_Init();
  29.   SD_Auto_NewFolder();
  30.   Lsm_Init_iic();
  31.   LCD_Clear(GREEN);
  32.   POINT_COLOR = RED;
  33.   BACK_COLOR = GREEN;
  34.   LCD_ShowString(0, 0, 240, 32, 32, "Jaymie");
  35.   LCD_ShowString(0, 40, 240, 24, 24, "Welcome to MAX");
  36.   while (1)
  37.   {

  38.     /* USER CODE END WHILE */

  39.     /* USER CODE BEGIN 3 */
  40.     Display_Date_Time();
  41.         MRTC_Get();
  42.         Lsm_Get_Rawacc();
  43.         Lsm_Get_Rawgryo();
  44.   }
  45.   /* USER CODE END 3 */
  46. }
复制代码

  三、仿真结果
   微信截图_20201214162449.jpg

  四、实物图显示
   微信截图_20201214162836.jpg

  另外,有点小问题,就是精度的问题,后期有哪位小伙伴,可以参照我的代码优化一下,分享在这里。喜欢的朋友,点个赞。




正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

0

主题

2

帖子

0

精华

新手入门

积分
4
金钱
4
注册时间
2022-4-8
在线时间
1 小时
发表于 2022-4-8 10:37:27 | 显示全部楼层

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-2-25 21:15

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

快速回复 返回顶部 返回列表