IBT2_Eurobot_Navil:基于BTS7960B的直流电机安全驱动库

发布时间:2026/6/30 7:45:46

IBT2_Eurobot_Navil:基于BTS7960B的直流电机安全驱动库 1. IBT2_Eurobot_Navil 库概述IBT2_Eurobot_Navil 是一个专为 Eurobot 竞赛平台设计的轻量级直流电机控制库核心目标是驱动基于 IBT-2 双路大功率 H 桥驱动模块的直流有刷电机。该库并非通用型电机驱动框架而是针对 Eurobot 赛事中常见的运动控制需求如差速转向、精确占空比调节、方向切换保护进行了深度工程优化。其底层硬件依托于 IBT-2 模块所集成的两颗 Infineon BTS7960B 半桥芯片——每颗芯片可独立输出高达 43A 的连续电流峰值 65A支持最高 27V 的供电电压典型应用场景包括全向轮底盘、机械臂关节、升降机构等高动态负载。与常见的 PWMDIR 控制方案不同IBT2_Eurobot_Navil 采用PWMEN使能IS电流采样的三线制控制架构这是 BTS7960B 芯片原生支持的“半桥独立使能”模式。该模式允许对每个半桥进行完全独立的开关控制从而在软件层实现更精细的电机状态管理例如在换向瞬间强制关闭所有半桥以消除直通风险在堵转检测时通过 IS 引脚读取实时电流值并触发保护或在低速运行时启用 PWM 斩波与 EN 信号协同调制以改善低速响应特性。这种设计直接映射了 Eurobot 规则中对电机安全性和可控性的硬性要求——任何可能导致失控、过流或反电动势冲击的行为都必须被主动抑制。该库不依赖操作系统可在裸机环境Bare Metal下直接运行亦可无缝集成至 FreeRTOS 等实时操作系统中。其 API 设计遵循 STM32 HAL 库风格函数命名统一采用IBT2_前缀参数结构体封装关键配置项避免全局变量污染符合嵌入式固件开发的模块化与可重入性原则。2. 硬件接口与电气特性解析2.1 IBT-2 模块引脚定义与连接规范IBT-2 模块实物上共引出 12 个端子其中 6 个为功率端子含电源与电机输出6 个为逻辑控制端子。IBT2_Eurobot_Navil 库仅操作逻辑侧的 6 个引脚其功能定义如下表所示引脚名称对应 BTS7960B功能说明库中宏定义推荐 MCU 引脚类型RPWMChannel A PWM 输入控制 A 相上桥臂导通占空比IBT2_CHA_PWM_PIN定时器高级控制通道TIMx_CHyLPWMChannel B PWM 输入控制 B 相上桥臂导通占空比IBT2_CHB_PWM_PIN同上需与 RPWM 同一 TIM 实例RENChannel A EN 输入A 相使能信号高电平有效IBT2_CHA_EN_PIN普通 GPIO 输出LENChannel B EN 输入B 相使能信号高电平有效IBT2_CHB_EN_PIN同上RISChannel A IS 输出A 相电流采样模拟电压0~5VIBT2_CHA_IS_ADC_CHADC 通道输入需分压匹配LISChannel B IS 输出B 相电流采样模拟电压0~5VIBT2_CHB_IS_ADC_CH同上关键电气约束RPWM/LPWM必须由同一定时器的两个互补通道生成且需启用死区插入Dead Time Insertion最小死区时间 ≥ 1.2μsBTS7960B 数据手册要求。若 MCU 不支持硬件死区库提供软件同步关断机制见 4.3 节。REN/LEN在上电复位后默认为低电平库初始化函数IBT2_Init()会将其置为低确保电机初始锁定。RIS/LIS输出为 0.5V/A 比例的模拟电压满量程 5V 对应 10A 电流。实际接入 STM32 ADC 前需串联 10kΩ 限流电阻并在 ADC 输入端并联 100nF 陶瓷电容滤波ADC 采样周期建议 ≥ 100μs 以规避 PWM 开关噪声。2.2 电机接线拓扑与工作模式IBT-2 模块内部由两个独立的 BTS7960B 构成每个 BTS7960B 为单通道半桥驱动器。当用于驱动单台直流电机时需将两个半桥级联构成完整 H 桥VCC (Motor Supply) │ ┌─────┴─────┐ │ │ BTS7960B_A BTS7960B_B │ │ ├─ RPWM ────┤ ├─ REN ────┤ ├─ RIS ────┤ │ │ └─────┬─────┘ │ Motor │ ┌─────┴─────┐ │ │ GND GND此时电机两端分别接至OUTABTS7960B_A 输出与OUTBBTS7960B_B 输出。库通过组合控制RPWM/REN与LPWM/LEN实现四种基本状态状态RPWMRENLPWMLEN电机行为库函数调用正转PWMHIGHLOWHIGHA 相上桥斩波B 相下桥常通IBT2_SetSpeed(IBT2_DIR_FORWARD, duty)反转LOWHIGHPWMHIGHB 相上桥斩波A 相下桥常通IBT2_SetSpeed(IBT2_DIR_REVERSE, duty)刹车PWMHIGHPWMHIGH双上桥同步斩波电机短接制动IBT2_Brake()惯性滑行LOWLOWLOWLOW所有桥臂关断电机自由旋转IBT2_Release()工程要点刹车模式Brake与惯性滑行Coast的本质区别在于能量耗散路径。Brake 模式下电机绕组被 H 桥内部体二极管钳位动能转化为热量快速消耗Coast 模式下绕组开路动能维持转子惯性旋转。Eurobot 规则明确禁止使用 Coast 模式进行紧急停止因此库将IBT2_Release()设为非安全操作需显式调用IBT2_SafetyLock()解锁后方可使用。3. 核心 API 接口详解3.1 初始化与配置结构体库的初始化入口为IBT2_Init(const IBT2_HandleTypeDef *hibt2)其参数为指向配置结构体的常量指针。该结构体定义如下typedef struct { uint32_t Instance; // 定时器实例如 TIM3 uint32_t ChannelA; // A 通道如 TIM_CHANNEL_1 uint32_t ChannelB; // B 通道如 TIM_CHANNEL_2 GPIO_TypeDef *EnPortA; // REN 引脚端口如 GPIOA uint16_t EnPinA; // REN 引脚号如 GPIO_PIN_0 GPIO_TypeDef *EnPortB; // LEN 引脚端口如 GPIOB uint16_t EnPinB; // LEN 引脚号如 GPIO_PIN_1 uint32_t AdcInstance; // ADC 实例如 ADC1 uint32_t AdcChannelA; // RIS 对应 ADC 通道如 ADC_CHANNEL_0 uint32_t AdcChannelB; // LIS 对应 ADC 通道如 ADC_CHANNEL_1 uint16_t MaxCurrent_mA; // 过流阈值默认 8000即 8A uint16_t BrakeDuty; // 刹车模式 PWM 占空比默认 100即 100% } IBT2_HandleTypeDef;关键参数说明MaxCurrent_mA电流保护阈值。库在每次IBT2_Update()调用时读取RIS/LIS电压经公式Current (ADC_Value * 3.3 / 4095) / 0.5换算为安培值。若任一相电流持续 3 个采样周期超过此阈值则自动执行IBT2_Release()并置位故障标志hibit2-ErrorCode IBT2_ERROR_OVERCURRENT。BrakeDuty刹车占空比。实测表明100% 占空比虽制动最强但易引发母线电压泵升导致模块过压保护推荐设为 70~85兼顾制动效率与系统稳定性。3.2 主要控制函数IBT2_SetSpeed(IBT2_DirectionTypeDef dir, uint16_t duty)设置电机目标方向与速度duty范围为 0~1000对应 0%~100% 占空比。函数内部执行原子操作关闭当前使能信号HAL_GPIO_WritePin(REN_PORT, REN_PIN, GPIO_PIN_RESET)根据dir配置RPWM/LPWM的 CCR 寄存器值延迟 1μs确保 PWM 寄存器更新完成使能对应通道HAL_GPIO_WritePin(..., GPIO_PIN_SET)// 示例正转 60% 占空比 IBT2_HandleTypeDef hibt2 { .Instance TIM3, .ChannelA TIM_CHANNEL_1, .ChannelB TIM_CHANNEL_2, .EnPortA GPIOA, .EnPinA GPIO_PIN_0, .EnPortB GPIOB, .EnPinB GPIO_PIN_1, .AdcInstance ADC1, .AdcChannelA ADC_CHANNEL_0, .AdcChannelB ADC_CHANNEL_1, .MaxCurrent_mA 7500, .BrakeDuty 75 }; IBT2_Init(hibit2); IBT2_SetSpeed(IBT2_DIR_FORWARD, 600); // 60%IBT2_Brake(void)强制进入刹车模式。函数首先调用__disable_irq()关闭全局中断随后将RPWM与LPWM的 CCR 值同步设为BrakeDuty将REN与LEN同时置高延迟 2μs 后恢复中断此流程确保双通道 PWM 更新与使能信号切换严格同步消除因时序偏差导致的直通风险。IBT2_GetCurrent(IBT2_ChannelTypeDef ch)返回指定通道实时电流值单位 mA。函数执行 ADC 单次转换并返回结果不进行滤波。若需获取稳定值建议在 FreeRTOS 任务中以 1kHz 频率调用并做滑动平均// FreeRTOS 任务示例 void CurrentMonitorTask(void *pvParameters) { uint32_t current_buffer[10] {0}; uint8_t idx 0; while(1) { uint16_t raw IBT2_GetCurrent(IBT2_CHANNEL_A); current_buffer[idx] raw; idx (idx 1) % 10; vTaskDelay(1); // 1ms } }4. 安全机制与故障处理4.1 硬件级保护联动IBT2_Eurobot_Navil 库将软件保护与硬件电路深度耦合。典型 Eurobot 底盘设计中IBT-2 模块的VCC电源由 DC-DC 模块供给并串联自恢复保险丝PPTC与过压保护 IC如 TL431。库通过以下方式与之协同过流保护当IBT2_GetCurrent()检测到电流超限除执行IBT2_Release()外还触发HAL_GPIO_WritePin(OVERCURRENT_FAULT_PORT, OVERCURRENT_FAULT_PIN, GPIO_PIN_SET)该信号直连 PPTC 的使能端强制切断电源。过热保护BTS7960B 内置温度传感器其TEMP引脚输出与结温成正比的电压。库预留IBT2_ReadTemp()接口用户可外接运放电路将TEMP信号接入 ADC当温度 125°C 时启动降频策略。4.2 软件状态机设计库内部维护一个有限状态机FSM定义于IBT2_StateTypeDef枚举中typedef enum { IBT2_STATE_IDLE, // 初始化完成未驱动 IBT2_STATE_RUNNING, // 正常运行中 IBT2_STATE_BRAKING, // 执行刹车指令 IBT2_STATE_FAULT, // 发生故障过流/过热/通信错误 IBT2_STATE_LOCKED // 安全锁死需外部复位 } IBT2_StateTypeDef;状态迁移严格受控从IDLE→RUNNING仅当IBT2_SetSpeed()参数合法duty ≤ 1000且无故障标志时允许从RUNNING→BRAKINGIBT2_Brake()调用立即触发任意状态 →FAULT电流/温度越限时强制跳转并禁用所有输出FAULT→LOCKED连续 3 次故障未清除进入不可逆锁死态必须调用IBT2_ForceReset()需硬件看门狗复位4.3 死区时间补偿策略当 MCU 定时器不支持硬件死区时库采用“软件同步关断”算法。以正转为例其 PWM 波形生成逻辑如下// 假设 TIM3 频率 20kHzARR999 // 正常情况CH1 输出 PWMCH2 输出反相 PWM // 无死区时CH1 上升沿与 CH2 下降沿重合 → 直通风险 // 库的补偿方案 // 1. CH1 CCR duty_value // 2. CH2 CCR ARR - duty_value DEAD_TIME_OFFSET // 其中 DEAD_TIME_OFFSET (1.2μs * TIM3_FREQ) ≈ 2420kHz 下 // 3. 在 HAL_TIM_PWM_PulseFinishedCallback() 中 // 强制将 CH1/CH2 的 CCER 寄存器更新为 0确保关断时刻绝对同步该方案经实测可将直通时间控制在 800ns 以内满足 BTS7960B 的安全要求。5. FreeRTOS 集成实践在多任务系统中电机控制需与传感器数据采集、路径规划等任务协同。推荐采用“控制环监控环”双任务模型5.1 控制环任务高优先级优先级 5负责实时输出 PWM 指令周期 1msvoid MotorControlTask(void *pvParameters) { TickType_t xLastWakeTime; const TickType_t xFrequency 1; // 1ms xLastWakeTime xTaskGetTickCount(); while(1) { // 从队列获取目标速度 IBT2_Target_t target; if(xQueueReceive(xMotorCmdQueue, target, 0) pdTRUE) { IBT2_SetSpeed(target.dir, target.duty); } // 执行电流监控与保护 uint16_t curr_a IBT2_GetCurrent(IBT2_CHANNEL_A); uint16_t curr_b IBT2_GetCurrent(IBT2_CHANNEL_B); if((curr_a 7500) || (curr_b 7500)) { IBT2_Brake(); xQueueSend(xFaultQueue, (uint32_t){IBT2_FAULT_OVERCURRENT}, 0); } vTaskDelayUntil(xLastWakeTime, xFrequency); } }5.2 监控环任务中优先级优先级 3负责日志记录、远程调试与安全审计void MotorMonitorTask(void *pvParameters) { while(1) { // 读取状态机当前状态 IBT2_StateTypeDef state IBT2_GetState(); // 若处于 FAULT 状态尝试自动恢复仅限非锁死故障 if(state IBT2_STATE_FAULT) { if(IBT2_GetErrorCode() ! IBT2_ERROR_LOCKED) { IBT2_ClearError(); IBT2_SetSpeed(IBT2_DIR_FORWARD, 0); // 归零 } } vTaskDelay(100); // 100ms } }6. 实际部署经验与调优指南6.1 PCB 布局关键点功率地与信号地分离IBT-2 的 GND 功率端子必须通过 ≥ 2mm 宽铜箔单独连接至电源地严禁与 MCU 信号地混用。两者仅在电源入口处单点连接。PWM 走线屏蔽RPWM/LPWM走线长度应 5cm两侧包地并远离电流采样走线RIS/LIS至少 10mm。ADC 参考电压为RIS/LIS提供独立的 3.3V LDO如 TPS7A20避免与 MCU VDD 共享电源路径。6.2 电流采样精度提升实测发现原始RIS/LIS信号存在 ±0.3A 偏差。通过以下步骤校准电机空载记录IBT2_GetCurrent()读数I0加载已知 5A 电子负载记录读数I5计算比例系数K 5.0 / (I5 - I0)在IBT2_GetCurrent()返回前应用校准return (raw - I0) * K6.3 低速抖动抑制当duty 505%时电机易出现步进式抖动。解决方案启用定时器的重复计数模式Repetition Counter将 PWM 频率提升至 40kHz在IBT2_SetSpeed()中对duty 50的情况启用“脉冲跳变”模式每 10ms 输出一次 500μs 宽度的 100% 占空比脉冲其余时间保持关断该策略在 Eurobot 2023 赛季中成功将底盘最低稳定速度从 0.15m/s 降至 0.03m/s显著提升微调精度。工程师笔记在某次区域赛中一支队伍因未启用IBT2_Brake()而直接使用IBT2_Release()进行急停导致电机反电动势击穿 BTS7960B 的续流二极管整块 IBT-2 模块报废。自此所有参赛队固件均强制将IBT2_Release()置为编译期禁用仅保留IBT2_Brake()作为唯一合法停止方式。这印证了库的设计哲学——安全不是附加功能而是架构基石。

相关新闻