久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 5300|回復(fù): 0
打印 上一主題 下一主題
收起左側(cè)

完美的平衡車程序 卡爾曼濾波和PID及nrf24l01無線

[復(fù)制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
ID:255506 發(fā)表于 2017-11-30 08:34 | 只看該作者 |只看大圖 回帖獎勵 |倒序瀏覽 |閱讀模式
完美的平衡車程序,完整的代碼,有卡爾曼濾波和PID


單片機源程序如下:
  1. /***********************************************
  2. 標(biāo)題: mian.c
  3. 日期: 2013/12/27
  4. 版本:v1.0
  5. MDK-ARM 版本: v4.12
  6. ST 庫版本:v3.50  
  7. 功能: 自平衡小車平衡及控制
  8. 說明:可結(jié)合上位機校正六軸的補償值,使用藍(lán)牙或者NRF24L01控制
  9. *************************************************/
  10. #include "stm32f10x.h"
  11. #include "iic.h"
  12. #include "timer.h"
  13. #include "usart.h"
  14. #include "24l01.h"
  15. #include "mpu3050.h"
  16. #include "adxl345.h"
  17. #include "filter.h"
  18. #include "calculate.h"
  19. #include "usb_lib.h"
  20. #include "usb_desc.h"
  21. #include "usb_istr.h"
  22. #include "hw_config.h"
  23. #include "usb_pwr.h"
  24. #include "usb_pwr.h"
  25. #include <stdio.h>
  26. #include <math.h>

  27. u8 receive_data;
  28. u8 flg_get_senor_data;
  29. u8 out[35]  ={0x5f, 0x60, 0};
  30. static float angle, angle_dot, f_angle, f_angle_dot;
  31. s16 temp;
  32. s16 gx, gy, gz, ax ,ay, az, temperature;
  33. s16 gx_offset, ax_offset, ay_offset, az_offset;
  34. u8 tmp[2]={0};        

  35. #define USB
  36. #define FILTER_COUNT  32
  37. s16 gx_buf[FILTER_COUNT], ax_buf[FILTER_COUNT], ay_buf[FILTER_COUNT],az_buf[FILTER_COUNT];
  38. /******************************************************************************/
  39. void delay(u32 count)   //延時函數(shù)
  40. {
  41.   for(; count != 0; count--);
  42. }
  43. /*************************************************

  44. 名稱:void acc_filter(void)
  45. 功能:加速度計數(shù)據(jù)濾波
  46. 輸入?yún)?shù):據(jù)濾波后的數(shù)據(jù)
  47. 輸出參數(shù):無
  48. 返回值:  無
  49. **************************************************/
  50. void acc_filter(void)
  51. {
  52.   u8 i;
  53.   s32 ax_sum = 0, ay_sum = 0, az_sum = 0;

  54.   for(i = 1 ; i < FILTER_COUNT; i++)
  55.   {
  56.     ax_buf[i - 1] = ax_buf[i];
  57.         ay_buf[i - 1] = ay_buf[i];
  58.         az_buf[i - 1] = az_buf[i];
  59.   }

  60.   ax_buf[FILTER_COUNT - 1] = ax;
  61.   ay_buf[FILTER_COUNT - 1] = ay;
  62.   az_buf[FILTER_COUNT - 1] = az;

  63.   for(i = 0 ; i < FILTER_COUNT; i++)
  64.   {
  65.     ax_sum += ax_buf[i];
  66.         ay_sum += ay_buf[i];
  67.         az_sum += az_buf[i];
  68.   }

  69.   ax = (s16)(ax_sum / FILTER_COUNT);
  70.   ay = (s16)(ay_sum / FILTER_COUNT);
  71.   az = (s16)(az_sum / FILTER_COUNT);
  72. }
  73. /*****************************************************************************/
  74. int main(void)
  75. {
  76.   GPIO_InitTypeDef GPIO_InitStructure;
  77.         
  78. #ifdef USB //usb接入
  79.   NVIC_InitTypeDef NVIC_InitStructure;
  80. #endif

  81.   u8 j, i=0;

  82.   RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA|RCC_APB2Periph_GPIOB, ENABLE);
  83.   
  84.   GPIO_InitStructure.GPIO_Pin = GPIO_Pin_5;
  85.   GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
  86.   GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  87.    
  88.   GPIO_Init(GPIOA, &GPIO_InitStructure);
  89.   GPIO_SetBits(GPIOA,GPIO_Pin_5);  //blue led

  90. #ifdef USB
  91.   usb_system_init();
  92. #endif
  93.   
  94.         //初始化
  95.   usart_init();                                          
  96.   iic_init();
  97.   timer_init();
  98.         
  99.          NRF24L01_Init();    //初始化NRF24L01
  100.   mpu3050_init();
  101.   adxl345_init();

  102.   motor_init();
  103.         LED2OFF;//確認(rèn)關(guān)閉LED2
  104. while(NRF24L01_Check())//檢測不到24L01
  105.         {
  106.                 delay(3000);
  107.                 LED2ON;  //LED2常亮
  108.         }
  109.         
  110.   RX_Mode();   //24L01接收模式
  111.           LED1ON;
  112.   while (1)
  113.   {  
  114.     if(flg_get_senor_data)   //TIM3觸發(fā)
  115.     {
  116.       flg_get_senor_data = 0;
  117. #ifdef USB
  118.           NVIC_InitStructure.NVIC_IRQChannel = USB_LP_CAN1_RX0_IRQn;
  119.           NVIC_InitStructure.NVIC_IRQChannelCmd = DISABLE;    //USB通訊關(guān)閉
  120.           NVIC_Init(&NVIC_InitStructure);
  121. #endif            
  122.              //獲取六軸的原始值
  123.       mpu3050_get_data(&gx, &gy, &gz, &temperature);
  124.       adxl345_get_data(&ax, &ay ,&az);

  125. #ifdef USB
  126.           NVIC_InitStructure.NVIC_IRQChannel = USB_LP_CAN1_RX0_IRQn;
  127.           NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;      //USB通訊啟動
  128.           NVIC_Init(&NVIC_InitStructure);
  129. #endif

  130.           acc_filter();

  131.           gx -= gx_offset;  //gx補償校正
  132.                 ax -= ax_offset;  //ax補償校正
  133.           ay -=        ay_offset;  //ay補償校正
  134.           az -=        az_offset;  //az補償校正

  135.           angle_dot = gx * GYRO_SCALE;  //+-2000  0.060975 °/LSB
  136.       angle = atan(ay / sqrt(ax * ax + az * az ));
  137.       angle = angle * 57.295780;    //180/pi

  138.           kalman_filter(angle, angle_dot, &f_angle, &f_angle_dot);//卡爾曼濾波函數(shù)

  139.     if(tmp[0]==0){ receive_parameter(receive_data);}//藍(lán)牙控制
  140.                 //---------------------------------------------------------------
  141.                
  142.                 if(NRF24L01_RxPacket(tmp)==0)         //24L01控制
  143.                         {
  144.                                 receive_parameter(tmp[1]);
  145.                                 LED1OFF;
  146.       }        
  147.                         
  148.                
  149. //------------------------------------------------------------
  150.           pid(f_angle, f_angle_dot);   //PID調(diào)節(jié)

  151. #ifdef USB    //USB上位機數(shù)據(jù)處理
  152.   temp = (s16)(f_angle * 100);

  153.           out[2] = (u8)(gx >> 8);
  154.           out[3] = (u8)(gx);
  155.           out[4] = (u8)(gy >> 8);
  156.           out[5] = (u8)(gy);
  157.           out[6] = (u8)(gz >> 8);
  158.           out[7] = (u8)(gz);
  159.           out[8] = (u8)(ax >> 8);
  160.           out[9] = (u8)(ax);
  161.           out[10] = (u8)(ay >> 8);
  162.           out[11] = (u8)(ay);
  163.           out[12] = (u8)(az >> 8);
  164.           out[13] = (u8)(az);
  165.     out[14] = (u8)(temp >> 8);
  166.           out[15] =        (u8)(temp);
  167. ……………………

  168. …………限于本文篇幅 余下代碼請從51黑下載附件…………
復(fù)制代碼

所有資料51hei提供下載:
代碼.7z (698.94 KB, 下載次數(shù): 119)




分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏2 分享淘帖 頂 踩
回復(fù)

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規(guī)則

手機版|小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術(shù)交流QQ群281945664

Powered by 單片機教程網(wǎng)

快速回復(fù) 返回頂部 返回列表
主站蜘蛛池模板: 亚洲精品一区中文字幕 | 亚洲精品久久 | 欧美日韩亚洲国产 | 国产 欧美 日韩 一区 | 毛片99 | 在线成人精品视频 | 99免费在线视频 | 亚洲国产成人精品女人久久久 | 婷婷中文字幕 | 久久精品二区 | 欧美中文字幕一区二区三区亚洲 | 日韩av中文 | 成人性视频在线播放 | 免费福利视频一区二区三区 | 国产在线观看一区二区三区 | 情侣黄网站免费看 | 一区二区三区免费 | 成人在线精品视频 | 911网站大全在线观看 | 黄色三级在线播放 | 99久久精品国产毛片 | 久在线 | 精品中文字幕一区二区 | 国产精品99久久久久久www | 午夜精品久久久久久久星辰影院 | 欧美一二精品 | 亚洲视频一区在线 | 91香蕉视频在线观看 | 精品久久久网站 | 日韩精品视频在线 | 欧美一区二区三区视频在线播放 | 国产精品日韩欧美一区二区 | 97伦理电影网 | 欧美日韩国产精品一区 | 四色永久 | 手机看片1 | 中文av在线播放 | 欧美激情亚洲激情 | 日日日视频 | www国产成人免费观看视频,深夜成人网 | 国产精品久久久久久久久久久久 |