STM32麦轮小车各运动模式编写中的“趣事”(持续更新中)

发布时间 2023-04-25 16:56:41作者: FBshark

1. 避障模式

今天尝试编写避障模式,

常规思路就是读取 HC-SR04 的值进行判断,如果读到的数值小于某个值(比如10cm), 车子就后退;如果数值大于这个值,那么车子就停止。

在这个过程中我犯了两个错误。

一个是忘记了做BSP测试的时候,HC-SR04 用到定时器和电机输出的 PWM 定时器是同一个定时器(TIM2)(调试的时候发现 HC-SR04 读数一直特别小,还以为硬件有问题。。。。)

也就是忘记定时器分配,造成混用的问题。


随后将HC-SR04 改到TIM3 了。

另外发现 UP主设计PCB 的引脚分配的非常好,应该学习,做了一个引脚分配资源的总结。

 

犯的第二个错误,是没选择好车子停止的函数。

想要一个车子停止,有多种方式。

  • 第一种,最直接的就是把“总闸”关了,这里指的是 STBY 引脚设为0, DRV8833 就不工作了。
  • 第二种,不把“总闸”关掉,而是把 IN1 和 IN2 都设为0, 或者都设为1。(可以参考DRV8833的逻辑表)

 一开始写的时候,选择了第一种,因为进入模式之后不断循环,不断判断,我并没有在要倒退的时候开启“总闸”,导致车子没有反应。于是,我改为第二种:

void Car_Brake(void)
{
    /*-------左上轮子----*/
    //FL_IN1(0);
    TIM_SetCompare4(TIM2,0);
    FL_IN2(0);
    
    /*-------右上轮子----*/
    //FR_IN1(0);
    TIM_SetCompare3(TIM2, 0);
    FR_IN2(0);
    
    /*-------左下轮子----*/
    //BL_IN1(0);
    TIM_SetCompare2(TIM2, 0);
    BL_IN2(0);        
    
    /*-------右下轮子----*/
    //BR_IN1(0);
    TIM_SetCompare1(TIM2, 0);
    BR_IN2(0);    
    
}

 

另外,我希望车子(PCB)不会下载进去就直接转动,因为这时候还连着 SW 的下载调试线(动起来有一种头疼的感觉)

因此我设置了一个 test_flag 的标志位,并通过手机(再通过蓝牙)想单片机发送一个“@”后,才能将 test_flag 置为1. 下面的语句在 while()循环中不断检测,这样手机就可以动态设置小车的启动了

在默认状态(复位的时候),test_flag = 0,这时候车子处于停止状态,就不会乱动了。

 1     if(test_flag == 0)
 2     {
 3         STBY1(0);    //PB9 后面两个轮子
 4         STBY2(0); //PB4 前面两个轮子
 5     }
 6     else 
 7     {
 8         STBY1(1);    //PB9 后面两个轮子
 9         STBY2(1); //PB4 前面两个轮子
10     }