STM32送药小车(五):Openmv与主控芯片STM32的配合

系列文章目录

STM32智能送药小车(三):0.96寸7针OLED的配置与编程_ssfight1的博客-CSDN博客

STM32智能送药小车(二):搭建stm32cpp环境_ssfight1的博客-CSDN博客

STM32智能送药小车(一):STM32cubemx的配置_ssfight1的博客-CSDN博客


文章目录

目录

系列文章目录

文章目录

前言

一、接收信息的处理

二、电机PWM输出

1.正常巡线

2.特殊标志位

1.停车

2.转向

总结



前言

我们通过分析从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;
  }
}  

总结

这个项目是完成了大部分代码,但小部分没有调试,因为个人时间关系也是不会再去完善和调试的了,这些思路希望对大家有所帮助。

你可能感兴趣的:(stm32,python,arm)