标题:
基于stm32的万向车源程序
[打印本页]
作者:
zly990828
时间:
2019-8-2 10:35
标题:
基于stm32的万向车源程序
#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)
2019-8-2 17:01 上传
点击文件名下载附件
下载积分: 黑币 -5
作者:
admin
时间:
2019-8-2 17:01
本帖需要重新编辑补全电路原理图,源码,详细说明与图片即可获得100+黑币(帖子下方有编辑按钮)
欢迎光临 (http://www.51hei.com/bbs/)
Powered by Discuz! X3.1