找回密码
 立即注册

QQ登录

只需一步,快速开始

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

有关自平衡车的STM32代码

[复制链接]
跳转到指定楼层
楼主
ID:385079 发表于 2018-8-28 21:47 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本人在大二期间做的平衡车项目有关的程序,大家可以参考一下

stm32单片机源码:
  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************************************************************/
复制代码

所有资料51hei提供下载:
自平衡车程序.rar (580.86 KB, 下载次数: 11)


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

使用道具 举报

沙发
ID:1 发表于 2018-8-29 03:13 | 只看该作者
补全原理图+详细说明一下即可获得100+黑币
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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