我现在做了一个小车,我现在是通过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-SR501或IR 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); } }
三、总结
🔧 改进步骤如下:
- 更换电源方案:使用锂电池 + 稳压模块,避免干电池电压波动。
- 优化电机驱动电路:确保PWM信号正确配置,电机能够正常运转。
- 正确连接红外传感器:使用带OUT引脚的传感器模块,设置为输入模式。
- 编写合理的控制逻辑:根据传感器状态控制小车运动。
如果你愿意提供具体的代码片段或硬件连接图,我可以进一步帮你调试和优化。希望这些内容对你有所帮助!
解决 无用评论 打赏 举报