虾仁A 2022-04-12 20:04 采纳率: 78.8%
浏览 94
已结题

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条回答 默认 最新

  • 键鼠亦有温度 2022-04-13 10:43
    关注

    因为你没有遇到障碍物时直接跳出了循环,没有继续执行延时函数,也就是你的PWM节奏乱了。如果使用的是专用的PWM端口就不会有该问题存在

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论 编辑记录
查看更多回答(2条)

报告相同问题?

问题事件

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

悬赏问题

  • ¥15 高德地图点聚合中Marker的位置无法实时更新
  • ¥15 DIFY API Endpoint 问题。
  • ¥20 sub地址DHCP问题
  • ¥15 delta降尺度计算的一些细节,有偿
  • ¥15 Arduino红外遥控代码有问题
  • ¥15 数值计算离散正交多项式
  • ¥30 数值计算均差系数编程
  • ¥15 redis-full-check比较 两个集群的数据出错
  • ¥15 Matlab编程问题
  • ¥15 训练的多模态特征融合模型准确度很低怎么办