CHAPTER 14 / FIELD GUIDE

电机与供电

先控制一个轮子,再装整车。

建议用时 60 分钟先预测,再实验,再解释

GPIO 发命令,驱动器提供电流

电机启动和堵转时电流可能远大于正常运行值。DRV8833 用 H 桥切换电机端子极性,从而正反转;板子的持续电流能力由芯片封装、散热和布局共同决定。选购时用真实电机电压和堵转电流匹配。

接线基线

接点连接
电池正极经物理开关DRV8833 VM / VIN,按模块丝印
电池负极驱动 GND
ESP32 GND驱动 GND,共地
ESP32 供电单独 USB,不把电池正极连到开发板
AIN1 / AIN2GPIO10 / GPIO11
BIN1 / BIN2GPIO12 / GPIO13,单轮实验暂不接电机
AOUT1 / AOUT2左电机两根线
BOUT1 / BOUT2右电机两根线,后续使用
nSLEEP(若引出)核对模块电路,拉到有效高电平;可用 10 kΩ 上拉到 3V3
AIN1/2、BIN1/2各加 10 kΩ 下拉到 GND,使复位期间输入确定为低

电机电流不要经过面包板细小电源轨和开发板。电池、驱动、马达用可靠接线端子和适当线径;地线尽量让电机大电流回路直接返回电池。VM 附近按模块要求放去耦电容;加电解电容时核对极性和耐压。

IN1IN2结果(DRV8833)
00滑行停止,高阻输出
10一个方向
01相反方向
11制动

实验工程 · 09_motor

先把轮子架空。按一下按钮,仅左电机以约 29% 指令运行 500 ms 后停止。若低占空比无法克服静摩擦,不要把轮子卡住长时间通电。

打开 main.c · 查看公共驱动 lab.c · 下载全部工程

#include "lab.h"
#include "esp_log.h"
void app_main(void) {
    button_init();
    motor_init();
    motor_set(0,0);
    int64_t stop_at=0;
    bool running=false;
    for(;; ) {
        if(button_pressed()&&!running) {
            motor_set(300,0);
            running=true;
            stop_at=now_ms()+500;
        }
        if(running&&now_ms()>=stop_at) {
            motor_set(0,0);
            running=false;
            ESP_LOGI("motor","stopped");
        }
        vTaskDelay(pdMS_TO_TICKS(10));
    }
}
停下来想一想

为什么电机一启动,ESP32 就重启,但单独运行屏幕正常?

查看推导与答案

优先检查供电压降、回流路径和电机噪声。先把电机电源与逻辑供电分开并共地,检查接线与去耦,再考虑软件;仅修改延迟通常不能修复电源问题。

本章验收

本章一手资料

卡住时可以直接向我提问:附上章节号、工程名、接线和第一条错误日志。