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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 2313|回復: 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)


分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏2 分享淘帖 頂 踩
回復

使用道具 舉報

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

本版積分規則

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 99热.com | 精品熟人一区二区三区四区 | 黄网站免费观看 | 免费在线观看av网站 | 女人夜夜春 | 天天看天天干 | 中文在线播放 | 一区在线播放 | 天天色综 | 久久最新网址 | av喷水| 午夜免费视频 | 国产一级成人 | 精品日韩电影 | 亚洲欧美高清 | 婷婷久久综合 | 麻豆视频在线免费观看 | a级片在线 | 操操网站 | 美女视频黄色片 | 成人在线一区二区 | 老头搡老女人毛片视频在线看 | 欧美日本在线观看 | 国产精品美女一区二区 | 国产精品久久久久久久久久久久久 | 成人h动漫精品一区二区器材 | 在线日韩欧美 | 中文字幕免费在线 | 91精品在线观看入口 | 久久久久久九九九九 | 羞羞网站免费观看 | 国产成人久久精品 | 91久久久久久久久久久 | 成人在线黄色 | 久久伊人亚洲 | 欧美在线a | 国产精品视频网址 | 久久一区二| 中文字幕电影在线观看 | 国产一区二区三区免费视频 | 亚洲精品一区二区三区中文字幕 |