- #include "stm32f10x.h" // 相当于51单片机中的 #include <reg51.h>
- #include "bsp_moto.h"
- #include "./key/bsp_key.h"
- #include "bsp_SysTick.h"
- #include "exti.h"
- #include "filter.h"
- #include "MPU6050.h"
- #include "IOI2C.h"
- #include "bsp_usart.h"
- #include "delay.h"
- #include "bsp_servo.h"
- #include "bsp_dma.h"
- long int Target_A,Target_B,Target_C; //电机目标值
- long int Motor_A,Motor_B,Motor_C; //电机PWM变量
- int Vx,Vy,Vz; //车子三轮的速度
- float GYROA=0.004;
- float Pitch,Roll,Yaw,Move_X,Move_Y,Move_Z; //三轴角度和XYZ轴目标速度 3200
- int time; //小车转度数计时变量
- int control_flag=0; //小车的行驶4个状态的控制量
- int mode_flag=1; // 小车模式的控制量,1为自动,0为手动
- char position ='0'; //小车当前的状态。
- //小车忙不忙,如果小车在运动,上位机第四部分禁止发数据,只有小车空闲时,上位机第四部分才能给我发数据,
- // 用字符‘1’代表忙,字符‘0’代表空闲.
- char commend[11]={'\0'}; //接受手动命令的数组
- /*手动控制关闭,前进,后退,顺时针转90度,逆时针转90度,顺时针转,逆时针转*/
- int off=0,forward=0,backward=0,clockwise_90=0,anticlockwise_90=0,clockwise=0,anticlockwise=0;
- char send_data[63]={'\0'}; //发送数据的数组
- double frequency_B,count_B,sum_B=0;
- //char wifi_flag=0;
- void Start_to_A(void);
- void A_to_Start(void);
- void Start_A_B(void);
- void Start_A_B_C(void);
- int main(void)
- {
- led_GPIO_Config(); //自动模式时,灯会亮;手动模式时,灯熄灭
- led(0);
- Key_GPIO_Config();
- while(!Key_Scan());
- wifi_Config(); //wifi初始化,配置中断优先级为0
- // USART1_Config();
- Servo_Init();//舵机初始化
-
- Servo_heng(); //不管舵机现在是什么状态,一律变为水平状态
-
- moto_init(); //电机初始化,刚初始化电机完,电机不能转动,失能电机
-
- IIC_Init(); //=====IIC初始化,为MPU6050传输数据做准备
- MPU6050_initialize(); //=====MPU6050初始化
- DMP_Init(); //=====初始化DMP
-
- delay_ms(1000); //=====延时等待DMP初始化稳定
- /************一上电为了后面数据的准确性,需要给出Z轴角速度的准确值,大概需要7-8秒*******/
- Read_DMP();
- delay_ms(5);
- Read_DMP();
- delay_ms(5);
- while(gyro[2]!=0)
- {
- Read_DMP();
- delay_ms(5);
- }
- /**************************************************************************************/
- GENERAL_TIM7_Init(); //以100ms的速度给上位机发送小车的运动参数,配置中断优先级为10
-
- GENERAL_TIM4_Init(); //以5ms一次中断控制小车运动 ,初始化时不开启,配置中断优先级为15
- // 使能计数器TIM_Cmd(GENERAL_TIM4, ENABLE);
-
- GENERAL_TIM6_Init();//,配置中断优先级为5
-
- led(1);
-
-
- //printf("init ok!!!\n");
- //wifi_flag=1;
- wifi_NVIC_Configuration(); // wifi4中断优先级配置
- USART_ITConfig(DEBUG_USART4, USART_IT_RXNE, ENABLE); // wifi串口接收中断使能
- while(1)
- {
- switch(control_flag)
- {
- case 1 : Start_to_A(); break;
- case 2 : A_to_Start(); break;
- case 3 : Start_A_B(); break;
- case 4 : Start_A_B_C(); break;
- case 5 : turn_angle(1);control_flag=0; break;//顺时针90度
- case 6 : turn_angle(0);control_flag=0; break;
- default: ; break;
- }
- }
- }
- void Start_to_A(void)
- {
-
- delay_ms(1);
- position='1'; //小车忙
-
- Servo_shu(); //顶货物 ,有延时
- motoEN(1);//使能电机
- car_speed(0,600,0); //小车速度
- TIM_Cmd(GENERAL_TIM4, ENABLE); //使能计数器,让小车开始运动
- while(control_flag); // 等待小车跑完
- delay_ms(500);
- Servo_heng(); //放货物
- car_speed(0,-600,0); //小车速度
- control_flag=1;
- TIM_Cmd(GENERAL_TIM4, ENABLE); //使能计数器,让小车开始运动
- while(control_flag); // 等待小车跑完
- motoEN(0);
- control_flag=0;
- position='0';//小车不忙
- }
- void A_to_Start(void)
- {
- motoEN(1);//使能电机
- delay_ms(1);
- position='1'; //小车忙
-
- car_speed(0,600,0); //小车速度
- TIM_Cmd(GENERAL_TIM4, ENABLE); //使能计数器,让小车开始运动
- while(control_flag); // 等待小车跑完
- delay_ms(500);
- Servo_shu();
- car_speed(0,-600,0); //小车速度
- control_flag=2;
- TIM_Cmd(GENERAL_TIM4, ENABLE); //使能计数器,让小车开始运动
- while(control_flag); // 等待小车跑完
- Servo_heng();
- motoEN(0);
- control_flag=0;
- position='0';//小车不忙
- }
- void Start_A_B(void)
- {
- motoEN(1);//使能电机
- delay_ms(1);
- position='1'; //小车忙
-
- car_speed(0,600,0); //小车速度
- TIM_Cmd(GENERAL_TIM4, ENABLE); //使能计数器,让小车开始运动
- while(control_flag); // 等待小车跑完
- delay_ms(500);
- Servo_shu();
- turn_angle(1);//顺时针90度
- delay_ms(500);
- control_flag=3;
- TIM_Cmd(GENERAL_TIM4, ENABLE); //使能计数器,让小车开始运动
- while(control_flag); // 等待小车跑完
- delay_ms(500);
- Servo_heng();
-
- car_speed(0,-600,0); //小车速度
- control_flag=3;
- TIM_Cmd(GENERAL_TIM4, ENABLE); //使能计数器,让小车开始运动
- while(control_flag); // 等待小车跑完
- delay_ms(500);
- turn_angle(0);//逆时针90度
- delay_ms(500);
- control_flag=3;
- TIM_Cmd(GENERAL_TIM4, ENABLE); //使能计数器,让小车开始运动
- while(control_flag); // 等待小车跑完
- motoEN(0);
- control_flag=0;
- position='0';//小车不忙
- }
- void Start_A_B_C(void)
- {
- motoEN(1);//使能电机
- delay_ms(1);
- position='1'; //小车忙
-
- car_speed(0,600,0); //小车速度
- TIM_Cmd(GENERAL_TIM4, ENABLE); //使能计数器,让小车开始运动
- while(control_flag); // 等待小车跑完
- delay_ms(500);
- turn_angle(1);//顺时针90度
- delay_ms(500);
- control_flag=4;
- TIM_Cmd(GENERAL_TIM4, ENABLE); //使能计数器,让小车开始运动
- while(control_flag); // 等待小车跑完
- delay_ms(500);
- Servo_shu();
- turn_angle(1);//顺时针90度
- delay_ms(500);
- control_flag=4;
- TIM_Cmd(GENERAL_TIM4, ENABLE);
- while(control_flag); // 等待小车跑完
- delay_ms(500);
- turn_angle(1);//顺时针90度
- delay_ms(500);
- control_flag=4;
- TIM_Cmd(GENERAL_TIM4, ENABLE);
- while(control_flag); // 等待小车跑完
- delay_ms(500);
- turn_angle(1);//顺时针90度
- Servo_heng();
- motoEN(0);
- control_flag=0;
- position='0';//小车不忙
- }
复制代码
全部程序51hei下载地址:
万向车.7z
(252.23 KB, 下载次数: 5)
|