標題: 基于STM32的PS2遙控手柄,平衡車程序源碼 [打印本頁]

作者: xyl4702140088    時間: 2018-7-8 19:18
標題: 基于STM32的PS2遙控手柄,平衡車程序源碼
基于STM32的PS2遙控手柄,平衡車程序源碼

單片機源程序如下:
  1. /******************** (C) COPYRIGHT (2015)BST BALANCECAR **************************
  2. * 文件名  :main.c
  3. **********************************************************************************/
  4. //#include "stm32f10x.h"
  5. #include "mpu6050.h"
  6. #include "i2c_mpu6050.h"
  7. #include "motor.h"
  8. #include "upstandingcar.h"
  9. #include "SysTick.h"
  10. #include "led.h"
  11. #include "usart.h"
  12. #include "i2c.h"
  13. //#include "outputdata.h"
  14. #include "timer.h"
  15. #include "UltrasonicWave.h"
  16. //#include "stm32f10x_usart.h"
  17. #include "ps2.h"
  18. #include "delay.h"

  19. float gyz;
  20. int acc;
  21. int acc1;

  22. /*協(xié)議相關*/
  23. //extern u8 newLineReceived = 0;

  24. /*
  25. * 函數(shù)名:main
  26. * 描述  :主函數(shù)
  27. */
  28. int main(void)
  29. {       
  30.     u8 PS2_KEY = 0, X1=0,Y1=0,X2=0,Y2=0;
  31.         u16 num = 0;  
  32.        
  33.           SystemInit();                   //=====系統(tǒng)初始化
  34.         Timerx_Init(5000,7199);                                   //定時器TIM1
  35. //        UltrasonicWave_Configuration();            //超聲波初始化設置 IO口及中斷設置                            

  36.         //USART1_Config();                                                //串口1初始化 上位機
  37.         USART3_Config();                                                //串口3初始化 藍牙與USART3公用相同IO口
  38.        
  39.         TIM2_PWM_Init();                                           //PWM輸出初始化
  40.         MOTOR_GPIO_Config();                                  //電機IO口初始化
  41.           LED_GPIO_Config();
  42.        
  43. //   TIM3_External_Clock_CountingMode();           //左電機脈沖輸出外部中斷口PA7使用TIM3定時器用作為脈沖數(shù)計算
  44. //   TIM4_External_Clock_CountingMode();           //右電機脈沖輸出外部中斷口PB7使用TIM4定時器用作為脈沖數(shù)計算
  45.           TIM3_Encoder_Init();                       //編碼器獲取脈沖數(shù) PA6 7
  46.           TIM4_Encoder_Init();                       //編碼器獲取脈沖數(shù) PB6 7       
  47.         ////////////////////DMP/////////////////////////////////
  48.         i2cInit();                                                           //IIC初始化 用于掛靠在總線上的設備使用
  49.         delay_nms(10);                                                   //延時10ms
  50.         MPU6050_Init();                                                   //MPU6050 DMP陀螺儀初始化
  51.         PS2_Init();                                                           //PS2手柄初始化
  52.         SysTick_Init();                                                  //SysTick函數(shù)初始化       
  53.         CarUpstandInit();                                          //小車直立參數(shù)初始化
  54.         SysTick->CTRL |=  SysTick_CTRL_ENABLE_Msk;         //使能總算法時鐘
  55.         PrintChar("FFFFFFF \n");
  56.         while (1)
  57.         {

  58. //                 GPIO_ResetBits(GPIOC, GPIO_Pin_13);
  59.                 MPU6050_Pose();                                                 //獲取MPU6050角度狀態(tài)
  60. //                 gy0=gyro[0];
  61. //                 UltrasonicWave_StartMeasure();           //調(diào)用超聲波發(fā)送程序 給Trig腳 <10us 高電平                 
  62. //                 chaoshengbo();                               //計算超聲波測距距離
  63. //      printf("%d",ucBluetoothValue);
  64. //                printf("\t");
  65. //                printf("%f",BST_fSpeedControlOutNew);
  66. //                printf("\t");
  67. //                printf("%f",BST_fCarAngle);
  68. //                printf("\t");
  69. //                 printf("%f",BST_fLeftMotorOut);
  70. //                printf("\t");
  71. //                printf("\n");
  72.                 num++;
  73.                 if(num == 500)
  74.                 {
  75.                         num =0;

  76.                         PS2_KEY = PS2_DataKey();         //手柄按鍵捕獲處理
  77.                         switch(PS2_KEY)
  78.                         {
  79.                                 case PSB_SELECT:         PrintChar("PSB_SELECT \n");  break;
  80.                                 case PSB_L3:             g_newcarstate = enSTOP;  PrintChar("PSB_L3 \n");  break;  
  81.                                 case PSB_R3:             g_newcarstate = enSTOP;         PrintChar("PSB_R3 \n");  break;  
  82.                                 case PSB_START:          PrintChar("PSB_START \n");  break;  
  83.                                 case PSB_PAD_UP:         g_newcarstate = enRUN;   PrintChar("PSB_PAD_UP \n");  break;  
  84.                                 case PSB_PAD_RIGHT:        g_newcarstate = enRIGHT; PrintChar("PSB_PAD_RIGHT \n");  break;
  85.                                 case PSB_PAD_DOWN:        g_newcarstate = enBACK;  PrintChar("PSB_PAD_DOWN \n");  break;
  86.                                 case PSB_PAD_LEFT:        g_newcarstate = enLEFT;  PrintChar("PSB_PAD_LEFT \n");  break;
  87.                                 case PSB_L2:              PrintChar("PSB_L2 \n");  break;
  88.                                 case PSB_R2:              PrintChar("PSB_R2 \n");  break;
  89.                                 case PSB_L1:              PrintChar("PSB_L1 \n");  break;
  90.                                 case PSB_R1:              PrintChar("PSB_R1 \n");  break;     
  91.                                 case PSB_TRIANGLE:        PrintChar("PSB_TRIANGLE \n");  break;
  92.                                 case PSB_CIRCLE:          PrintChar("PSB_CIRCLE \n");  break;
  93.                                 case PSB_CROSS:           PrintChar("PSB_CROSS \n");  break;
  94.                                 case PSB_SQUARE:          PrintChar("PSB_SQUARE \n");  break;
  95.                                 default: g_newcarstate = enSTOP; break;
  96.                         }
  97.                         //獲取模擬值
  98.                         if(PS2_KEY == PSB_L1 || PS2_KEY == PSB_R1)
  99.                         {
  100.                                 X1 = PS2_AnologData(PSS_LX);
  101.                                 Y1 = PS2_AnologData(PSS_LY);
  102.                                 X2 = PS2_AnologData(PSS_RX);
  103.                                 Y2 = PS2_AnologData(PSS_RY);
  104.                                 /*左搖桿*/
  105.                             if (Y1 < 5 && X1 > 80 && X1 < 180) //上
  106.                             {
  107.                               g_newcarstate = enRUN;
  108.                                  
  109.                             }
  110.                             else if (Y1 > 230 && X1 > 80 && X1 < 180) //下
  111.                             {
  112.                               g_newcarstate = enBACK;
  113.                                   
  114.                             }
  115.                             else if (X1 < 5 && Y1 > 80 && Y1 < 180) //左
  116.                             {
  117.                               g_newcarstate = enLEFT;

  118.                             }
  119.                             else if (Y1 > 80 && Y1 < 180 && X1 > 230)//右
  120.                             {
  121.                               g_newcarstate = enRIGHT;

  122.                             }
  123.                             else if (Y1 <= 80 && X1 <= 80) //左上
  124.                             {
  125.                               g_newcarstate = enUPLEFT;
  126.        
  127.                             }
  128.                             else if (Y1 <= 80 && X1 >= 180) //右上
  129.                             {
  130.                               g_newcarstate = enUPRIGHT;
  131.                        
  132.                             }
  133.                             else if (X1 <= 80 && Y1 >= 180) // 左下
  134.                             {
  135.                               g_newcarstate = enDOWNLEFT;
  136.                        
  137.                             }
  138.                             else if (Y1 >= 180 && X1 >= 180) //右下
  139.                             {
  140.                               g_newcarstate = enDOWNRIGHT;
  141.                                   
  142.                             }
  143.                             else//停
  144.                             {
  145.                               g_newcarstate = enSTOP;
  146.                             }

  147.                                  /*右搖桿*/
  148.                             if (X2 < 5 && Y2 > 110 && Y2 < 150) //左
  149.                             {
  150.                               g_newcarstate = enTLEFT;
  151.                             }
  152.                             else if (Y2 > 110 && Y2 < 150 && X2 > 230)//右
  153.                             {
  154.                               g_newcarstate = enTRIGHT;
  155.                             }
  156.                             else//歸位
  157.                             {
  158.                               //
  159.                             }
  160.                         }
  161.                 }
  162.                
  163.        
  164.                 CarStateOut();               
  165.                          
  166.          }
  167.                                                                     
  168. }
復制代碼

所有資料51hei提供下載:
PS2_STM32平衡車程序源碼.rar (695.06 KB, 下載次數(shù): 150)



作者: admin    時間: 2018-7-9 02:13
此貼需要補充說明資料后才可獲得積分
作者: TT1998    時間: 2018-7-29 12:23
樓主會用51連接PS2手柄嗎

作者: mjmajic    時間: 2019-9-19 14:14
這個具體的波形是怎么樣的?
作者: 王二狗.。。。    時間: 2019-9-21 19:36
單片機用的103還是f407
作者: yuhang98    時間: 2020-4-11 16:37
是stm32f103?




歡迎光臨 (http://www.torrancerestoration.com/bbs/) Powered by Discuz! X3.1