IDdaxia 2022-04-12 20:04 采纳率: 83.6%
浏览 62
已结题

HAL库制作STM32红外避障小车见到障碍物反而变快了?

问题遇到的现象和发生背景
HAL库制作STM32红外避障小车见到障碍物反而变快了?
问题相关代码,请勿粘贴截图
函数的定义

//红外避障
/* 
右避障    VOID_R_PIN    PC7
左避障    VOID_L_PIN    PG2
 */
#define VOID_R_PIN         GPIO_PIN_7
#define VOID_R_GPIO        GPIOC
#define VOID_R_IO          HAL_GPIO_ReadPin(VOID_R_GPIO, VOID_R_PIN)

#define VOID_L_PIN         GPIO_PIN_2
#define VOID_L_GPIO        GPIOG
#define VOID_L_IO          HAL_GPIO_ReadPin(VOID_L_GPIO, VOID_L_PIN)
#define BARRIER_Y 0 //有障碍物
#define BARRIER_N 1  //无障碍物
//指令定义
#define COMM_STOP  'I'//停止
#define COMM_UP    'A'//前进
#define COMM_DOWN  'B'//后退
#define COMM_LEFT  'C'//左转
#define COMM_RIGHT 'D'//右转

GetVoidStatus函数


extern char ctrl_comm;

//获取红外避障模块状态
char GetVoidStatus(void)
{
char left=0,right=0;
char count;
if(VOID_L_IO == BARRIER_Y)
{
count = 2;
while(--count)//10ms 采集2次均要采集到前面障碍物信息,滤波
{
if(VOID_L_IO == BARRIER_N)
break;
HAL_Delay(1000);
}
if(count == 0)
{
left = 1;
ctrl_comm = COMM_RIGHT;CarBack(); HAL_Delay(500); CarLeft(); DelayCheck(500);
}
}

if(VOID_R_IO == BARRIER_Y)
{
    count = 2;
    while(--count)//10ms 采集2次均要采集到前面障碍物信息,滤波
    {
        if(VOID_R_IO == BARRIER_N)
            break;
        HAL_Delay(1000);
    }
    if(count == 0) right = 2;
}

return left + right;

}


VoidRun函数

//延时的同时检测红外,一旦发生障碍物,就停止并跳出延时
void DelayCheck(int ms)
{
    while(ms--)
    {
        HAL_Delay(1);
        if(VOID_NONE != GetVoidStatus())
        {
            CarStop();
            return;
        }
    }
}

//红外避障处理
//处理方式:左边检测到  后退500ms 右转500ms
//            右边检测到  后退500ms 左转500ms
//            两边检测到  后退700ms 右转500ms
//          没检测到    直行
void VoidRun(void)
{
    char status;
    status = GetVoidStatus();
    
    switch(status)
    {
        case VOID_LEFT: 
            ctrl_comm = COMM_RIGHT;CarBack(); HAL_Delay(500); CarLeft(); DelayCheck(500);
            break;
        case VOID_RIGHT:
            ctrl_comm = COMM_LEFT;CarBack(); HAL_Delay(500); CarRight(); DelayCheck(500);    
            break;
        case VOID_BOTH:
            ctrl_comm = COMM_RIGHT;CarBack(); HAL_Delay(700); CarRight(); DelayCheck(500);
            break;
        case VOID_NONE:
            ctrl_comm = COMM_UP;CarGo();
            break;
        default: break;
    }
}

main.c里的函数

while (1)
  {
    /* USER CODE END WHILE */
    if(tick_5ms >= 5)
        {
            tick_5ms = 0;
            tick_200ms++;
            if(tick_200ms >= 40)
            {
                tick_200ms = 0;
                HAL_GPIO_TogglePin(LED_GPIO,LED_PIN);
            }

            VoidRun();

        }
    /* USER CODE BEGIN 3 */
  }
  /* USER CODE END 3 */


运行结果及报错内容
遇到障碍物反而加快速度了
我的解答思路和尝试过的方法

我想要达到的结果

  • 写回答

3条回答

      报告相同问题?

      相关推荐 更多相似问题

      问题事件

      • 系统已结题 4月22日
      • 已采纳回答 4月14日
      • 修改了问题 4月13日
      • 修改了问题 4月13日
      • 展开全部

      悬赏问题

      • ¥15 postman测试正常,在代码运行报错
      • ¥15 关于#C语言#的问题,如何解决?
      • ¥20 Vs2017 Help Viewer2.3 问题
      • ¥35 基于嵌入式linux的日程管理软件
      • ¥50 如何将list字符串添加到CSV文件表头?
      • ¥15 关于#javascript#的问题:通过ajax实现的局部刷新 如何将项目打包
      • ¥15 海思uboot USB3.0无法识别
      • ¥15 无法调用库文件,自己可以找到,但编译时显示没有
      • ¥15 安装PyQt5的时候这里创建虚拟环境是哪里?具体是怎么的?能录个视频吗
      • ¥20 php程序设计题不会!求解答!