PXX13713106772 2026-05-13 17:28 采纳率: 0%
浏览 1

问题:智能小车/电机驱动

我现在做了一个小车,我现在是通过4节干电池,通过分别引出电源的负极接面包板的负极,然后正极接那个稳压模块的v in的,然后v out输出到stm32最小系统板的3.3伏,然后3.3伏的最小系统板跟面包板的正极相连,还有4个红外传感器,然后现在tp6612的AIN1跟AIN2接8跟9,bn1跟bn2接11跟12,(四个电机)左边电机的两个红色线绑在一起,黑色也是,同理右边也是。右边电机连在BO1,BO2,左电机的分别连的是AO1,AO2,然后pa0连接的是tb6612的PWA,然后pa1连接的是PWB。然后红外传感器模块连接的gpio口是7654,红外传感器在小车中间,我感觉好有问题啊,电压供电不稳定,电机都不动的,(我有尝试写代码,让4个车动过)还有红外传感器没有反应啊,亮度低,感觉不行吗,有没有自己可以做的方向啊(用的都是A口)

  • 写回答

1条回答 默认 最新

  • 檀越@新空间 2026-05-13 17:29
    关注

    下午好🌅🌅🌅
    本答案参考通义千问

    你描述的这个项目是一个基于STM32的智能小车系统,包含了电源管理、电机驱动(TP6612)、红外传感器以及控制逻辑。目前你遇到了电压不稳定、电机不转、红外传感器无反应的问题。下面我将从电源、电机驱动、红外传感器和代码逻辑几个方面进行详细分析,并给出解决方案。


    一、问题分析

    1. 电源供电不稳定

    • 你使用的是4节干电池,总电压为 6V(每节1.5V)。
    • 通过稳压模块(如LM1117或AMS1117)将6V转换为3.3V供STM32使用。
    • 然而,干电池的内阻较大,输出电流不稳定,尤其是在高负载下(比如电机启动时),电压会显著下降,导致STM32无法正常工作,甚至重启或死机。

    重点:干电池不适合用于高功耗设备(如电机)。

    2. 电机不转

    • 你提到“AIN1和AIN2接8和9,BN1和BN2接11和12”,这说明你可能在用TP6612驱动电机。
    • 但如果你没有正确配置PWM信号(如PA0和PA1连接到PWA和PWB),那么电机可能不会转动。
    • 另外,如果电源电压不足,电机也无法正常运转

    3. 红外传感器无反应

    • 你提到红外传感器连接到了GPIO口(7,6,5,4),但没有提到是否配置了上拉电阻中断/轮询检测
    • 如果传感器模块本身有输出引脚(OUT),你应该将其连接到STM32的输入引脚,而不是直接接到GPIO。
    • 如果没有正确的信号处理,可能导致传感器无法读取到有效数据。

    二、解决方案

    ✅ 1. 更换电源方案

    原因:

    • 干电池供电不稳定,尤其在电机运行时,电压骤降。
    • 会导致STM32复位、程序崩溃、电机不转。

    解决方法:

    | 选项 | 优点 | 缺点 | |------|------|------| | 锂电池组(如3.7V锂电) + 5V稳压模块(如LM2596) | 稳定、可充电 | 需要额外电源管理 | | USB供电 + 外接稳压模块 | 方便、稳定 | 不适合移动设备 |

    推荐方案:使用锂电池组(3.7V)+ LM2596 转换为5V,再通过稳压模块(如AMS1117-3.3)给STM32供电。

    锂电池(3.7V) -> LM2596(5V) -> AMS1117-3.3V(3.3V) -> STM32
                                 |
                              TP6612 (5V)
    

    ✅ 2. 检查并优化电机驱动电路

    问题:

    • 你将TP6612的PWA和PWB连接到PA0和PA1,但未提及是否开启PWM功能。
    • 如果没有设置PWM频率和占空比,电机可能不会转动。

    推荐修改后的连接方式(假设使用STM32F103C8T6):

    | TP6612引脚 | STM32引脚 | 功能 | |------------|-----------|------| | AIN1 | GPIOB_0 | 控制左电机方向 | | AIN2 | GPIOB_1 | 控制左电机方向 | | BIN1 | GPIOB_2 | 控制右电机方向 | | BIN2 | GPIOB_3 | 控制右电机方向 | | PWA | PWM_CH1 | 左电机速度控制(PA0) | | PWB | PWM_CH2 | 右电机速度控制(PA1) |

    示例代码(使用STM32 HAL库):

    // 初始化PWM
    void PWM_Init(void) {
        // 配置PA0和PA1为PWM输出
        GPIO_InitTypeDef GPIO_InitStruct;
        TIM_TimeBaseInitTypeDef TIM_TimeBaseStruct;
        TIM_OCInitTypeDef TIM_OCStruct;
    
        // 使能GPIOA和TIM2时钟
        RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA | RCC_APB2Periph_TIM2, ENABLE);
    
        // 配置PA0和PA1为复用推挽输出
        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);
    
        // 配置TIM2
        TIM_TimeBaseStruct.TIM_Prescaler = 71; // 72MHz / (72+1) = 1MHz
        TIM_TimeBaseStruct.TIM_Period = 999;   // 1MHz / 1000 = 1kHz
        TIM_TimeBaseStruct.TIM_CounterMode = TIM_CounterMode_Up;
        TIM_TimeBaseStruct.TIM_ClockDivision = TIM_CKD_DIV1;
        TIM_TimeBaseStruct.TIM_RepetitionCounter = 0;
        TIM_TimeBaseInit(TIM2, &TIM_TimeBaseStruct);
    
        // 配置PWM通道1和2
        TIM_OCStruct.TIM_OCMode = TIM_OCMode_PWM1;
        TIM_OCStruct.TIM_OutputState = TIM_OutputState_Enable;
        TIM_OCStruct.TIM_Pulse = 500; // 初始占空比50%
        TIM_OCStruct.TIM_OCPolarity = TIM_OCPolarity_High;
        TIM_OC1Init(TIM2, &TIM_OCStruct);
        TIM_OC2Init(TIM2, &TIM_OCStruct);
    
        // 使能PWM
        TIM_Cmd(TIM2, ENABLE);
        TIM_CtrlPWMOutputs(TIM2, ENABLE);
    }
    

    ✅ 3. 优化红外传感器连接与读取

    问题:

    • 你将红外传感器直接连接到GPIO口(7,6,5,4),但未提及是否配置了上拉电阻中断/轮询模式
    • 传感器可能需要模拟信号输出,而不是数字信号。

    推荐方案:

    • 使用HC-SR501IR Sensor Module(带OUT引脚)。
    • 将其OUT引脚连接到STM32的某个GPIO(例如:PB0 ~ PB7)。
    • 在代码中设置为输入模式,并读取高低电平。

    示例代码(读取红外传感器状态):

    // 初始化红外传感器引脚
    void IR_Sensor_Init(void) {
        GPIO_InitTypeDef GPIO_InitStruct;
    
        RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE);
    
        GPIO_InitStruct.GPIO_Pin = GPIO_Pin_0 | GPIO_Pin_1 | GPIO_Pin_2 | GPIO_Pin_3;
        GPIO_InitStruct.GPIO_Mode = GPIO_Mode_IN_FLOATING; // 浮空输入
        GPIO_Init(GPIOB, &GPIO_InitStruct);
    }
    
    // 读取传感器值
    uint8_t Read_IR_Sensors(void) {
        uint8_t sensors = 0;
        if (GPIO_ReadInputDataBit(GPIOB, GPIO_Pin_0)) sensors |= 0x01;
        if (GPIO_ReadInputDataBit(GPIOB, GPIO_Pin_1)) sensors |= 0x02;
        if (GPIO_ReadInputDataBit(GPIOB, GPIO_Pin_2)) sensors |= 0x04;
        if (GPIO_ReadInputDataBit(GPIOB, GPIO_Pin_3)) sensors |= 0x08;
        return sensors;
    }
    

    ✅ 4. 调整代码逻辑(示例)

    int main(void) {
        // 初始化系统
        SystemInit();
        PWM_Init();
        IR_Sensor_Init();
    
        while (1) {
            uint8_t ir_data = Read_IR_Sensors();
    
            if (ir_data == 0x0F) { // 中间传感器都亮
                // 前进
                Motor_Forward();
            } else if (ir_data & 0x01) { // 左侧传感器亮
                // 左转
                Motor_Left();
            } else if (ir_data & 0x08) { // 右侧传感器亮
                // 右转
                Motor_Right();
            } else {
                // 停止
                Motor_Stop();
            }
    
            delay_ms(100);
        }
    }
    

    三、总结

    🔧 改进步骤如下:

    1. 更换电源方案:使用锂电池 + 稳压模块,避免干电池电压波动。
    2. 优化电机驱动电路:确保PWM信号正确配置,电机能够正常运转。
    3. 正确连接红外传感器:使用带OUT引脚的传感器模块,设置为输入模式。
    4. 编写合理的控制逻辑:根据传感器状态控制小车运动。

    如果你愿意提供具体的代码片段或硬件连接图,我可以进一步帮你调试和优化。希望这些内容对你有所帮助!

    评论

报告相同问题?

问题事件

  • 创建了问题 5月13日