当前位置:   article > 正文

四轴飞行器、无人机(STM32、NRF24L01)_nrf24l01无人机接收器

nrf24l01无人机接收器

一、简介

    此电路由STM32为主控芯片,NRF24L01、MPU6050为辅,当接受到信号时,处理对应的指令。

二、实物图

3ad7a194d6924304a0c353b502e0d7bd.jpg

9ceb7f86525f4e3195d35ea343c386b5.jpg

三、部分代码

  1. #include "ALL_DATA.h"
  2. #include "mpu6050.h"
  3. #include "I2C.h"
  4. #include "filter.h"
  5. #include <string.h>
  6. #include "LED.h"
  7. #include "myMath.h"
  8. #include "kalman.h"
  9. #include "flash.h"
  10. #define SMPLRT_DIV 0x19 //ÍÓÂÝÒDzÉÑùÂÊ£¬µäÐÍÖµ£º0x07(125Hz)
  11. #define CONFIGL 0x1A //µÍͨÂ˲¨ÆµÂÊ£¬µäÐÍÖµ£º0x06(5Hz)
  12. #define GYRO_CONFIG 0x1B //ÍÓÂÝÒÇ×Լ켰²âÁ¿·¶Î§£¬µäÐÍÖµ£º0x18(²»×Լ죬2000deg/s)
  13. #define ACCEL_CONFIG 0x1C //¼ÓËÙ¼Æ×Լ졢²âÁ¿·¶Î§¼°¸ßͨÂ˲¨ÆµÂÊ£¬µäÐÍÖµ£º0x01(²»×Լ죬2G£¬5Hz)
  14. #define ACCEL_ADDRESS 0x3B
  15. #define ACCEL_XOUT_H 0x3B
  16. #define ACCEL_XOUT_L 0x3C
  17. #define ACCEL_YOUT_H 0x3D
  18. #define ACCEL_YOUT_L 0x3E
  19. #define ACCEL_ZOUT_H 0x3F
  20. #define ACCEL_ZOUT_L 0x40
  21. #define TEMP_OUT_H 0x41
  22. #define TEMP_OUT_L 0x42
  23. #define GYRO_XOUT_H 0x43
  24. #define GYRO_ADDRESS 0x43
  25. #define GYRO_XOUT_L 0x44
  26. #define GYRO_YOUT_H 0x45
  27. #define GYRO_YOUT_L 0x46
  28. #define GYRO_ZOUT_H 0x47
  29. #define GYRO_ZOUT_L 0x48
  30. #define PWR_MGMT_1 0x6B //µçÔ´¹ÜÀí£¬µäÐÍÖµ£º0x00(Õý³£ÆôÓÃ)
  31. #define WHO_AM_I 0x75 //IICµØÖ·¼Ä´æÆ÷(ĬÈÏÊýÖµ0x68£¬Ö»¶Á)
  32. #define MPU6050_PRODUCT_ID 0x68
  33. #define MPU6050_ADDRESS 0xD0//0x68
  34. int16_t MpuOffset[6] = {0};
  35. static volatile int16_t *pMpu = (int16_t *)&MPU6050;
  36. /****************************************************************************************
  37. MPU6050¸´Î»
  38. *@brief
  39. *@brief
  40. *@param[in]
  41. *****************************************************************************************/
  42. int8_t mpu6050_rest(void)
  43. {
  44. if(IIC_Write_One_Byte(MPU6050_ADDRESS, PWR_MGMT_1, 0x80) == FAILED)
  45. return FAILED; //¸´Î»
  46. delay_ms(20);
  47. return SUCCESS;
  48. }
  49. /****************************************************************************************
  50. MPU6050³õʼ»¯
  51. *@brief
  52. *@brief
  53. *@param[in]
  54. *****************************************************************************************/
  55. int8_t MpuInit(void) //³õʼ»¯
  56. {
  57. uint8_t date = SUCCESS;
  58. do
  59. {
  60. date = IIC_Write_One_Byte(MPU6050_ADDRESS, PWR_MGMT_1, 0x80); //¸´Î»
  61. delay_ms(30);
  62. date += IIC_Write_One_Byte(MPU6050_ADDRESS, SMPLRT_DIV, 0x02); //ÍÓÂÝÒDzÉÑùÂÊ£¬0x00(500Hz)
  63. date += IIC_Write_One_Byte(MPU6050_ADDRESS, PWR_MGMT_1, 0x01); //ÉèÖÃÉ豸ʱÖÓÔ´£¬ÍÓÂÝÒÇZÖá
  64. date += IIC_Write_One_Byte(MPU6050_ADDRESS, CONFIGL, 0x03); //µÍͨÂ˲¨ÆµÂÊ£¬0x03(42Hz)
  65. date += IIC_Write_One_Byte(MPU6050_ADDRESS, GYRO_CONFIG, 0x18);//+-2000deg/s
  66. date += IIC_Write_One_Byte(MPU6050_ADDRESS, ACCEL_CONFIG, 0x09);//+-4G
  67. }
  68. while(date != SUCCESS); //Èç¹ûÍÓÂÝÒÇÕý³£
  69. date = IIC_Read_One_Byte(MPU6050_ADDRESS, 0x75); //ÅжÏMPU6050µØÖ·
  70. if(date!= MPU6050_PRODUCT_ID) //Èç¹ûµØÖ·ÕýÈ·
  71. return FAILED;
  72. FLASH_read(MpuOffset,6);//´ÓmcuµÄFLASHÖжÁÈ¡MPU6050µÄˮƽ¾²Ö¹±ê¶¨Ð£×¼Öµ
  73. return SUCCESS;
  74. }
  75. /****************************************************************************************
  76. »ñÈ¡MPU6050Êý¾Ý
  77. *@brief
  78. *@brief
  79. *@param[in]
  80. *****************************************************************************************/
  81. #define Acc_Read() IIC_read_Bytes(MPU6050_ADDRESS, 0X3B,buffer,6) //¶ÁÈ¡¼ÓËÙ¶È
  82. #define Gyro_Read() IIC_read_Bytes(MPU6050_ADDRESS, 0x43,&buffer[6],6) // ¶ÁÈ¡½ÇËÙ¶È
  83. void MpuGetData(void) //¶ÁÈ¡ÍÓÂÝÒÇÊý¾Ý¼ÓÂ˲¨
  84. {
  85. uint8_t i;
  86. uint8_t buffer[12];
  87. Acc_Read();
  88. Gyro_Read();
  89. for(i=0;i<6;i++)
  90. {
  91. pMpu[i] = (((int16_t)buffer[i<<1] << 8) | buffer[(i<<1)+1])-MpuOffset[i];
  92. if(i < 3) //´Ë´¦¶Ô¼ÓËÙ¶È×öһά¿¨¶ûÂüÂ˲¨
  93. {
  94. {
  95. static struct _1_ekf_filter ekf[3] = {{0.02,0,8192,0,0.001,0.543},{0.02,0,8192,0,0.001,0.543},{0.02,0,8192,0,0.001,0.543}};
  96. kalman_1(&ekf[i],(float)pMpu[i]); //һά¿¨¶ûÂü
  97. pMpu[i] = (int16_t)ekf[i].out;
  98. }
  99. }
  100. if(i > 2) //´Ë´¦¶Ô½ÇËÙ¶È×öÒ»½éµÍͨÂ˲¨
  101. {
  102. uint8_t k=i-3;
  103. const float factor = 0.25f; //Â˲¨ÒòËØ
  104. static float tBuff[3];
  105. pMpu[i] = tBuff[k] = tBuff[k] * (1 - factor) + pMpu[i] * factor;
  106. }
  107. }
  108. }
  109. /****************************************************************************************
  110. *@brief get mpu offset
  111. *@brief initial and cmd call this
  112. *@param[in]
  113. *****************************************************************************************/
  114. void MpuGetOffset(void) //У׼
  115. {
  116. int32_t buffer[6]={0};
  117. int16_t i;
  118. uint8_t k=30;
  119. const int8_t MAX_GYRO_QUIET = 5;
  120. const int8_t MIN_GYRO_QUIET = -5;
  121. /* wait for calm down */
  122. int16_t LastGyro[3] = {0};
  123. int16_t ErrorGyro[3];
  124. /* set offset initial to zero */
  125. memset(MpuOffset,0,12);
  126. MpuOffset[2] = 8192; //¸ù¾ÝÊÖ²áÁ¿³ÌÉ趨¼ÓËٶȱ궨ֵ
  127. TIM_ITConfig( //ʹÄÜ»òÕßʧÄÜÖ¸¶¨µÄTIMÖжÏ
  128. TIM3, //TIM2
  129. TIM_IT_Update ,
  130. DISABLE //ʹÄÜ
  131. );
  132. while(k--) //ÅжϷɿØÊÇ·ñ´¦ÓÚ¾²Ö¹×´Ì¬
  133. {
  134. do
  135. {
  136. delay_ms(10);
  137. MpuGetData();
  138. for(i=0;i<3;i++)
  139. {
  140. ErrorGyro[i] = pMpu[i+3] - LastGyro[i];
  141. LastGyro[i] = pMpu[i+3];
  142. }
  143. }while ((ErrorGyro[0] > MAX_GYRO_QUIET )|| (ErrorGyro[0] < MIN_GYRO_QUIET)
  144. ||(ErrorGyro[1] > MAX_GYRO_QUIET )|| (ErrorGyro[1] < MIN_GYRO_QUIET)
  145. ||(ErrorGyro[2] > MAX_GYRO_QUIET )|| (ErrorGyro[2] < MIN_GYRO_QUIET)
  146. );
  147. }
  148. /* throw first 100 group data and make 256 group average as offset */
  149. for(i=0;i<356;i++) //È¡µÚ100µ½µÚ356×éµÄƽ¾ùÖµ×öΪУ׼ֵ
  150. {
  151. MpuGetData();
  152. if(100 <= i)
  153. {
  154. uint8_t k;
  155. for(k=0;k<6;k++)
  156. {
  157. buffer[k] += pMpu[k];
  158. }
  159. }
  160. }
  161. for(i=0;i<6;i++) //±£´æУ׼ֵ
  162. {
  163. MpuOffset[i] = buffer[i]>>8;
  164. }
  165. TIM_ITConfig( //ʹÄÜ»òÕßʧÄÜÖ¸¶¨µÄTIMÖжÏ
  166. TIM3, //TIM2
  167. TIM_IT_Update ,
  168. ENABLE //ʹÄÜ
  169. );
  170. FLASH_write(MpuOffset,6);//½«Êý¾Ýдµ½FLASHÖУ¬Ò»¹²ÓÐ6¸öint16Êý¾Ý
  171. }

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/寸_铁/article/detail/872663
推荐阅读
相关标签
  

闽ICP备14008679号