找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 18452|回复: 14
打印 上一主题 下一主题
收起左侧

自己做了一个平衡车,共享一下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, 下载次数: 218)
这里还有一个是我平衡车3D模型,可以进行3D打印:





平衡车3D模型.zip

771.74 KB, 下载次数: 58, 下载积分: 黑币 -5

评分

参与人数 3黑币 +70 收起 理由
luliang02003 + 10 共享资料的黑币奖励!
songfengyi + 10 共享资料的黑币奖励!
admin + 50 共享资料的黑币奖励!

查看全部评分

分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏12 分享淘帖 顶1 踩
回复

使用道具 举报

沙发
ID:1 发表于 2018-8-6 17:39 | 只看该作者
好东东 能补一下图吗?本站所有会员等级都能发图的
回复

使用道具 举报

板凳
ID:381406 发表于 2018-8-6 17:47 | 只看该作者
admin 发表于 2018-8-6 17:39
好东东 能补一下图吗?本站所有会员等级都能发图的

好的,我先拍下图片,谢谢您

评分

参与人数 1黑币 +100 收起 理由
admin + 100 共享资料的黑币奖励!

查看全部评分

回复

使用道具 举报

地板
ID:383832 发表于 2018-8-7 17:45 | 只看该作者
非常不错,有图更好
回复

使用道具 举报

5#
ID:273087 发表于 2018-8-15 16:04 | 只看该作者
厉害厉害
回复

使用道具 举报

6#
ID:321034 发表于 2018-9-3 13:58 | 只看该作者
老哥~  你车轮和电机在哪买的 连接可以发一下不
回复

使用道具 举报

7#
ID:379452 发表于 2018-9-5 13:34 | 只看该作者
这也太强了吧
回复

使用道具 举报

8#
ID:403941 发表于 2018-9-30 10:08 | 只看该作者
为什么打不开,只要头文件,没有可以打开的程序
回复

使用道具 举报

9#
ID:169916 发表于 2018-11-14 10:38 | 只看该作者
好东西,谢谢分享,最近在做两轮平衡小车
回复

使用道具 举报

10#
ID:457495 发表于 2018-12-28 17:34 | 只看该作者
有用什么 传感器吗
回复

使用道具 举报

11#
ID:280082 发表于 2019-2-21 14:14 | 只看该作者
参考一下
回复

使用道具 举报

12#
ID:250818 发表于 2019-7-6 06:50 来自手机 | 只看该作者
谢谢楼主分享
回复

使用道具 举报

13#
ID:648092 发表于 2019-11-23 21:30 | 只看该作者
感谢分享
回复

使用道具 举报

14#
ID:520507 发表于 2019-12-24 20:37 来自手机 | 只看该作者
大佬,请问下使用扭力和减速比与你的不同的电机,需要修改程序的哪里?
回复

使用道具 举报

15#
ID:894365 发表于 2021-3-20 16:53 | 只看该作者
楼主牛逼
!!!!
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表