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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

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

stm32平衡車源碼

[復制鏈接]
ID:402452 發表于 2018-11-25 20:06 | 顯示全部樓層 |閱讀模式
單片機源程序如下:
  1. #include "sys.h"

  2. /**************************************************************************************************

  3. 程序作者:CUIT 3+1 Taocr


  4. ***************************************************************************************************/


  5. extern u16 Gyro_y, Gyro_z;
  6. u8 time_20ms, timer_5_flag, timer_10_flag;

  7. u8 Turn_Off(float angle)
  8. {
  9.             u8 temp;
  10.                         if(angle<-40||angle>40)
  11.                         {                                                         //===傾角大于40度關閉電機
  12.       temp=1;                                            //===Flag_Stop置1關閉電機
  13.                         PWMA2 = 0;
  14.                         PWMB2 = 0;
  15.                         PWMA1 = 0;
  16.                         PWMB1 = 0;
  17.       }
  18.                         else
  19.       temp=0;
  20.       return temp;                       
  21. }

  22. int velocity(int encoder_left,int encoder_right)
  23. {  
  24.     static float Velocity,Encoder_Least,Encoder,Movement;
  25.           static float Encoder_Integral;
  26.           float kp=300,ki=1.5;
  27.           //=============遙控前進后退部分=======================//
  28. //                if(1==Flag_Qian)        Movement=90/Flag_sudu;                     //===如果前進標志位置1 位移為負
  29. //                else if(1==Flag_Hou)          Movement=-90/Flag_sudu;        //===如果后退標志位置1 位移為正
  30. //          else  
  31.         Movement=0;       
  32.    //=============速度PI控制器=======================//       
  33.                 Encoder_Least =(encoder_left+encoder_right)-0;  //===獲取最新速度偏差==測量速度(左右編碼器之和)-目標速度(此處為零)
  34.                 Encoder *= 0.8;                                         //===一階低通濾波器      
  35.                 Encoder += Encoder_Least*0.2;                     //===一階低通濾波器   
  36.                 Encoder_Integral +=Encoder;                                  //===積分出位移 積分時間:10ms
  37.                 Encoder_Integral=Encoder_Integral-Movement;                  //===接收遙控器數據,控制前進后退
  38.                 if(Encoder_Integral>10000)          Encoder_Integral=10000;         //===積分限幅
  39.                 if(Encoder_Integral<-10000)        Encoder_Integral=-10000;         //===積分限幅       
  40.                 Velocity=Encoder*kp+Encoder_Integral*ki; //===速度控制       
  41.                 if(Turn_Off(Pitch)==1)   Encoder_Integral=0;    //===電機關閉后清除積分
  42.           return Velocity;
  43. }

  44. int turn(int encoder_left,int encoder_right,float gyro)//轉向控制
  45. {
  46.           static float Turn_Target,Turn,Encoder_temp,Turn_Convert=0.9,Turn_Count;
  47.           float Turn_Amplitude=88/2,Kp=42,Kd=0;     
  48.           //=============遙控左右旋轉部分=======================//
  49. //          if(1==Flag_Left||1==Flag_Right)                      //這一部分主要是根據旋轉前的速度調整速度的起始速度,增加小車的適應性
  50. //                {
  51. //                        if(++Turn_Count==1)
  52. //                        Encoder_temp=myabs(encoder_left+encoder_right);
  53. //                        Turn_Convert=50/Encoder_temp;
  54. //                        if(Turn_Convert<0.6)Turn_Convert=0.6;
  55. //                        if(Turn_Convert>3)Turn_Convert=3;
  56. //                }       
  57. //          else
  58. //                {
  59.                         Turn_Convert=0.9;
  60.                         Turn_Count=0;
  61.                         Encoder_temp=0;
  62. //                }                       
  63. //                if(1==Flag_Left)                   Turn_Target-=Turn_Convert;
  64. //                else if(1==Flag_Right)             Turn_Target+=Turn_Convert;
  65. //                else
  66.                         Turn_Target=0;
  67.        
  68.     if(Turn_Target>Turn_Amplitude)  Turn_Target=Turn_Amplitude;    //===轉向速度限幅
  69.           if(Turn_Target<-Turn_Amplitude) Turn_Target=-Turn_Amplitude;
  70. //                if(Flag_Qian==1||Flag_Hou==1)  Kd=1;        
  71. //                else
  72.                         Kd=0;   //轉向的時候取消陀螺儀的糾正 有點模糊PID的思想
  73.           //=============轉向PD控制器=======================//
  74.                   Turn=-Turn_Target*Kp -gyro*Kd;                 //===結合Z軸陀螺儀進行PD控制
  75.           return Turn;
  76. }


  77. int main(void)
  78. {       
  79.         int Speed_R, Speed_L;       
  80.          int Motol_PWM, Moto2_PWM;
  81.          int flag = 0;
  82.          u8 Right_Flag = 0;

  83.         delay_init();                                                                     //延時初始化
  84.         NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);// 設置中斷優先級分組2
  85.         LED_Init();
  86.   LCD_init();//OLED初始化
  87.         LCD_clear();//顯示屏清屏       
  88.         PWM_Init(7199,0);
  89.         Encoder_Init_TIM3();
  90.         Encoder_Init_TIM2();
  91.         uart_init(115200);                           //初始化串口1
  92.         IIC_Init();                     //模擬IIC初始化
  93.   MPU6050_initialize();           //=====MPU6050初始化       
  94.         DMP_Init();                     //初始化DMP
  95. //        NRF24L01_Init();            //初始化NRF24L01           
  96.          

  97. //while(NRF24L01_Check())        //檢查NRF24L01是否在位.       
  98. //        {
  99. //                delay_ms(200);
  100. //                 delay_ms(200);
  101. //        }
  102. printf("NRF24L01Ready!");
  103.   Timer1_Init(29,7199);
  104.         while(1)
  105.         {               
  106.                 if(time_20ms == 10)
  107.                 {
  108.                         time_20ms = 0;
  109.                 printf("X軸傾角%f  Y軸傾角%d   轉向角%d  \r\n",Pitch,Speed_R,Speed_L);//向上位機發送數據
  110.                         show_size8float4_2f(0,0,Roll);
  111.                         show_size8float4_2f(0,4,Right_Flag);
  112.                         time_20ms = 0;}
  113.                 if(timer_5_flag == 1)
  114.                 {
  115.                         timer_5_flag = 0;
  116.                         timer_10_flag = !timer_10_flag;
  117. //                        if(timer_10_flag == 0)
  118. //                        {
  119.                                 Read_DMP();
  120. //                        }
  121.                         Speed_R = Read_Encoder(2);
  122.                         Speed_L = Read_Encoder(3);
  123.                        
  124.                         Motol_PWM = 650*(Roll-5)+0.5*gyro[0]-velocity(Speed_L,Speed_R);//+turn(Speed_L,Speed_R,gyro[2]);
  125.                         Moto2_PWM = 200*(Pitch)+1.5*gyro[1];//-velocity(Speed_L,Speed_R);//-turn(Speed_L,Speed_R,gyro[2]);
  126.                         if(Roll>15&&flag<10000){Motol_PWM = 5000;flag++;}
  127.                         if(Roll<-15&&flag<10000){Motol_PWM = -5000;flag++;}
  128.                         if(Motol_PWM>=0)
  129.                         {
  130.                                 if(Right_Flag == 0)
  131.                                 Right_Flag = 1;
  132.                                 PWMA1 = Motol_PWM;
  133.                                 PWMB1 = Motol_PWM;
  134.                                 PWMA2 = 1;
  135.                                 PWMB2 = 1;
  136.                         }
  137.                         else
  138.                         {
  139.                                 if(Right_Flag == 0)
  140.                                 Right_Flag = 2;
  141.                                 PWMA2 = -Motol_PWM;
  142.                                 PWMB2 = -Motol_PWM;
  143.                                 PWMA1 = 1;
  144.                                 PWMB1 = 1;
  145.                         }
  146.                 }
  147.                 if(Turn_Off(Pitch)==1){}
  148.                                
  149.         }          
  150. }

  151. int TIM1_UP_IRQHandler(void)  
  152. {   
  153.         if(TIM1->SR&0X0001)//5ms定時中斷
  154.         {   
  155.                   TIM1->SR&=~(1<<0);                                       //===清除定時器1中斷標志位       
  156.                         time_20ms++;       
  157.                         timer_5_flag = 1;               
  158.         }
  159.         return 0;
  160. }
復制代碼

所有資料51hei提供下載:
平衡車源碼.rar (393.04 KB, 下載次數: 25)


回復

使用道具 舉報

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

本版積分規則

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 国产农村妇女毛片精品久久麻豆 | 色婷婷综合成人av | 黄色精品| 久久精品国产一区二区三区 | 在线日韩中文字幕 | 成人av播放 | 久久精品99国产精品日本 | 欧美日韩视频在线第一区 | 国产天堂| 红桃视频一区二区三区免费 | 亚洲每日更新 | 国产精品精品久久久 | 欧美一级三级在线观看 | 东方伊人免费在线观看 | 亚洲精品一区二区三区 | av官网在线| 国产玖玖| 91精品国产91久久久久游泳池 | 中文字幕在线观看日韩 | 午夜影院操 | 欧美国产精品一区二区 | 亚洲视频免费 | 亚洲欧美日韩系列 | 国产成人精品久久二区二区91 | 精品1区2区| 视频一区二区三区中文字幕 | 69福利影院| 韩日一区二区三区 | 日日干日日操 | 久久极品| 欧美一二三 | 久久久久9999 | 一区二区三区精品视频 | 天天操网| 亚洲国产精品一区二区久久 | 免费在线观看一区二区 | 精品av久久久久电影 | 激情三区| 日本成人久久 | 奇米影视首页 | 欧美精品一区二区三区在线播放 |