STM32 智能红外循迹小车(含码盘测速 + 避障)

基于 STM32F103C8T6,实现 红外循迹 + 超声波避障 + 编码器码盘测速 + PID 调速,是电子竞赛 / 课程设计 / 毕业设计的成熟方案。


一、硬件系统框图

复制代码
┌──────────────┐
          │  STM32F103   │
          │  (主控)       │
          └──────┬───────┘
                 │
   ┌─────────────┼──────────────────┐
   │             │                  │
┌──▼──┐    ┌────▼────┐      ┌──────▼─────┐
│ TB6612 │    │ 红外循迹 │      │ 超声波 HC-SR04 │
│ 电机驱动│    │ 5路 TCRT5000│      │ 避障        │
└──┬──┘    └────┬────┘      └──────┬─────┘
   │             │                  │
┌──▼─────────────▼──────────────────▼──┐
│  直流减速电机 + 霍尔/光电码盘        │
└──────────────────────────────────────┘

二、硬件选型清单

模块 型号 说明
MCU STM32F103C8T6 72MHz,资源丰富
电机驱动 TB6612 / DRV8833 双路直流电机
循迹 TCRT5000 × 5 黑线检测
避障 HC‑SR04 超声波测距
测速 霍尔/光电码盘 每路电机
电源 18650 × 2 7.4V → 5V/3.3V

三、引脚分配(标准)

功能 引脚
左电机 PWM PA8 / TIM1_CH1
右电机 PWM PA9 / TIM1_CH2
左电机 DIR PB12 / PB13
右电机 DIR PB14 / PB15
左编码器 A/B PA0 / PA1
右编码器 A/B PB6 / PB7
红外循迹 PC0~PC4
超声波 Trig PB8
超声波 Echo PB9

四、核心源码


1、 电机 & PWM 驱动

复制代码
void Motor_Init(void)
{
    __HAL_RCC_TIM1_CLK_ENABLE();
    TIM_OC_InitTypeDef sConfig = {0};

    htim1.Instance = TIM1;
    htim1.Init.Prescaler = 72 - 1;
    htim1.Init.CounterMode = TIM_COUNTERMODE_UP;
    htim1.Init.Period = 1000 - 1;
    HAL_TIM_PWM_Init(&htim1);

    sConfig.OCMode = TIM_OCMODE_PWM1;
    sConfig.Pulse = 0;
    sConfig.OCPolarity = TIM_OCPOLARITY_HIGH;
    HAL_TIM_PWM_ConfigChannel(&htim1, &sConfig, TIM_CHANNEL_1);
    HAL_TIM_PWM_ConfigChannel(&htim1, &sConfig, TIM_CHANNEL_2);
    HAL_TIM_PWM_Start(&htim1, TIM_CHANNEL_1);
    HAL_TIM_PWM_Start(&htim1, TIM_CHANNEL_2);
}

void Motor_SetSpeed(uint8_t left, uint8_t right)
{
    __HAL_TIM_SET_COMPARE(&htim1, TIM_CHANNEL_1, left);
    __HAL_TIM_SET_COMPARE(&htim1, TIM_CHANNEL_2, right);
}

2、 编码器码盘测速

复制代码
volatile int32_t left_cnt = 0;
volatile int32_t right_cnt = 0;

void HAL_TIM_IC_CaptureCallback(TIM_HandleTypeDef *htim)
{
    if(htim->Instance == TIM2)
        left_cnt++;
    if(htim->Instance == TIM3)
        right_cnt++;
}
float Get_Speed(void)
{
    float speed = (abs(left_cnt) + abs(right_cnt)) / 2.0;
    left_cnt = right_cnt = 0;
    return speed;
}

3、 红外循迹逻辑

复制代码
uint8_t Track_Read(void)
{
    return (HAL_GPIO_ReadPin(GPIOC, GPIO_PIN_0) << 4) |
           (HAL_GPIO_ReadPin(GPIOC, GPIO_PIN_1) << 3) |
           (HAL_GPIO_ReadPin(GPIOC, GPIO_PIN_2) << 2) |
           (HAL_GPIO_ReadPin(GPIOC, GPIO_PIN_3) << 1) |
           (HAL_GPIO_ReadPin(GPIOC, GPIO_PIN_4));
}

4、 超声波避障

复制代码
float HCSR04_Read(void)
{
    uint32_t time = 0;
    HAL_GPIO_WritePin(TRIG_GPIO, TRIG_PIN, GPIO_PIN_SET);
    HAL_Delay(10);
    HAL_GPIO_WritePin(TRIG_GPIO, TRIG_PIN, GPIO_PIN_RESET);

    while(HAL_GPIO_ReadPin(ECHO_GPIO, ECHO_PIN) == GPIO_PIN_RESET);
    while(HAL_GPIO_ReadPin(ECHO_GPIO, ECHO_PIN) == GPIO_PIN_SET)
        time++;

    return time * 0.017;
}

5、 PID 调速

复制代码
typedef struct
{
    float Kp, Ki, Kd;
    float error, last_error, integral;
} PID_t;

float PID_Calc(PID_t *pid, float target, float feedback)
{
    pid->error = target - feedback;
    pid->integral += pid->error;
    float out = pid->Kp * pid->error +
                pid->Ki * pid->integral +
                pid->Kd * (pid->error - pid->last_error);
    pid->last_error = pid->error;
    return out;
}

6、 主控制逻辑

复制代码
void Car_Control(void)
{
    uint8_t track = Track_Read();
    float dist = HCSR04_Read();
    float speed = Get_Speed();

    if(dist < 20)   // 避障
    {
        Motor_SetSpeed(0, 0);
        return;
    }

    if(track == 0b00100)   // 直行
        Motor_SetSpeed(600, 600);
    else if(track == 0b01110) // 十字
        Motor_SetSpeed(600, 600);
    else if(track & 0b00011)  // 偏左
        Motor_SetSpeed(400, 700);
    else if(track & 0b11000)  // 偏右
        Motor_SetSpeed(700, 400);
}

参考代码 STM32智能红外循迹小车,包括完整码盘测速,蔽障,等功能 www.youwenfan.com/contentcst/182042.html

五、功能总结

红外 5 路循迹

超声波自动避障

编码器码盘测速

PID 闭环调速

差速转向

停车保护


六、调试建议

问题 解决
跑偏 调整 PID 参数
循迹抖动 降低电机速度
测速不准 提高编码器采样频率
避障误判 多次滤波取平均值
相关推荐
吠品6 小时前
智谱开源 ZCode 之后,真正的考试才开始
单片机·嵌入式硬件·1024程序员节
Chery11407 小时前
高速ADC与精密DAC怎么选?DP9230D与DP8532D应用解析
嵌入式硬件·物联网·射频工程
小李不想当小白10 小时前
SPI通信外设与W25Q64 (硬件SPI)(STM32标准库学习笔记)
笔记·stm32·单片机·嵌入式硬件·学习·嵌入式
LCG米11 小时前
STM32驱动W5500以太网模块实测:TCP吞吐瓶颈定位、TX指针回绕陷阱与断线重连保活落地
stm32·单片机·嵌入式硬件·tcp/ip
尼喃12 小时前
662K/65Z5三脚稳压芯片规格书—PW6566B33/B30引脚功能
嵌入式硬件
创界工坊工作室12 小时前
63-基于STC89C52霍尔传感器的智能化电能表设计
stm32·单片机·嵌入式硬件·51单片机·proteus
智购科技自动售货机厂家13 小时前
让AI经营自动售货机:从Project Vend看工具权限与业务规则~YH
大数据·服务器·单片机·嵌入式硬件·深度学习
Zwawa14 小时前
从 printf 到曲线:把数据送上 VOFA+
c语言·单片机·嵌入式
意法半导体STM3215 小时前
【官方原创】LAT6048 如何扩大MP2的A35核和M33核共享内存
stm32·单片机·嵌入式硬件·内存映射·stm32mp2
en.en..15 小时前
STM32(F429)启动模式与两种烧录方式
stm32·单片机·嵌入式硬件