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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 8927|回復: 0
收起左側

STM32平衡車程序+原理圖(步進電機)

[復制鏈接]
ID:591632 發表于 2020-8-19 10:43 | 顯示全部樓層 |閱讀模式
自平衡車主控為STM32f103r
平衡車硬件總體設計,平衡車以STM32為主控芯片,通過處理從各個傳感器返回的數據使小車達到動態平衡以及遙控的實現。
平衡車的軟件結構分為四大部分,各個部分之間相互關聯。軟件總體結構:OLED顯示實時數據、按鍵調試各項參數部分;串口和超聲波部分解析有關指令部分;PID控制器輸出控制部分。在串口和超聲波部分獲取控制指令后,傳輸給PID控制器,最終由PID計算控制器輸出相應PWM值控制電機,以保持平衡車的平衡。主控芯片在接收MPU6050傳感器返回的角度值與角加速度值后,對返回數據進行一階互補濾波處理。一階互補濾波算法將角度數據進行融合,降低MPU6050傳感器的噪聲信號的影響,從而得到準確的平衡車當前姿態。STM32主控芯片通過直立的PD控制器得到較為準確的PWM輸出控制數值,控制電機轉動使得小車實現基本平衡。為了減小小車的左右偏移幅度,將MPU6050返回的Z軸轉動量輸出到轉向PD控制器進行計算,再將轉向PWM增量值與直立PWM增量進行疊加輸出,得到較為準確的PWM控制值,從而使小車保持直立狀態。在Android手機上安裝一個第三方藍牙遙控APP,由APP發出的相應控制指令。系統通過藍牙模塊接收控制指令,再由串口中斷接收藍牙模塊控制數據,之后系統進行控制指令的解析得到控制輸出值,控制小車前后左右的行駛動作。在實際的測試過程中,發現藍牙的有效控制距離為8米左右,并且手機與藍牙模塊的容易被各種因素干擾,使小車在控制距離較遠的位置失去控制。建議大家使用NRF或其它控制信號較遠的模塊進行通訊,從而實現相對較遠的距離控制。

單片機源程序如下:
  1. /******************** (C) COPYRIGHT 2014 POWSOS Team **************************
  2. * 文件名  :main.c
  3. * 描述    :     
  4. * 實驗平臺:STM32F103RBT6
  5. * 庫版本  :ST3.5.0
  6. * 作者    :  Powsos_Team
  7. * 版本    :V2.0
  8. * 日期    :2014.8.23
  9. * 修訂歷史:V2.0
  10. ******************************************************************************/

  11. #include "stm32f10x.h"
  12. #include "iic.h"
  13. #include "timer.h"
  14. #include "usart.h"
  15. #include "mpu6050.h"
  16. #include "filter.h"
  17. #include "calculate.h"
  18. #include "gpio.h"
  19. #include "time_test.h"
  20. #include "hc_sr04.h"
  21. #include "delay.h"
  22. #include <stdio.h>
  23. #include <math.h>


  24. //#define Debug  

  25. #define GX_OFFSET 0x01
  26. #define AX_OFFSET 0x01
  27. #define AY_OFFSET 0x01
  28. #define AZ_OFFSET 0x01


  29. #define duoji_offset  120

  30. extern u8  duoji_flag;
  31. extern u8 duoji_cnt;
  32. extern u16 time;
  33. extern u8 duoji_pwm;

  34. u8 hcsr04_test_flag = 0;
  35. u8 receive_data;
  36. u8 flg_get_senor_data;
  37. u8 out[35]  ={0x5f, 0x60, 0};
  38. u8 Duoji_direction = 1;  /*1,前方,2:左邊   3:右邊,舵機*/
  39. u8 Move_direcetion = 1;  /*1靜止  2,前方, 3,后退 4:左邊   5:右邊 小車運行方向*/
  40. u16 distance =0 ;
  41. int  pulsewidth;
  42. float angle, angle_dot, f_angle, f_angle_dot;
  43. s16 temp;
  44. s16 gx, gy, gz, ax ,ay, az, temperature;

  45. #define FILTER_COUNT  16
  46. s16 gx_buf[FILTER_COUNT], ax_buf[FILTER_COUNT], ay_buf[FILTER_COUNT],az_buf[FILTER_COUNT];
  47. /******************************************************************************/
  48. void delay(u32 count)
  49. {
  50.   for(; count != 0; count--);
  51. }
  52. /*************************************************

  53. 名稱:void acc_filter(void)
  54. 功能:加速度計數據濾波
  55. 輸入參數:據濾波后的數據
  56. 輸出參數:無
  57. 返回值:  無
  58. **************************************************/
  59. void acc_filter(void)
  60. {
  61.   u8 i;
  62.   s32 ax_sum = 0, ay_sum = 0, az_sum = 0;

  63.   for(i = 1 ; i < FILTER_COUNT; i++)
  64.   {
  65.     ax_buf[i - 1] = ax_buf[i];
  66.         ay_buf[i - 1] = ay_buf[i];
  67.         az_buf[i - 1] = az_buf[i];
  68.   }

  69.   ax_buf[FILTER_COUNT - 1] = ax;
  70.   ay_buf[FILTER_COUNT - 1] = ay;
  71.   az_buf[FILTER_COUNT - 1] = az;

  72.   for(i = 0 ; i < FILTER_COUNT; i++)
  73.   {
  74.     ax_sum += ax_buf[i];
  75.         ay_sum += ay_buf[i];
  76.         az_sum += az_buf[i];
  77.   }

  78.   ax = (s16)(ax_sum / FILTER_COUNT);
  79.   ay = (s16)(ay_sum / FILTER_COUNT);
  80.   az = (s16)(az_sum / FILTER_COUNT);
  81. }

  82. /* I/O口模擬輸出PWM控制舵機,50hz */
  83. void servopulse(int myangle)//定義一個脈沖函數
  84. {
  85.          // EA = 0;
  86.         //  pulsewidth = (((myangle+duoji_offset)*25)+500)/1000;;// 舵機中心值可能會偏,修改20,做調整
  87.         pulsewidth =myangle;

  88. }

  89. /*****************************************************************************/
  90. int main(void)
  91. {
  92.         SystemInit();
  93.         delay_init(72);
  94.         gpio_init();       
  95.         delay(0x80000);
  96.     usart_init();                                          
  97.     iic_init();
  98.     timer_init();
  99.     TIM1_Configuration();
  100.     HCSR04_Init();
  101.     motor_init();
  102.         mpu6050_init();
  103.         STOP_TIME;
  104.         duoji_flag =1;
  105.         duoji_cnt = 0;
  106.         servopulse(3);/*上電將舵機放至中間*/
  107.          while (1)
  108.         {
  109.             if(flg_get_senor_data)
  110.             {
  111.               flg_get_senor_data = 0;
  112.               mpu6050_get_data(&gx, &gy, &gz, &ax, &ay , &az, &temperature);
  113.                   acc_filter();       

  114.                   gx-=  GX_OFFSET;
  115.                   ax -= AX_OFFSET;
  116.                   ay -=        AY_OFFSET;
  117.                   az -= AZ_OFFSET;

  118.             angle_dot = gx * GYRO_SCALE;  //+-2000  0.060975 °/LSB   //陀螺儀
  119.               angle = atan(ay / sqrt(ax * ax + az * az ));
  120.              
  121.              angle = angle * 57.295780;    //180/pi


  122.                  kalman_filter(angle, angle_dot, &f_angle, &f_angle_dot);//     加速度計計算的角度, 陀螺儀角速度 , 融合后的角度, 融合后的角速度
  123.                    receive_parameter(receive_data);

  124.                    pid(f_angle, f_angle_dot);

  125. #ifdef  Debug
  126.                               temp = (s16)(f_angle * 100);
  127.              
  128.                                  out[2] = (u8)(gx >> 8);
  129.                     out[3] = (u8)(gx);
  130.                                  out[4] = (u8)(gy >> 8);
  131.                                  out[5] = (u8)(gy);
  132.                                  out[6] = (u8)(gz >> 8);
  133.                                  out[7] = (u8)(gz);
  134.                                  out[8] = (u8)(ax >> 8);
  135.                                  out[9] = (u8)(ax);
  136.                                  out[10] = (u8)(ay >> 8);
  137.                                  out[11] = (u8)(ay);
  138.                                  out[12] = (u8)(az >> 8);
  139.                                  out[13] = (u8)(az);
  140.                            out[14] = (u8)(temp >> 8);
  141.                                  out[15] = (u8)(temp);

  142.                                 USART_SendStringData(USART1,&out[0],16);

  143. #endif
  144.           
  145.                        
  146.             }  //end if               
  147.        
  148.                
  149.     if(hcsr04_test_flag)
  150.     {
  151.                  hcsr04_test_flag=0;                 
  152.                  measure_distance(receive_data);
  153.                                          
  154.                  switch(Duoji_direction)
  155.                  {
  156.                         case Duoji_Front:        USART_printf(USART2,"Front_distance: %d cm\r\n",distance);break;
  157.                         case Duoji_Left:        USART_printf(USART2,"Left_distance: %d cm\r\n",distance);break;
  158.                         case Duoji_Right:        USART_printf(USART2,"Right_distance: %d cm\r\n",distance);break;
  159.                  }
  160.                  
  161.                  
  162.         }
  163.         #if  0
  164.         /*若前方距離小于100,并且小車行駛方向是往前的,此時小車需要停止*/       
  165.         if((distance<50)&&(Move_direcetion==Move_front))
  166.         {                               
  167.                 receive_data ='s';
  168.         }
  169.                
  170.         #endif

  171.   }  
  172.        
  173. }

  174. /*****************END OF FILE************************************************************/
復制代碼

下載: STM32平衡車程序+原理圖(步進電機).7z (588.1 KB, 下載次數: 173)
回復

使用道具 舉報

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

本版積分規則

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 精品电影 | 日韩视频专区 | www日本高清 | 天天草天天操 | 国产亚洲一区二区精品 | 久久久久久成人 | 国产精品久久精品 | 久久精品在线免费视频 | 亚洲欧美精 | 日韩成人在线视频 | av在线免费观看不卡 | 毛片com | 亚洲激情一级片 | 天堂网中文字幕在线观看 | 看特级黄色片 | 成人精品视频在线 | 国产福利在线 | 国产欧美精品一区二区三区 | 国产羞羞视频在线观看 | 国产在线激情视频 | 91视频网址 | 国产精品久久久久影院色老大 | av一级一片 | 国产成人99久久亚洲综合精品 | 亚洲国产精品久久 | 欧美日韩专区 | 日韩av一区二区在线观看 | 日本精品一区二区在线观看 | 最新av在线网址 | 欧美精品一区在线 | 精品视频网 | 91精品久久久久久久久中文字幕 | 国内精品伊人久久久久网站 | a在线视频 | 国产电影一区二区在线观看 | 欧美日日 | 国产精品18久久久 | 免费在线观看成人av | 一级毛片视频在线观看 | 男人天堂网址 | 午夜日韩 |