基于STM32的PS2遙控手柄,平衡車程序源碼
單片機源程序如下:
- /******************** (C) COPYRIGHT (2015)BST BALANCECAR **************************
- * 文件名 :main.c
- **********************************************************************************/
- //#include "stm32f10x.h"
- #include "mpu6050.h"
- #include "i2c_mpu6050.h"
- #include "motor.h"
- #include "upstandingcar.h"
- #include "SysTick.h"
- #include "led.h"
- #include "usart.h"
- #include "i2c.h"
- //#include "outputdata.h"
- #include "timer.h"
- #include "UltrasonicWave.h"
- //#include "stm32f10x_usart.h"
- #include "ps2.h"
- #include "delay.h"
- float gyz;
- int acc;
- int acc1;
- /*協議相關*/
- //extern u8 newLineReceived = 0;
- /*
- * 函數名:main
- * 描述 :主函數
- */
- int main(void)
- {
- u8 PS2_KEY = 0, X1=0,Y1=0,X2=0,Y2=0;
- u16 num = 0;
-
- SystemInit(); //=====系統初始化
- Timerx_Init(5000,7199); //定時器TIM1
- // UltrasonicWave_Configuration(); //超聲波初始化設置 IO口及中斷設置
- //USART1_Config(); //串口1初始化 上位機
- USART3_Config(); //串口3初始化 藍牙與USART3公用相同IO口
-
- TIM2_PWM_Init(); //PWM輸出初始化
- MOTOR_GPIO_Config(); //電機IO口初始化
- LED_GPIO_Config();
-
- // TIM3_External_Clock_CountingMode(); //左電機脈沖輸出外部中斷口PA7使用TIM3定時器用作為脈沖數計算
- // TIM4_External_Clock_CountingMode(); //右電機脈沖輸出外部中斷口PB7使用TIM4定時器用作為脈沖數計算
- TIM3_Encoder_Init(); //編碼器獲取脈沖數 PA6 7
- TIM4_Encoder_Init(); //編碼器獲取脈沖數 PB6 7
- ////////////////////DMP/////////////////////////////////
- i2cInit(); //IIC初始化 用于掛靠在總線上的設備使用
- delay_nms(10); //延時10ms
- MPU6050_Init(); //MPU6050 DMP陀螺儀初始化
- PS2_Init(); //PS2手柄初始化
- SysTick_Init(); //SysTick函數初始化
- CarUpstandInit(); //小車直立參數初始化
- SysTick->CTRL |= SysTick_CTRL_ENABLE_Msk; //使能總算法時鐘
- PrintChar("FFFFFFF \n");
- while (1)
- {
- // GPIO_ResetBits(GPIOC, GPIO_Pin_13);
- MPU6050_Pose(); //獲取MPU6050角度狀態
- // gy0=gyro[0];
- // UltrasonicWave_StartMeasure(); //調用超聲波發送程序 給Trig腳 <10us 高電平
- // chaoshengbo(); //計算超聲波測距距離
- // printf("%d",ucBluetoothValue);
- // printf("\t");
- // printf("%f",BST_fSpeedControlOutNew);
- // printf("\t");
- // printf("%f",BST_fCarAngle);
- // printf("\t");
- // printf("%f",BST_fLeftMotorOut);
- // printf("\t");
- // printf("\n");
- num++;
- if(num == 500)
- {
- num =0;
- PS2_KEY = PS2_DataKey(); //手柄按鍵捕獲處理
- switch(PS2_KEY)
- {
- case PSB_SELECT: PrintChar("PSB_SELECT \n"); break;
- case PSB_L3: g_newcarstate = enSTOP; PrintChar("PSB_L3 \n"); break;
- case PSB_R3: g_newcarstate = enSTOP; PrintChar("PSB_R3 \n"); break;
- case PSB_START: PrintChar("PSB_START \n"); break;
- case PSB_PAD_UP: g_newcarstate = enRUN; PrintChar("PSB_PAD_UP \n"); break;
- case PSB_PAD_RIGHT: g_newcarstate = enRIGHT; PrintChar("PSB_PAD_RIGHT \n"); break;
- case PSB_PAD_DOWN: g_newcarstate = enBACK; PrintChar("PSB_PAD_DOWN \n"); break;
- case PSB_PAD_LEFT: g_newcarstate = enLEFT; PrintChar("PSB_PAD_LEFT \n"); break;
- case PSB_L2: PrintChar("PSB_L2 \n"); break;
- case PSB_R2: PrintChar("PSB_R2 \n"); break;
- case PSB_L1: PrintChar("PSB_L1 \n"); break;
- case PSB_R1: PrintChar("PSB_R1 \n"); break;
- case PSB_TRIANGLE: PrintChar("PSB_TRIANGLE \n"); break;
- case PSB_CIRCLE: PrintChar("PSB_CIRCLE \n"); break;
- case PSB_CROSS: PrintChar("PSB_CROSS \n"); break;
- case PSB_SQUARE: PrintChar("PSB_SQUARE \n"); break;
- default: g_newcarstate = enSTOP; break;
- }
- //獲取模擬值
- if(PS2_KEY == PSB_L1 || PS2_KEY == PSB_R1)
- {
- X1 = PS2_AnologData(PSS_LX);
- Y1 = PS2_AnologData(PSS_LY);
- X2 = PS2_AnologData(PSS_RX);
- Y2 = PS2_AnologData(PSS_RY);
- /*左搖桿*/
- if (Y1 < 5 && X1 > 80 && X1 < 180) //上
- {
- g_newcarstate = enRUN;
-
- }
- else if (Y1 > 230 && X1 > 80 && X1 < 180) //下
- {
- g_newcarstate = enBACK;
-
- }
- else if (X1 < 5 && Y1 > 80 && Y1 < 180) //左
- {
- g_newcarstate = enLEFT;
- }
- else if (Y1 > 80 && Y1 < 180 && X1 > 230)//右
- {
- g_newcarstate = enRIGHT;
- }
- else if (Y1 <= 80 && X1 <= 80) //左上
- {
- g_newcarstate = enUPLEFT;
-
- }
- else if (Y1 <= 80 && X1 >= 180) //右上
- {
- g_newcarstate = enUPRIGHT;
-
- }
- else if (X1 <= 80 && Y1 >= 180) // 左下
- {
- g_newcarstate = enDOWNLEFT;
-
- }
- else if (Y1 >= 180 && X1 >= 180) //右下
- {
- g_newcarstate = enDOWNRIGHT;
-
- }
- else//停
- {
- g_newcarstate = enSTOP;
- }
- /*右搖桿*/
- if (X2 < 5 && Y2 > 110 && Y2 < 150) //左
- {
- g_newcarstate = enTLEFT;
- }
- else if (Y2 > 110 && Y2 < 150 && X2 > 230)//右
- {
- g_newcarstate = enTRIGHT;
- }
- else//歸位
- {
- //
- }
- }
- }
-
-
- CarStateOut();
-
- }
-
- }
復制代碼
所有資料51hei提供下載:
PS2_STM32平衡車程序源碼.rar
(695.06 KB, 下載次數: 150)
2018-7-9 02:11 上傳
點擊文件名下載附件
下載積分: 黑幣 -5
|