登录/注册

STM32F103VC小车寻迹

STM32F103VC小车寻迹

更多

针对使用STM32F103VC微控制器实现小车寻迹功能,以下是分步解决方案:

一、硬件设计

  1. 传感器模块

    • 推荐使用4-5路TCRT5000红外传感器(或灰度传感器)
    • 安装间距:15-20mm(根据实际路径宽度调整)
    • 连接方式:DOUT引脚接STM32 GPIO(PA0-PA4)
  2. 电机驱动

    • 推荐L298N或TB6612电机驱动模块
    • 连接方式:
      • PWM控制引脚:TIM2_CH1/CH2(PA0/PA1)
      • 方向控制:PC0-PC3(IN1-IN4)
  3. 电源系统

    • 7.4V锂电池供电(电机驱动)
    • LM2596降压至5V(传感器)
    • AMS1117-3.3V(STM32供电)

二、软件实现

1. GPIO初始化(传感器)

void Sensor_Init(void)
{
    GPIO_InitTypeDef GPIO_InitStruct;
    RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);

    GPIO_InitStruct.GPIO_Pin = GPIO_Pin_0 | GPIO_Pin_1 | GPIO_Pin_2 | GPIO_Pin_3 | GPIO_Pin_4;
    GPIO_InitStruct.GPIO_Mode = GPIO_Mode_IPU;
    GPIO_Init(GPIOA, &GPIO_InitStruct);
}

2. PWM初始化(电机控制)

void PWM_Init(uint16_t arr, uint16_t psc)
{
    TIM_TimeBaseInitTypeDef TIM_InitStruct;
    TIM_OCInitTypeDef OC_InitStruct;

    RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2, ENABLE);
    RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);

    // 配置PA0(通道1)和PA1(通道2)为复用推挽输出
    GPIO_InitStruct.GPIO_Pin = GPIO_Pin_0 | GPIO_Pin_1;
    GPIO_InitStruct.GPIO_Mode = GPIO_Mode_AF_PP;
    GPIO_InitStruct.GPIO_Speed = GPIO_Speed_50MHz;
    GPIO_Init(GPIOA, &GPIO_InitStruct);

    // 定时器基础配置
    TIM_InitStruct.TIM_Period = arr;
    TIM_InitStruct.TIM_Prescaler = psc;
    TIM_InitStruct.TIM_CounterMode = TIM_CounterMode_Up;
    TIM_TimeBaseInit(TIM2, &TIM_InitStruct);

    // PWM模式配置
    OC_InitStruct.TIM_OCMode = TIM_OCMode_PWM1;
    OC_InitStruct.TIM_OutputState = TIM_OutputState_Enable;
    OC_InitStruct.TIM_Pulse = 0;
    OC_InitStruct.TIM_OCPolarity = TIM_OCPolarity_High;

    TIM_OC1Init(TIM2, &OC_InitStruct);
    TIM_OC2Init(TIM2, &OC_InitStruct);

    TIM_Cmd(TIM2, ENABLE);
}

3. 核心控制算法(PID调节)

#define KP  40.0f
#define KD  15.0f

int last_error = 0;

int Calculate_PID(int current_error)
{
    int derivative = current_error - last_error;
    int output = KP * current_error + KD * derivative;
    last_error = current_error;
    return output;
}

void Motor_Control(int pid_output)
{
    int left_speed = 2000 + pid_output;  // 基础PWM值2000(需校准)
    int right_speed = 2000 - pid_output;

    // 限幅处理
    left_speed = (left_speed > 3999) ? 3999 : (left_speed < 0) ? 0 : left_speed;
    right_speed = (right_speed > 3999) ? 3999 : (right_speed < 0) ? 0 : right_speed;

    TIM_SetCompare1(TIM2, left_speed);   // 左电机
    TIM_SetCompare2(TIM2, right_speed);  // 右电机
}

4. 主控制逻辑

int main(void)
{
    Sensor_Init();
    PWM_Init(3999, 71);  // 72MHz/(71+1)=1MHz,50Hz PWM

    while(1)
    {
        // 读取传感器状态(二进制编码)
        uint8_t sensor_state = GPIO_ReadInputData(GPIOA) & 0x1F;

        // 路径误差计算
        int error = 0;
        switch(sensor_state){
            case 0b00011: error = -2; break;
            case 0b00111: error = -1; break;
            case 0b00110: error = 0; break;
            case 0b11100: error = 1; break;
            case 0b11000: error = 2; break;
            default: error = last_error;  // 丢失路径时保持上次误差
        }

        // PID计算并控制电机
        int pid = Calculate_PID(error);
        Motor_Control(pid);

        Delay_ms(10);  // 10ms控制周期
    }
}

三、调试要点

  1. 传感器校准

    • 使用万用表测量AO引脚电压,调节电位器使:
      • 白底时输出电压 < 1.5V
      • 黑线时输出电压 > 3.0V
  2. PID参数整定

    • 先设KI=0,逐渐增大KP直到出现震荡
    • 加入KD抑制震荡,典型比例 KP:KD ≈ 3:1
  3. 抗干扰措施

    • 在传感器电源并联100μF电解电容
    • 电机驱动电源与MCU电源完全隔离
    • 软件添加去抖滤波(连续3次检测相同结果才确认)

实际应用中需根据具体车型(轮距、重心等)和赛道特性(弯道曲率、线宽)进行参数优化。建议先使用示波器观察PWM输出波形,再结合串口打印实时误差值进行调试。

CPPDEFINES = [\'STM32F103xB\']如何选择?

移植时SConscript中 CPPDEFINES = [‘STM32F103xB’]如何选择目标芯片:STM32F103VC

2025-10-11 12:56:41

19.3-星曈科技 openmv Hopenmv发送五个uchar Openmv+STM32F103C8T6视觉巡线小车 STM32循迹小车系列教程

19.3-【星曈科技】openmv Hopenmv发送五个uchar Openmv+STM32F103C8T6视觉巡线小车 STM32循迹

2024-08-20 11:32:38

19.4-STM32接收数据-状态显示在屏幕 openMV寻迹小车控制 Openmv+STM32F103C8T6视觉巡线小车

19.4-STM32接收数据-状态显示在屏幕 openMV寻迹与小车控制 Openmv+

2024-08-20 11:12:45

利用单片机STM32F103VC和GSM进行汽车指纹报警系统设计

电子发烧友网站提供《利用单片机STM32F103VC和GSM进行汽车指纹报警系统设计.doc》资料免费下载

资料下载 佚名 2023-11-07 15:14:46

使用stm32f103c8t6设计的蓝牙小车

使用stm32f103c8t6设计的蓝牙小车,具有前进后退,左转右转等功能

资料下载 北辰轩驰 2023-08-07 16:08:44

基于STM32F103小车控制系统的设计过程

基于STM32的小车控制的电子论文,参考。

资料下载 jinyi7016 2022-03-22 15:25:58

STM32红外寻迹小车

STM32红外寻迹小车(寄存器版)最近学习了STM32,想通过制作一辆

资料下载 孙成红 2021-11-29 16:21:11

基于ARM的32位MCU芯片STM32F103x4/103x6

基于ARM的32位MCU芯片STM32F103x4/103x6

资料下载 jf_42320578 2021-05-21 15:32:12

DM9000时序怎么和STM32F103VC的FSMC A模式时序对上,其它模式可以吗?

问题:DM9000的时序时怎么和STM32F103VC的FSMCA 模式时序对上的,其它模式可以吗?有时候凭着感觉也能配置正确,但是还是觉得不是很清楚,希望大家可以指点一下,十分感谢!!!

2024-04-28 07:47:57

STM32F103VC使用simulation和虚拟串口进行串口数据收发时,进不了IDLE中断的原因?

单片机:STM32F103VC,keil版本:5.18; 在使用simulation和虚拟串口进行串口数据收发时,数据能够正常发送,但是接收数据时,能进入接收中断,进不了IDLE中断, 各位有遇到过这种情况的吗?

2024-04-26 07:09:52

意法半导体STM32F103RCXX系列型号解读

KB Flash、20 KB RAM,LQFP48封装; STM32F103VE:1 MB Flash、96 KB RAM,LQFP100封装; STM32F103VC:1 MB Flash、96 KB RAM,L

2023-08-24 18:54:49

STM32F103VC串口做输入打印到终端的方法

STM32F103VC下将串口作为输入打印到终端定义两个文件,一个是uart.c一个是uart.huart.h的代码:/*uart.h code

2022-01-12 07:01:28

STM32F103VC下如何将串口作为输入打印到终端?

STM32F103VC下如何将串口作为输入打印到终端?

2021-12-14 06:17:26

如何对基于STM32寻迹小车进行PID调速呢

怎样去设计一种基于STM32的寻迹小车呢?如何对基于STM32的

2021-11-18 07:23:49

新手学习stm32f103vc的方法?

老师给买了一个stm32f103vc板子,不带触摸屏的,还有jtag v8。看了一点stm32固件库使用手册中文翻译版,现在初学,采用哪个KEIL uvision 4的版本比较好?已经安装

2020-07-26 08:00:26
7天热门专题 换一换
相关标签