代码拉取完成,页面将自动刷新
同步操作将从 Zyx/GX 强制同步,此操作会覆盖自 Fork 仓库以来所做的任何修改,且无法恢复!!!
确定后同步将在后台操作,完成时将刷新页面,请耐心等待。
set_motor_voltage(0,
motor_info[0].set_voltage,
motor_info[1].set_voltage,
motor_info[2].set_voltage,
motor_info[3].set_voltage);
功能:底层电机驱动线程
Task_one();
功能:整个比赛任务流程
Catch_task();
功能:辅助主任务的线程,主线程发送命令过来,辅助线程操作对应的任务,实现双线程完成任务,大大缩短时间
其他:进程间通信采用宏定义变量实现参数传递
Manu_Interface(); //oled菜单
功能:作为ui控制舵机和所有灰度
Turning_Laps(100,3000, Left );//编码器旋转圈数 车辆运行速度 方向
void Turning_Laps(uint16_t num,float speed,car_Typedef fx)//50/格 1:num 2006圈数 fx车状态:车走向
{
int32_t s = 0;
int32_t stang = 0;//标记起点
if(fx==Forward||fx==Back||fx==Left||fx==Right)
{
car.speed_L=speed;
car.speed_R=speed;
car.drive=fx;//车辆行驶的方向和速度
stang=motor_info1[0].round_cnt;//标记起点cnt
while(1){
err=motor_info1[0].round_cnt-stang;//err=终点cnt-起点cnt
if(err>=num){//当err>=num时,终点-起点=num,停车
car.speed_L=0;
car.speed_R=0;
break;
}
vTaskDelay(2);
}
}}
优化:在can接收回调函数内进行编码器圈数的判断(实时性高,不容易数错)
void HAL_CAN_RxFifo0MsgPendingCallback(CAN_HandleTypeDef *hcan)
{
。。。
if(motor_info1[index].rotor_angle -motor_info1[index].last_angle>4096)//判断已经转过一圈
{motor_info1[index].round_cnt ++;motor_info[index].round_cnt --;}//round_cnt编码器圈数+1
else if(motor_info1[index].rotor_angle -motor_info1[index].last_angle<-4096)
{motor_info1[index].round_cnt --;motor_info[index].round_cnt --;}
}
void TraceL_FAST_Num(uint16_t num,float speed)//寻迹数线 num:过几条线 speed:速度
{
int8_t u=0;//u的作用:防止重复数线(同一根线只数一次),功能:由白到黑的过程才会数一根
while(num)
{
TraceL_speed(speed);循迹函数
if(DUI0 ==1)//LEFT3
{
HAL_Delay(10);//消抖
if(DUI0 ==1)
{
if(u==1)// last
{
num--;
u=0;
}
}
}
else u=1;
}
Stop();
}
循迹函数矫正方案:
车头向左矫正:左前轮减速,右前轮加速,后轮两个不变
void TraceL_speed(uint16_t speed)
{/*
DUB0
DUC2
DUB1
DUC3
*/
Huidu_L=(DUC3<<3)|(DUB1<<2)|(DUC2<<1)|DUB0;
car.drive=Left1;
switch(Huidu_L)
{
case 4:car.speed_LF = speed-L_e7; car.speed_LB = speed; car.speed_RB = speed;
car.speed_RF = speed+L_PLUSS7; ;break; //0100
case 2:car.speed_LF = speed+L_PLUSS7; car.speed_LB = speed; car.speed_RB = speed;
car.speed_RF = speed-L_e7; ;break; //0010
case 12:car.speed_LF =speed-L_e8; car.speed_LB = speed; car.speed_RB = speed;
car.speed_RF = speed+L_PLUSS8; break; //1100
case 3:car.speed_LF = speed+L_PLUSS8; car.speed_LB = speed; car.speed_RB = speed;
car.speed_RF = speed-L_e8; break; //0011
case 8:car.speed_LF = speed-L_e9; car.speed_LB = speed; car.speed_RB = speed;
car.speed_RF = speed+L_PLUSS9; break; //1000
case 1:car.speed_LF = speed+L_PLUSS9; car.speed_LB = speed; car.speed_RB = speed;
car.speed_RF = speed-L_e9; break; //0001
default:car.speed_LF = speed;car.speed_RF = speed; car.speed_LB = speed; car.speed_RB = speed; break;
}
}
void alignmentB(float speed)//两点对一条线,一点碰到线马上停
#include "catch.h"//舵机库函数
#include "line_track.h"//循迹运动库函数
maintask2.c
此处可能存在不合适展示的内容,页面不予展示。您可通过相关编辑功能自查并修改。
如您确认内容无涉及 不当用语 / 纯广告导流 / 暴力 / 低俗色情 / 侵权 / 盗版 / 虚假 / 无价值内容或违法国家有关法律法规的内容,可点击提交进行申诉,我们将尽快为您处理。