找回密码
 立即注册

QQ登录

只需一步,快速开始

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

STM32倒立摆平衡源代码

[复制链接]
跳转到指定楼层
楼主
ID:514559 发表于 2019-7-26 13:13 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式

  1. #include "stm32f10x.h"
  2. #include "led.h"
  3. #include "delay.h"
  4. #include "usart1.h"
  5. #include "135.h"
  6. #include "time.h"
  7. #include "moto.h"
  8. #include "adc.h"
  9. #include "PID.h"
  10. #include "inv_mpu.h"
  11. #include "inv_mpu_dmp_motion_driver.h"
  12. #include "mpu6050.h"

  13. /*使用的资源      老王2017/7/13   --倒立摆
  14. 串口1:TX--PA9    RX--PA10
  15. key:PE0 ~ 9  上拉输入
  16. LED: PD8 9 10    推挽输出
  17. OLED: 3.3v  
  18. D0(SCLK)--PC0 | D1(SDIN)--PC1 | RST--PG15 | DS-- PD3| CS--PD6 | RST--PG15
  19. 角度传感器:PB0
  20. */


  21. //#define zero_angle  3195
  22. #define ok_angle 230//倒立时候的传感器的值
  23. //#define task2_start_angle  1250  

  24. vu16 len=0;//串口1接收数据的长度
  25. u8 task_flag=0;

  26. extern int pwm;
  27. extern int flag;
  28. extern int number;

  29. short aacx,aacy,aacz;                   //加速度传感器原始数据 --三轴加速度
  30. short gyrox,gyroy,gyroz;         //陀螺仪原始数据       --三轴角速度
  31. float pitch,roll,yaw;            //欧拉角 x z y  

  32. int adc_result;
  33. u8 dis_flag=0;


  34. void Init(void)  // 初始化函数
  35. {
  36.        
  37.        
  38.   delay_init();
  39.         NVIC_PriorityGroupConfig(NVIC_PriorityGroup_4);         //设置NVIC中断分组2:2位抢占优先级,2位响应优先级
  40.         LED_Init();       
  41.         adc_config();        //传感器        
  42.         DC_motor_init();
  43.   DC_Set_Pwm (0);
  44.         time5_Init(9999,71); //1ms控制
  45.   time4_Init(9999,71); //1ms控制               
  46.         LocPIDInit(); //位移式PID初始化
  47.         LocPIDSet(ok_angle);//设定初值
  48.         uart_init(112500);
  49.         time3_PWM_Init(5000,71);         //不分频。PWM频率=72000000/900=80Khz   越大却快(370-899)
  50. }

  51. int main()
  52. {        
  53.         Init();               

  54.         while(1)
  55.         {
  56.                 int pwm;
  57.                 int right,left;
  58.                 int dig_right,dig_left;
  59.                
  60.                  right=ok_angle+50;
  61.                  left=ok_angle-50;
  62.                  dig_right=ok_angle+500;
  63.                  dig_left=ok_angle-2000;
  64.                  adc_result =  Get_Adc();
  65.                
  66.                 if(adc_result>=dig_left && adc_result<=dig_right )
  67.           {
  68.                  LocP_I_D_Set(10,0,10);  //PID参数的赋予                       
  69.      pwm=LocPIDCalc(adc_result);                       
  70.                  DC_Set_Pwm(pwm);                               
  71.     if(pwm>999) pwm=999;
  72.    else if(pwm<-999) pwm=-999;               
  73.                 }

  74.                  if(adc_result>=left&& adc_result<=right) DC_Set_Pwm(0);   //降低灵敏性       
  75.            if(adc_result>dig_right&& adc_result<4100)   DC_Set_Pwm(0);
  76.            else if(adc_result<dig_left)   DC_Set_Pwm(0);
  77.      printf("pwm==%d\r",pwm);
  78.      printf("    adc==%d\r\n",adc_result);
  79.   }

  80.        
  81. /*void renwu_2(void)
  82. {
  83.                 
  84.   while(1)
  85.         {
  86.        
  87.     int right,left;
  88.                 int dig_right,dig_left;
  89.                
  90.                 right=ok_angle+5;
  91.                 left=ok_angle-5;
  92.                 dig_right=ok_angle+330;
  93.                 dig_left=ok_angle-330;
  94.                 adc_result =  Get_Adc();
  95.        
  96.                 if((adc_result>0&&adc_result<dig_left)||(adc_result>dig_right&&adc_result<4100))
  97.                 {       
  98.                  TIM_Cmd(TIM4, ENABLE);  //使能TIM4       
  99.      if(flag==1)                        DC_Set_Pwm(610);                  
  100.                  else if(flag==2)   DC_Set_Pwm(-610);
  101.      }                            
  102.            else if(adc_result>=dig_left && adc_result<=dig_right )
  103.            {
  104.                   TIM_Cmd(TIM4, DISABLE);  //关闭TIM4       
  105.                   number=0;
  106.                         flag=0;
  107.                   LocP_I_D_Set(20,2.1,80);  //PID参数的赋予
  108.       pwm=LocPIDCalc(adc_result);                       
  109.                   DC_Set_Pwm(pwm);               
  110.       if(pwm>899) pwm=899;
  111.             else if(pwm<-899) pwm=-899;                               
  112.                   if(adc_result>=left&& adc_result<=right) DC_Set_Pwm(0);   //降低灵敏性       
  113.                  }
  114.       printf("adc==%d\r\n",adc_result);
  115.                 }   
  116. }*/
  117. }
复制代码


倒立摆.7z

231.61 KB, 下载次数: 9, 下载积分: 黑币 -5

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

使用道具 举报

沙发
ID:514559 发表于 2019-7-26 13:14 | 只看该作者
谢谢谢谢
回复

使用道具 举报

板凳
ID:1 发表于 2019-7-27 00:38 | 只看该作者
本帖需要重新编辑补全电路原理图,源码,详细说明与图片即可获得100+黑币(帖子下方有编辑按钮)
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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