系列文章目录
STM32智能送药小车(三):0.96寸7针OLED的配置与编程_ssfight1的博客-CSDN博客
STM32智能送药小车(二):搭建stm32cpp环境_ssfight1的博客-CSDN博客
STM32智能送药小车(一):STM32cubemx的配置_ssfight1的博客-CSDN博客
文章目录
目录
前言
我们通过分析从Openmv中发送到主控芯片的信息,从而对小车进行相应的控制。
一、接收信息的处理
我们使用Openmv发送的打包数组中,其中第1个数值为小车的状态,第2个数值为中线偏差量,从而使用的通过分析打包数据,对小车进一步控制。
部分代码如下:
void Blueteeth_control()
{
unsigned char uart1_data;
while (HAL_UART_Receive_IT(&huart1, &res, 1))
{
state=res[0]//接受传回的第一个值,即状态
angle_error=res[1]//PID角度偏差,先储存起来
switch (state)
{
case 'x':Motor::RunPID(angle_error);break;//正常巡线
case '+':Motor::PID(0);break;//十字停车
case 'l':Motor::PID(1);break;//左转
case 'r':Motor::PID(1);break;//右转
case 's':Motor::PID(0);break;//到达黑色虚线,停车
}
}
}
二、电机PWM输出
1.正常巡线
因为我们是三轮车,左右转依靠差速来实现,所以我们利用差速因子来对中线偏差进行PID调控。
代码如下:
if (error >= 0) //右
{
L_motor.exp_speed = PWM_default - (int16)(l_reduce * error) - PWM_decrease;
R_motor.exp_speed = PWM_default + (int16)(_r_add * error) - PWM_decrease;
}
else if (error < 0) //姿态在左
{
L_motor.exp_speed = PWM_default - (int16)(l_add * error) - PWM_decrease;
R_motor.exp_speed = PWM_default + (int16)(r_reduce * error) - PWM_decrease;
}
2.特殊标志位
1.停车
停车我们直接让四路PWM等于0
代码如下:
void Motor::Stop()
{
Motor::PWM_OUT(0, 0, 0, 0);
}
2.转向
我们通过左右轮的差速进行转向,通过MPU6050判断是否达到相应的角度
部分代码如下:
void Motor::Turn(u8 dir)
{
switch (dir)
{
/*左转弯*/
case 1:
Motor::PWM_OUT(0, 2000, 2000, 0);
break;
/*右转弯*/
default:
Motor::PWM_OUT(2000, 0, 0, 2000);
break;
}
}
总结
这个项目是完成了大部分代码,但小部分没有调试,因为个人时间关系也是不会再去完善和调试的了,这些思路希望对大家有所帮助。