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

標題: 自己做了一個平衡車,共享一下STM32程序代碼 [打印本頁]

作者: zhangzhoulzl    時間: 2018-8-6 17:27
標題: 自己做了一個平衡車,共享一下STM32程序代碼
本帖最后由 zhangzhoulzl 于 2018-8-6 18:00 編輯

這個平衡車是我這個暑假的作品,因為之前主要是在硬件方面學習,現在想在軟件方面加深點,并且學下PID,明白之后發現PID其實不是很難,難在調整各種參數。因為剛剛完成,所以程序注解不是很詳細,所以不好意思,主控芯片是STM32f103,驅動使用L298N,電機使用帶編碼器電機,因為我有一個編碼器電機的編碼器是壞的,所以只用了一個,但是程序里兩個都寫好了,到手直接改下就好。照片會員等級太低了不好發,所以就只能文字描述了哈哈。
補下圖片:


電池:(3顆18650組成12V,賊丑)

電機驅動板L298N:

編碼電機:

STM32F103ZET6主控板:(實際應用中STM32F103C8T6足以,因為不要錢的所以用這塊板)以及NFR24L01模塊用作無限遙控,因為這部分比較簡答,所以展示還沒寫:

車身結構是3D打印的,上部分沒打好還有超聲波模塊支架,下面附加的模型內有
單片機源程序如下:

  1. #include "stm32f10x.h"
  2. #include "sys.h"
  3. #include "PWM.h"
  4. #include "delay.h"
  5. #include "usart.h"        
  6. #include "mpu6050.h"
  7. #include "inv_mpu.h"
  8. #include "inv_mpu_dmp_motion_driver.h"
  9. #include "LED.h"
  10. #include "encode.h"
  11. #include "oled.h"
  12. #include "pid.h"
  13. #include "timer.h"
  14. #include "key.h"

  15. extern float Count;  ///編碼器故障,展示只有編碼器2有用
  16. extern float Count2;
  17. extern float countD_value;
  18. extern float Old_Count;
  19. extern float Old_Count2;
  20. extern float countD_value2;
  21. extern float count_AND;

  22. u16        Parameter = 1881;                                                                                                                                        //輸入編碼器線數
  23. //u8 t=0,report=1;                        //默認開啟上報
  24. u8 key;
  25. float pitch,roll,yaw;                 //歐拉角
  26. short aacx,aacy,aacz;                //加速度傳感器原始數據
  27. short gyrox,gyroy,gyroz;        //陀螺儀原始數據
  28. short temp;                                        //溫度        
  29. float PIDoutALL;


  30. void int_all(void);
  31. void Get_Data(void);






  32. int main(void)
  33. {  
  34.         int_all();
  35.         while(1)
  36.         Get_Data();
  37.         
  38. }
  39.          
  40.         




  41. void int_all(void)
  42. {
  43.     uart_init(115200);
  44.           NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);         //設置NVIC中斷分組2:2位搶占優先級,2位響應優先級
  45.           SystemInit();
  46.           delay_init();
  47.                 NVIC_Cfg();
  48.                 GPIO_Cfg();
  49.     TIM1_Init();
  50.     TIME2_INT(10,7199);//1ms        
  51.           TIM_Cfg();
  52.     TIM_Cmd(TIM3,ENABLE);
  53.           TIM4_Init();
  54.           OLED_Init();
  55.           MPU_Init();                                        //初始化MPU6050
  56.           LED1_INT();
  57.           Angle_PID_init();
  58.           Speed_PID_init();
  59.           KEY_Init();
  60. }


  61. void Get_Data(void)
  62. {
  63. //        u8 t=0,report=1;                        //默認開啟上報
  64. //        u8 key;
  65. //        float pitch,roll,yaw;                 //歐拉角
  66. //        short aacx,aacy,aacz;                //加速度傳感器原始數據
  67. //        short gyrox,gyroy,gyroz;        //陀螺儀原始數據
  68. //        short temp;                                        //溫度        
  69. //        NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);         //設置NVIC中斷分組2:2位搶占優先級,2位響應優先級
  70. //        delay_init();        //延時初始化
  71. //        usmart_dev.init(72);                //初始化USMART
  72. //        LED_Init();                                          //初始化與LED連接的硬件接口
  73. //        KEY_Init();                                        //初始化按鍵
  74. //        LCD_Init();                                           //初始化LCD  
  75. //        MPU_Init();                                        //初始化MPU6050
  76.         LED1=1;
  77.         LED2=1;
  78.         OLED_ShowStr(16, 0,"Balance Car",2);
  79. //  OLED_ON();

  80. //        while(mpu_dmp_init())
  81. //         {
  82.                 LED2=0;
  83.                 OLED_ShowStr(0, 2,"Int MPU6050 . ",2);
  84.                 delay_ms(300);
  85.                 OLED_ShowStr(0, 2,"Int MPU6050 ..",2);
  86.                 delay_ms(300);
  87.                 OLED_ShowStr(0, 2,"Int MPU6050 ...",2);
  88.                 delay_ms(300);
  89.                 OLED_ShowStr(0, 2,"               ",2);
  90. //        }  
  91.         OLED_ShowStr(0, 2,"MPU6050 Check Ok",2);
  92.          
  93. //        LCD_ShowString(30,130,200,16,16,"MPU6050 OK");
  94. //        LCD_ShowString(30,150,200,16,16,"KEY0:UPLOAD ON/OFF");
  95. //        POINT_COLOR=BLUE;//設置字體為藍色
  96. //         LCD_ShowString(30,170,200,16,16,"UPLOAD ON ");         
  97. //         LCD_ShowString(30,200,200,16,16," Temp:    . C");        
  98. //         LCD_ShowString(30,220,200,16,16,"Pitch:    . C");        
  99. //         LCD_ShowString(30,240,200,16,16," Roll:    . C");         
  100. //         LCD_ShowString(30,260,200,16,16," Yaw :    . C");         
  101.          while(1)
  102.         {
  103.                 key=KEY_Scan(0);
  104. //                if(key==KEY0_PRES)
  105. //                {
  106. //                        report=!report;
  107. //                        if(report)LCD_ShowString(30,170,200,16,16,"UPLOAD ON ");
  108. //                        else LCD_ShowString(30,170,200,16,16,"UPLOAD OFF");
  109. //                }
  110.                 LED1=1;
  111.                 if(mpu_dmp_get_data(&pitch,&roll,&yaw)==0)
  112.                 {
  113.                         temp=MPU_Get_Temperature();        //得到溫度值
  114.                         MPU_Get_Accelerometer(&aacx,&aacy,&aacz);        //得到加速度傳感器數據
  115.                         MPU_Get_Gyroscope(&gyrox,&gyroy,&gyroz);        //得到陀螺儀數據
  116. //                        if(report)mpu6050_send_data(aacx,aacy,aacz,gyrox,gyroy,gyroz);//用自定義幀發送加速度和陀螺儀原始數據
  117. //                        if(report)usart1_report_imu(aacx,aacy,aacz,gyrox,gyroy,gyroz,(int)(roll*100),(int)(pitch*100),(int)(yaw*10));
  118. //            if((t%10)==0)
  119. //                   {
  120.          pid.Pv=pitch;         //角度PID輸入
  121.                            pid2.Pv2=count_AND;   //速度PID輸入
  122.                         
  123.                                  Angle_PID_Calc();    //角度PID計算
  124.                            Speed_PID_Calc();    //速度PID計算
  125.                           
  126.                            PIDoutALL=pid2.OUT2+pid.OUT; //雙環PID合成
  127.                         
  128.                         
  129.                                  if(PIDoutALL<0)
  130.                                  ALL_right(-PIDoutALL+13);
  131.                                  if(PIDoutALL>0)
  132.                                  ALL_left(PIDoutALL+13);
  133.                                  
  134.                                  
  135.                                  
  136. //                                if(temp<0)
  137. //                                {
  138. ////                                        LCD_ShowChar(30+48,200,'-',16,0);                //顯示負號
  139. //                                        temp=-temp;                //轉為正數
  140. ////                                }else LCD_ShowChar(30+48,200,' ',16,0);                //去掉負號
  141. ////                                LCD_ShowNum(30+48+8,200,temp/100,3,16);                //顯示整數部分            
  142. ////                                LCD_ShowNum(30+48+40,200,temp%10,1,16);                //顯示小數部分
  143. //                                temp=pitch*10;
  144. //                                
  145. //                                
  146. //                                if(temp<0)
  147. //                                {
  148. ////                                        LCD_ShowChar(30+48,220,'-',16,0);                //顯示負號
  149. //                                        temp=-temp;                //轉為正數
  150. //                                }else LCD_ShowChar(30+48,220,' ',16,0);                //去掉負號
  151. //                                LCD_ShowNum(30+48+8,220,temp/10,3,16);                //顯示整數部分            
  152. //                                LCD_ShowNum(30+48+40,220,temp%10,1,16);                //顯示小數部分
  153. //                                temp=roll*10;
  154. //                                
  155. //                                
  156. //                                if(temp<0)
  157. //                                {
  158. //                                        LCD_ShowChar(30+48,240,'-',16,0);                //顯示負號
  159. //                                        temp=-temp;                //轉為正數
  160. //                                }else LCD_ShowChar(30+48,240,' ',16,0);                //去掉負號
  161. //                                LCD_ShowNum(30+48+8,240,temp/10,3,16);                //顯示整數部分            
  162. //                                LCD_ShowNum(30+48+40,240,temp%10,1,16);                //顯示小數部分
  163. //                                temp=yaw*10;
  164. //                                
  165. //                                
  166. //                                
  167. //                                if(temp<0)
  168. //                                {
  169. //                                        LCD_ShowChar(30+48,260,'-',16,0);                //顯示負號
  170. //                                        temp=-temp;                //轉為正數
  171. //                                }else LCD_ShowChar(30+48,260,' ',16,0);                //去掉負號
  172. //                                LCD_ShowNum(30+48+8,260,temp/10,3,16);                //顯示整數部分            
  173. //                                LCD_ShowNum(30+48+40,260,temp%10,1,16);                //顯示小數部分  
  174. //                                t=0;
  175. ////                                LED0=!LED0;//LED閃爍
  176. //                  }
  177.                 }
  178. //                t++;
  179.                 if(Old_Count != Count)                                                                                                                //如果先前的計數值與當前計數值不相等,說明編碼器已轉動打印當前數值
  180.                 {
  181.                         LED1=0;
  182.                         OLED_ShowStr(0, 0,"AUTO Parking Station",1);
  183.                 }
  184. //                                
  185.         }         
  186.         
  187. }
復制代碼

所有資料51hei提供下載:
平衡車.rar (379.73 KB, 下載次數: 221)
這里還有一個是我平衡車3D模型,可以進行3D打。





平衡車3D模型.zip

771.74 KB, 下載次數: 59, 下載積分: 黑幣 -5


作者: admin    時間: 2018-8-6 17:39
好東東 能補一下圖嗎?本站所有會員等級都能發圖的
作者: zhangzhoulzl    時間: 2018-8-6 17:47
admin 發表于 2018-8-6 17:39
好東東 能補一下圖嗎?本站所有會員等級都能發圖的

好的,我先拍下圖片,謝謝您
作者: aoppol    時間: 2018-8-7 17:45
非常不錯,有圖更好
作者: 英尚微電子    時間: 2018-8-15 16:04
厲害厲害
作者: 51dasttwbd    時間: 2018-9-3 13:58
老哥~  你車輪和電機在哪買的 連接可以發一下不
作者: leiteme    時間: 2018-9-5 13:34
這也太強了吧
作者: zhao13    時間: 2018-9-30 10:08
為什么打不開,只要頭文件,沒有可以打開的程序
作者: kongxiaofuzi    時間: 2018-11-14 10:38
好東西,謝謝分享,最近在做兩輪平衡小車
作者: 我么得感情    時間: 2018-12-28 17:34
有用什么 傳感器嗎

作者: 790045654    時間: 2019-2-21 14:14
參考一下
作者: dlm    時間: 2019-7-6 06:50
謝謝樓主分享
作者: llliu    時間: 2019-11-23 21:30
感謝分享
作者: longshugao123    時間: 2019-12-24 20:37
大佬,請問下使用扭力和減速比與你的不同的電機,需要修改程序的哪里?
作者: lianqingde    時間: 2021-3-20 16:53
樓主牛逼
。。!
作者: tian9082    時間: 2024-8-7 17:27
厲害,佩服佩服,我有個壞的平衡車能修好嗎
作者: 你好-----    時間: 2024-9-5 11:54
老哥,這機械位置結構也能站得起來,強啊




歡迎光臨 (http://m.zg4o1577.cn/bbs/) Powered by Discuz! X3.1
主站蜘蛛池模板: 欧美乱码精品一区二区三区 | 欧美一区二区三区在线观看 | 亚洲精品www | 国产精品久久久久无码av | 午夜视频免费在线观看 | 一区在线观看 | 99久久精品国产一区二区三区 | 欧美精品中文 | 国产日韩久久 | 黄色免费三级 | 日日操夜夜操天天操 | 中文字幕国产视频 | 日韩一区二区三区在线观看 | 亚洲 欧美 另类 综合 偷拍 | 亚洲视频一区在线观看 | 久久三级影院 | 一区二区三区av夏目彩春 | 久久专区 | 影音av | 无码一区二区三区视频 | 国产精品成人免费 | 欧美一级欧美一级在线播放 | 色婷婷久久久亚洲一区二区三区 | 精品久久ai电影 | 免费看a| 亚洲一区视频在线 | 天天玩天天干天天操 | 神马九九 | av特级毛片 | 国产美女在线免费观看 | 亚洲精品成人网 | 成人性视频在线播放 | 成人免费黄色 | 欧美在线国产精品 | 欧美精品三区 | 97国产精品视频人人做人人爱 | 美女一区二区在线观看 | 欧美日韩国产一区二区三区 | 国产a区 | 一区二区成人在线 | 午夜精品久久久久久久久久久久久 |