你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

基于STM32驱动GY85-IMU模块

[复制链接]
攻城狮Melo 发布时间:2023-3-17 21:33
GY85是一个惯性测量模块,内部集成了三轴加速度计、三轴陀螺仪、电子罗盘、气压传感器等芯片,用于测量和报告设备速度、方向、重力,模块可以将加速度计、陀螺仪、电子罗盘等传感器的数据进行综合,在上位机可以结合各种数据进行惯导算法融合。
这里介绍一下STM32驱动GY85的代码,模块与STM32的通信接口是IIC协议,我们采用软件IO口模拟IIC时序进行通信,读取到各个芯片的数据存放在全局变量,关于GY85的介绍以及一些基础知识可以参考这篇博客:点击跳转

芯片说明:
ADXL345:三轴加速度计,测量Roll、Pitch(航偏角Yaw无法测量)
L3G4200D:三轴陀螺仪,测量Roll、Pitch、Yaw(配合加速度计得出准确温度的三个角度)
HMC5883L:电子罗盘,测量与地磁北极的偏转角度
BMP085:气压传感器,测量大气压、温度
下面就是全部的驱动代码了:

  1. /*******************************************************************************
  2. *  函数功能:串口2发送数据  HMC5883L        + ADXL345 + BMP085+L3G4200D(串口2在mian初始化完成)
  3. *  波特率:115200
  4. *  时间:2020.7.12
  5. *  修改注释:全
  6. *******************************************************************************/

  7. /*芯片说明
  8. *ADXL345:三轴加速度计,测量Roll、Pitch(航偏角Yaw无法测量)
  9. *L3G4200D:三轴陀螺仪,测量Roll、Pitch、Yaw(配合加速度计得出准确温度的三个角度)
  10. *HMC5883L:电子罗盘,测量与地磁北极的偏转角度
  11. *BMP085:气压传感器,测量大气压、温度
  12. */

  13. #include "IMU.h"

  14. GPIO_InitTypeDef GPIO_InitStructure;
  15. ErrorStatus HSEStartUpStatus;


  16. #define   FALSE 0
  17. #define   TRUE  1

  18. #define   u8 unsigned char
  19. #define   u32 unsigned int
  20. #define   uchar unsigned char
  21. #define   uint unsigned int       
  22. #define   OSS 0         //        BMP085使用

  23. //L3G4200D内部寄存器
  24. #define CTRL_REG1 0x20
  25. #define CTRL_REG2 0x21
  26. #define CTRL_REG3 0x22
  27. #define CTRL_REG4 0x23
  28. #define CTRL_REG5 0x24
  29. #define OUT_X_L 0x28
  30. #define OUT_X_H 0x29
  31. #define OUT_Y_L 0x2A
  32. #define OUT_Y_H 0x2B
  33. #define OUT_Z_L 0x2C
  34. #define OUT_Z_H 0x2D

  35. //定义器件在IIC总线中的从地址,根据ALT  ADDRESS地址引脚不同修改
  36. #define        HMC5883L_Addr   0x3C        //磁场传感器器件地址
  37. #define        ADXL345_Addr    0xA6        //加速度传感器器件地址
  38. #define        BMP085_Addr     0xee        //气压传感器器件地址
  39. #define        L3G4200_Addr    0xD2        //陀螺仪传感器器件地址

  40. unsigned char BUF[8];                   //接收数据缓存区,作用是暂时缓存寄存器的值,之后做算法分析
  41. char  test=0;
  42. int   x,y;
  43. uchar ge,shi,bai,qian,wan,shiwan;           //uart,显示变量


  44. short T_X,T_Y,T_Z;                     //陀螺仪输出数据
  45. float angle;                           //电子罗盘输出角度,与地磁北极的偏转角度

  46. /* 加速度计ADXL345 数据 */
  47. int A_X,A_Y,A_Z;                       //加速度计读取的寄存器数据
  48. short data_xyz[3];                     //加速度计合成数据
  49. float Q,T,K;                           //加速度计x、y、z原始数据
  50. float Roll,Pitch;                      //Roll,Pitch角度


  51. /* BMP085使用的变量 */
  52. short ac1;
  53. short ac2;
  54. short ac3;
  55. unsigned short ac4;
  56. unsigned short ac5;
  57. unsigned short ac6;
  58. short b1;
  59. short b2;
  60. short mb;
  61. short mc;
  62. short md;

  63. long  temperature;   //温度
  64. long  pressure;      //气压


  65. //************************************++++++++++++++++++++++++++++++++
  66. /*模拟IIC端口输出输入定义
  67. *SDA:PB9
  68. *SCL:PB8
  69. */
  70. #define SCL_H         GPIOB->BSRR = GPIO_Pin_8
  71. #define SCL_L         GPIOB->BRR  = GPIO_Pin_8
  72.    
  73. #define SDA_H         GPIOB->BSRR = GPIO_Pin_9
  74. #define SDA_L         GPIOB->BRR  = GPIO_Pin_9

  75. #define SCL_read      GPIOB->IDR  & GPIO_Pin_8
  76. #define SDA_read      GPIOB->IDR  & GPIO_Pin_9



  77. /* 转换数据 */
  78. void conversion(long temp_data)  
  79. {     
  80.     shiwan=temp_data/100000+0x30 ;
  81.     temp_data=temp_data%100000;   //取余运算
  82.     wan=temp_data/10000+0x30 ;
  83.     temp_data=temp_data%10000;   //取余运算
  84.         qian=temp_data/1000+0x30 ;
  85.     temp_data=temp_data%1000;    //取余运算
  86.     bai=temp_data/100+0x30   ;
  87.     temp_data=temp_data%100;     //取余运算
  88.     shi=temp_data/10+0x30    ;
  89.     temp_data=temp_data%10;      //取余运算
  90.     ge=temp_data+0x30;        
  91. }
  92. /*******************************************************************************
  93. * Function Name  : I2C_GPIO_Config
  94. * Description    : Configration Simulation IIC GPIO
  95. * Input          : None
  96. * Output         : None
  97. * Return         : None
  98. ****************************************************************************** */
  99. void I2C_GPIO_Config(void)
  100. {
  101.   GPIO_InitTypeDef  GPIO_InitStructure;

  102.   GPIO_InitStructure.GPIO_Pin =  GPIO_Pin_8|GPIO_Pin_9;
  103.   GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  104.   GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_OD;  
  105.   GPIO_Init(GPIOB, &GPIO_InitStructure);

  106. }

  107. /*******************************************************************************
  108. * Function Name  : I2C_delay
  109. * Description    : Simulation IIC Timing series delay
  110. * Input          : None
  111. * Output         : None
  112. * Return         : None
  113. ****************************************************************************** */
  114. void I2C_delay(void)
  115. {
  116.                
  117.    u8 i=30; //这里可以优化速度        ,经测试最低到5还能写入
  118.    while(i)
  119.    {
  120.      i--;
  121.    }  
  122. }

  123. void delay5ms(void)
  124. {
  125.                
  126.    int i=5000;  
  127.    while(i)
  128.    {
  129.      i--;
  130.    }  
  131. }
  132. /*******************************************************************************
  133. * Function Name  : I2C_Start
  134. * Description    : Master Start Simulation IIC Communication
  135. * Input          : None
  136. * Output         : None
  137. * Return         : Wheather         Start
  138. ****************************************************************************** */
  139. uint8_t I2C_Start(void)
  140. {
  141.         SDA_H;
  142.         SCL_H;
  143.         I2C_delay();
  144.         if(!SDA_read)return FALSE;        //SDA线为低电平则总线忙,退出
  145.         SDA_L;
  146.         I2C_delay();
  147.         if(SDA_read) return FALSE;        //SDA线为高电平则总线出错,退出
  148.         SDA_L;
  149.         I2C_delay();
  150.         return TRUE;
  151. }
  152. /*******************************************************************************
  153. * Function Name  : I2C_Stop
  154. * Description    : Master Stop Simulation IIC Communication
  155. * Input          : None
  156. * Output         : None
  157. * Return         : None
  158. ****************************************************************************** */
  159. void I2C_Stop(void)
  160. {
  161.         SCL_L;
  162.         I2C_delay();
  163.         SDA_L;
  164.         I2C_delay();
  165.         SCL_H;
  166.         I2C_delay();
  167.         SDA_H;
  168.         I2C_delay();
  169. }
  170. /*******************************************************************************
  171. * Function Name  : I2C_Ack
  172. * Description    : Master Send Acknowledge Single
  173. * Input          : None
  174. * Output         : None
  175. * Return         : None
  176. ****************************************************************************** */
  177. void I2C_Ack(void)
  178. {       
  179.         SCL_L;
  180.         I2C_delay();
  181.         SDA_L;
  182.         I2C_delay();
  183.         SCL_H;
  184.         I2C_delay();
  185.         SCL_L;
  186.         I2C_delay();
  187. }   
  188. /*******************************************************************************
  189. * Function Name  : I2C_NoAck
  190. * Description    : Master Send No Acknowledge Single
  191. * Input          : None
  192. * Output         : None
  193. * Return         : None
  194. ****************************************************************************** */
  195. void I2C_NoAck(void)
  196. {       
  197.         SCL_L;
  198.         I2C_delay();
  199.         SDA_H;
  200.         I2C_delay();
  201.         SCL_H;
  202.         I2C_delay();
  203.         SCL_L;
  204.         I2C_delay();
  205. }
  206. /*******************************************************************************
  207. * Function Name  : I2C_WaitAck
  208. * Description    : Master Reserive Slave Acknowledge Single
  209. * Input          : None
  210. * Output         : None
  211. * Return         : Wheather         Reserive Slave Acknowledge Single
  212. ****************************************************************************** */
  213. uint8_t I2C_WaitAck(void)          //返回为:=1有ACK,=0无ACK
  214. {
  215.         SCL_L;
  216.         I2C_delay();
  217.         SDA_H;                       
  218.         I2C_delay();
  219.         SCL_H;
  220.         I2C_delay();
  221.         if(SDA_read)
  222.         {
  223.       SCL_L;
  224.           I2C_delay();
  225.       return FALSE;
  226.         }
  227.         SCL_L;
  228.         I2C_delay();
  229.         return TRUE;
  230. }
  231. /*******************************************************************************
  232. * Function Name  : I2C_SendByte
  233. * Description    : Master Send a Byte to Slave
  234. * Input          : Will Send Date
  235. * Output         : None
  236. * Return         : None
  237. ****************************************************************************** */
  238. void I2C_SendByte(u8 SendByte) //数据从高位到低位//
  239. {
  240.     u8 i=8;
  241.     while(i--)
  242.     {
  243.         SCL_L;
  244.         I2C_delay();
  245.       if(SendByte&0x80)
  246.         SDA_H;  
  247.       else
  248.         SDA_L;   
  249.         SendByte<<=1;
  250.         I2C_delay();

  251.                 SCL_H;
  252.         I2C_delay();
  253.     }
  254.     SCL_L;
  255. }  
  256. /*******************************************************************************
  257. * Function Name  : I2C_RadeByte
  258. * Description    : Master Reserive a Byte From Slave
  259. * Input          : None
  260. * Output         : None
  261. * Return         : Date From Slave
  262. ****************************************************************************** */
  263. unsigned char I2C_RadeByte(void)  //数据从高位到低位//
  264. {
  265.     u8 i=8;
  266.     u8 ReceiveByte=0;

  267.     SDA_H;                               
  268.     while(i--)
  269.     {
  270.       ReceiveByte<<=1;      
  271.       SCL_L;
  272.       I2C_delay();
  273.           SCL_H;
  274.       I2C_delay();       
  275.       if(SDA_read)
  276.       {
  277.         ReceiveByte|=0x01;
  278.       }
  279.     }
  280.     SCL_L;
  281.     return ReceiveByte;
  282. }
  283. //ZRX         
  284. //单字节写入*******************************************

  285. uint8_t Single_Write(unsigned char SlaveAddress,unsigned char REG_Address,unsigned char REG_data)                     //void
  286. {
  287.           if(!I2C_Start())return FALSE;
  288.     I2C_SendByte(SlaveAddress);   //发送设备地址+写信号//I2C_SendByte(((REG_Address & 0x0700) >>7) | SlaveAddress & 0xFFFE);//设置高起始地址+器件地址
  289.     if(!I2C_WaitAck()){I2C_Stop(); return FALSE;}
  290.     I2C_SendByte(REG_Address );   //设置低起始地址      
  291.     I2C_WaitAck();       
  292.     I2C_SendByte(REG_data);
  293.     I2C_WaitAck();   
  294.     I2C_Stop();
  295.     delay5ms();
  296.     return TRUE;
  297. }

  298. //单字节读取*****************************************
  299. unsigned char Single_Read(unsigned char SlaveAddress,unsigned char REG_Address)
  300. {   unsigned char REG_data;            
  301.         if(!I2C_Start())return FALSE;
  302.     I2C_SendByte(SlaveAddress); //I2C_SendByte(((REG_Address & 0x0700) >>7) | REG_Address & 0xFFFE);//设置高起始地址+器件地址
  303.     if(!I2C_WaitAck()){I2C_Stop();test=1; return FALSE;}
  304.     I2C_SendByte((u8) REG_Address);   //设置低起始地址      
  305.     I2C_WaitAck();
  306.     I2C_Start();
  307.     I2C_SendByte(SlaveAddress+1);
  308.     I2C_WaitAck();

  309.         REG_data= I2C_RadeByte();
  310.     I2C_NoAck();
  311.     I2C_Stop();
  312.     //return TRUE;
  313.         return REG_data;

  314. }                                                     

  315. /*
  316. ********************************************************************************
  317. ** 函数名称 : Delay(vu32 nCount)
  318. ** 函数功能 : 延时函数
  319. ** 输    入        : 无
  320. ** 输    出        : 无
  321. ** 返    回        : 无
  322. ********************************************************************************
  323. */
  324. void Delay(u32 nCount)
  325. {
  326.   for(; nCount != 0; nCount--);
  327. }

  328. /*
  329. ********************************************************************************
  330. ** 函数名称 : void Delayms(vu32 m)
  331. ** 函数功能 : 长延时函数         m=1,延时1ms
  332. ** 输    入        : 无
  333. ** 输    出        : 无
  334. ** 返    回        : 无
  335. ********************************************************************************
  336. */
  337. void Delayms(u32 m)
  338. {
  339.   u32 i;
  340.   
  341.   for(; m != 0; m--)       
  342.        for (i=0; i<50000; i++);
  343. }




  344. //************************************************
  345. void  USART2_SendData(unsigned char SendData)
  346. {
  347. USART_SendData(USART2, SendData);
  348. Delayms(1);
  349. }
  350.        

  351. //********************************************************************
  352. long bmp085ReadTemp(void)
  353. {   short  temp_ut;
  354.         Single_Write(BMP085_Addr,0xF4,0x2E);
  355.         Delayms(5);        // max time is 4.5ms
  356.         temp_ut = Single_Read(BMP085_Addr,0xF6);
  357.         temp_ut = (temp_ut<<8)| Single_Read(BMP085_Addr,0xF7);               
  358.         return (long) temp_ut ;
  359. }
  360. //*************************************************************

  361. long bmp085ReadPressure(void)
  362. {
  363.         long pressure = 0;
  364.         Single_Write(BMP085_Addr,0xF4,0x34);
  365.         Delayms(5);        // max time is 4.5ms
  366.         pressure = Single_Read(BMP085_Addr,0xF6);
  367.         pressure = (pressure<<8)| Single_Read(BMP085_Addr,0xF7);               
  368.         pressure &= 0x0000FFFF;       
  369.         return pressure;       
  370. }

  371. //******************
  372. void Send_ADXL345_data(int dis_data)
  373.   {
  374.     float temp ;
  375.         if(dis_data>0x7fff)dis_data-=0xffff;
  376.         if(dis_data<0){
  377.                dis_data=-dis_data;
  378.              USART_SendData(USART1,'-');
  379.                  Delayms(2);
  380.         }
  381.         else
  382.           {
  383.            USART_SendData(USART1,'+');
  384.            Delayms(2);
  385.            }
  386.         temp=(float)dis_data*3.9;  //计算数据和显示,查考ADXL345快速入门第4页
  387.         conversion(temp);          //转换出显示需要的数据         
  388.             USART2_SendData(qian);
  389.                 USART2_SendData('.');
  390.             USART2_SendData(bai);
  391.             USART2_SendData(shi);
  392.             USART2_SendData(ge);
  393.                 USART2_SendData('g');
  394. }
  395. //***************************************
  396. //******************
  397. void Send_L3G420D_data(short dis_data)
  398.   { float temp ;
  399.         if(dis_data<0){
  400.                dis_data=-dis_data;
  401.              USART_SendData(USART1,'-');
  402.                  Delayms(2);
  403.         }
  404.         else
  405.           {
  406.            USART_SendData(USART1,'+');
  407.            Delayms(2);
  408.            }
  409.         temp=(float)dis_data*0.07;  //计算数据和显示,查考ADXL345快速入门第4页
  410.         conversion(temp);           //转换出显示需要的数据         
  411.             USART2_SendData(bai);
  412.             USART2_SendData(shi);
  413.             USART2_SendData(ge);

  414. }
  415. //***************************************


  416. void Send_HMC5883L(void)
  417. {
  418. USART2_SendData('H');
  419. USART2_SendData('M');
  420. USART2_SendData('C');
  421. USART2_SendData('5');
  422. USART2_SendData('8');
  423. USART2_SendData('8');
  424. USART2_SendData('3');
  425. USART2_SendData('L');
  426. USART2_SendData(':');
  427. conversion(angle);
  428. USART2_SendData(bai);
  429. USART2_SendData(shi);
  430. USART2_SendData(ge);
  431. USART2_SendData('`');  
  432. USART2_SendData(0x0d);
  433. USART2_SendData(0x0a);
  434. }
  435. //*************************************************
  436. void  Send_BMP085(void)
  437. {
  438. USART2_SendData('B');
  439. USART2_SendData('M');
  440. USART2_SendData('P');
  441. USART2_SendData('0');
  442. USART2_SendData('8');
  443. USART2_SendData('5');
  444. USART2_SendData(':');

  445. USART2_SendData('t');
  446. USART2_SendData('=');
  447. conversion(temperature);
  448. USART2_SendData(bai);
  449. USART2_SendData(shi);
  450. USART2_SendData('.');
  451. USART2_SendData(ge);
  452. USART2_SendData('`');
  453. USART2_SendData('C');

  454. USART2_SendData(' ');
  455. USART2_SendData('p');
  456. USART2_SendData('=');
  457. conversion(pressure);

  458. USART2_SendData(shiwan);
  459. USART2_SendData(wan);
  460. USART2_SendData(qian);
  461. USART2_SendData('.');
  462. USART2_SendData(bai);
  463. USART2_SendData(shi);
  464. USART2_SendData(ge);
  465. USART2_SendData('K');
  466. USART2_SendData('p');
  467. USART2_SendData('a');                                 
  468. USART2_SendData(0x0d);
  469. USART2_SendData(0x0a);

  470. }
  471. //*****************************************************

  472. void  Send_ADXL345(void)
  473. {
  474. USART2_SendData('A');
  475. USART2_SendData('D');
  476. USART2_SendData('X');
  477. USART2_SendData('L');
  478. USART2_SendData('3');
  479. USART2_SendData('4');
  480. USART2_SendData('5');
  481. USART2_SendData(':');
  482.            USART2_SendData('X');
  483.            USART2_SendData('=');
  484.            Send_ADXL345_data(A_X);

  485.            USART2_SendData('Y');
  486.            USART2_SendData('=');
  487.            Send_ADXL345_data(A_Y);

  488.            USART2_SendData('Z');
  489.            USART2_SendData('=');
  490.            Send_ADXL345_data(A_Z);

  491.            adxl345_angle();


  492. USART2_SendData(0x0d);
  493. USART2_SendData(0x0a);
  494. }
  495. //*****************************************************
  496. void Send_L3G4200D(void)
  497. {
  498.            USART2_SendData('L');
  499.         USART2_SendData('3');
  500.         USART2_SendData('G');
  501.         USART2_SendData('4');
  502.         USART2_SendData('2');
  503.         USART2_SendData('0');
  504.         USART2_SendData('0');
  505.         USART2_SendData('D');
  506.         USART2_SendData(':');

  507.            USART2_SendData('X');
  508.            USART2_SendData('=');
  509.            Send_L3G420D_data(T_X);

  510.            USART2_SendData('Y');
  511.            USART2_SendData('=');
  512.            Send_L3G420D_data(T_Y);

  513.            USART2_SendData('Z');
  514.            USART2_SendData('=');
  515.            Send_L3G420D_data(T_Z);

  516.           USART2_SendData(0x0d);
  517.      USART2_SendData(0x0a);
  518. }
  519. //******************************************************
  520. void read_HMC5883L(void)
  521. {
  522.        Single_Write(HMC5883L_Addr,0x00,0x14);   //
  523.        Single_Write(HMC5883L_Addr,0x02,0x00);   //
  524.              Delayms(10);

  525.        BUF[1]=Single_Read(HMC5883L_Addr,0x03);//OUT_X_L_A
  526.        BUF[2]=Single_Read(HMC5883L_Addr,0x04);//OUT_X_H_A

  527.            BUF[3]=Single_Read(HMC5883L_Addr,0x07);//OUT_Y_L_A
  528.        BUF[4]=Single_Read(HMC5883L_Addr,0x08);//OUT_Y_H_A

  529.        x=(BUF[1] << 8) | BUF[2]; //Combine MSB and LSB of X Data output register
  530.        y=(BUF[3] << 8) | BUF[4]; //Combine MSB and LSB of Z Data output register

  531.        if(x>0x7fff)x-=0xffff;          
  532.        if(y>0x7fff)y-=0xffff;          
  533.        angle= atan2(y,x) * (180 / 3.14159265) + 180; // angle in degrees
  534. }
  535. //****************************************
  536. void read_ADXL345(void)
  537. {
  538.        BUF[0]=Single_Read(ADXL345_Addr,0x32);//OUT_X_L_A
  539.        BUF[1]=Single_Read(ADXL345_Addr,0x33);//OUT_X_H_A

  540.            BUF[2]=Single_Read(ADXL345_Addr,0x34);//OUT_Y_L_A
  541.        BUF[3]=Single_Read(ADXL345_Addr,0x35);//OUT_Y_H_A

  542.            BUF[4]=Single_Read(ADXL345_Addr,0x36);//OUT_Z_L_A
  543.        BUF[5]=Single_Read(ADXL345_Addr,0x37);//OUT_Z_H_A

  544.            A_X=(BUF[1]<<8)+BUF[0];  //合成数据  
  545.            A_Y=(BUF[3]<<8)+BUF[2];  //合成数据
  546.            A_Z=(BUF[5]<<8)+BUF[4];  //合成数据
  547. }
  548. //*****************************************
  549. void read_BMP085(void)
  550. {

  551.            long ut;
  552.         long up;
  553.         long x1, x2, b5, b6, x3, b3, p;
  554.         unsigned long b4, b7;

  555.         ut = bmp085ReadTemp();           // 读取温度
  556. //        ut = bmp085ReadTemp();           // 读取温度
  557.         up = bmp085ReadPressure();  // 读取压强
  558. //        up = bmp085ReadPressure();  // 读取压强
  559.         x1 = ((long)ut - ac6) * ac5 >> 15;
  560.         x2 = ((long) mc << 11) / (x1 + md);
  561.         b5 = x1 + x2;
  562.         temperature = (b5 + 8) >> 4;
  563.        
  564.          //****************

  565.         b6 = b5 - 4000;
  566.         x1 = (b2 * (b6 * b6 >> 12)) >> 11;
  567.         x2 = ac2 * b6 >> 11;
  568.         x3 = x1 + x2;
  569.         b3 = (((long)ac1 * 4 + x3) + 2)/4;
  570.         x1 = ac3 * b6 >> 13;
  571.         x2 = (b1 * (b6 * b6 >> 12)) >> 16;
  572.         x3 = ((x1 + x2) + 2) >> 2;
  573.         b4 = (ac4 * (unsigned long) (x3 + 32768)) >> 15;
  574.         b7 = ((unsigned long) up - b3) * (50000 >> OSS);
  575.         if( b7 < 0x80000000)
  576.              p = (b7 * 2) / b4 ;
  577.            else  
  578.                     p = (b7 / b4) * 2;
  579.         x1 = (p >> 8) * (p >> 8);
  580.         x1 = (x1 * 3038) >> 16;
  581.         x2 = (-7357 * p) >> 16;
  582.          pressure = p + ((x1 + x2 + 3791) >> 4);
  583. }
  584. //***************************
  585. void  Init_ADXL345(void)
  586. {
  587.    Single_Write(ADXL345_Addr,0x31,0x0B);   //测量范围,正负16g,13位模式
  588.   // Single_Write(ADXL345_Addr,0x2C,0x0e);   //速率设定为100hz 参考pdf13页
  589.    Single_Write(ADXL345_Addr,0x2D,0x08);   //选择电源模式   参考pdf24页
  590.    Single_Write(ADXL345_Addr,0x2E,0x80);   //使能 DATA_READY 中断
  591.   // Single_Write(ADXL345_Addr,0x1E,0x00);   //X 偏移量 根据测试传感器的状态写入pdf29页
  592.   // Single_Write(ADXL345_Addr,0x1F,0x00);   //Y 偏移量 根据测试传感器的状态写入pdf29页
  593.   // Single_Write(ADXL345_Addr,0x20,0x05);   //Z 偏移量 根据测试传感器的状态写入pdf29页
  594. }
  595. //****************************
  596. void  Init_BMP085(void)
  597. {
  598.         ac1 = Single_Read(BMP085_Addr,0xAA);
  599.         ac1 = (ac1<<8)|Single_Read(BMP085_Addr,0xAB);

  600.     ac2 = Single_Read(BMP085_Addr,0xAC);
  601.         ac2 = (ac2<<8)| Single_Read(BMP085_Addr,0xAD);

  602.         ac3 = Single_Read(BMP085_Addr,0xAE);
  603.         ac3 = (ac3<<8)| Single_Read(BMP085_Addr,0xAF);

  604.         ac4 = Single_Read(BMP085_Addr,0xB0);
  605.         ac4 = (ac4<<8)| Single_Read(BMP085_Addr,0xB1);

  606.         ac5 = Single_Read(BMP085_Addr,0xB2);
  607.         ac5 = (ac5<<8)| Single_Read(BMP085_Addr,0xB3);

  608.         ac6 = Single_Read(BMP085_Addr,0xB4);
  609.         ac6 = (ac6<<8)| Single_Read(BMP085_Addr,0xB5);

  610.         b1 = Single_Read(BMP085_Addr,0xB6);
  611.         b1 = (b1<<8)| Single_Read(BMP085_Addr,0xB7);

  612.         b2 = Single_Read(BMP085_Addr,0xB8);
  613.         b2 = (b2<<8)| Single_Read(BMP085_Addr,0xB9);

  614.         mb = Single_Read(BMP085_Addr,0xBA);
  615.         mb = (mb<<8)| Single_Read(BMP085_Addr,0xBB);

  616.         mc = Single_Read(BMP085_Addr,0xBC);
  617.         mc = (mc<<8)| Single_Read(BMP085_Addr,0xBD);

  618.         md = Single_Read(BMP085_Addr,0xBE);
  619.         md = (md<<8)| Single_Read(BMP085_Addr,0xBF);

  620. }
  621. //****************************
  622. void  Init_HMC5883L(void)
  623. {
  624.    Single_Write(HMC5883L_Addr,0x00,0x14);   //
  625.    Single_Write(HMC5883L_Addr,0x02,0x00);   //
  626. }
  627. //*****************************************

  628. //************初始化L3G4200D*********************************
  629. void Init_L3G4200D(void)
  630. {
  631.         Single_Write(L3G4200_Addr,CTRL_REG1, 0x0f);
  632.         Single_Write(L3G4200_Addr,CTRL_REG2, 0x00);
  633.         Single_Write(L3G4200_Addr,CTRL_REG3, 0x08);
  634.         Single_Write(L3G4200_Addr,CTRL_REG4, 0x30);        //+-2000dps
  635.         Single_Write(L3G4200_Addr,CTRL_REG5, 0x00);
  636. }       
  637. //******读取L3G4200D数据****************************************
  638. void read_L3G4200D(void)
  639. {
  640.    BUF[0]=Single_Read(L3G4200_Addr,OUT_X_L);
  641.    BUF[1]=Single_Read(L3G4200_Addr,OUT_X_H);
  642.    T_X=        (BUF[1]<<8)|BUF[0];



  643.    BUF[2]=Single_Read(L3G4200_Addr,OUT_Y_L);
  644.    BUF[3]=Single_Read(L3G4200_Addr,OUT_Y_H);
  645.    T_Y=        (BUF[3]<<8)|BUF[2];
  646.   

  647.    BUF[4]=Single_Read(L3G4200_Addr,OUT_Z_L);
  648.    BUF[5]=Single_Read(L3G4200_Addr,OUT_Z_H);
  649.    T_Z=        (BUF[5]<<8)|BUF[4];

  650. }

  651. //******************ADXL345计算倾斜角度************
  652. void adxl345_angle(void)
  653. {

  654. data_xyz[0]=A_X;  //合成数据   
  655. data_xyz[1]=A_Y;  //合成数据   
  656. data_xyz[2]=A_Z;  //合成数据   

  657. //分别是加速度X,Y,Z的原始数据,10位的
  658. Q=(float)data_xyz[0]*3.9;
  659. T=(float)data_xyz[1]*3.9;
  660. K=(float)data_xyz[2]*3.9;
  661. Q=-Q;

  662.   Roll=(float)(((atan2(K,Q)*180)/3.14159265)+180);    //X轴角度值
  663.   Pitch=(float)(((atan2(K,T)*180)/3.14159265)+180);  //Y轴角度值
  664.   //conversion(Pitch);                                                                   //需要显示时候请更换
  665.   conversion(Roll);
  666.         USART2_SendData(' ');
  667.                 USART2_SendData(' ');
  668.               USART2_SendData(bai);
  669.             USART2_SendData(shi);
  670.             USART2_SendData(ge);
  671. }

  672. int main(void)
  673. {
  674.         DEBUG_USART_Config();
  675.         Init_HMC5883L();
  676.   Init_ADXL345();
  677.   Init_BMP085();
  678.   Init_L3G4200D();
  679.        
  680.         while(1)
  681.         {
  682.                 read_HMC5883L();
  683.        Send_HMC5883L();
  684.                 read_ADXL345();
  685.            Send_ADXL345();
  686.                 read_L3G4200D();
  687.             Send_L3G4200D();
  688.                 read_BMP085();                  
  689.            Send_BMP085();
  690.                 Delayms(20);
  691.         }
  692. }
  693. ///*************结束***************/

复制代码

————————————————
版权声明:Aspirant-GQ
如有侵权请联系删除



收藏 评论0 发布时间:2023-3-17 21:33

举报

0个回答

所属标签

相似分享

官网相关资源

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
STM32N6 AI生态系统
STM32MCU,MPU高性能GUI
ST ACEPACK电源模块
意法半导体生物传感器
STM32Cube扩展软件包
关注我们
st-img 微信公众号
st-img 手机版