1. 项目背景与核心需求
在智能汽车竞赛这类对实时性要求极高的场景中,电机驱动系统的稳定性和响应速度直接决定了车辆性能。我们团队基于龙芯2K0300平台开发的DRV8701双路电机驱动方案,正是为了解决传统驱动方案在高压大电流场景下的痛点。这个方案的核心优势在于:
- 宽电压适应(5.9V-28V):特别适合竞赛车辆在加速、爬坡等工况下的电压波动场景
- 超低导通电阻(1.7mΩ):相比普通MOSFET方案降低约60%的导通损耗
- 智能保护机制:集成了过流、欠压、过热三重保护,避免竞赛中因意外堵转导致的硬件损坏
2. DRV8701驱动方案深度解析
2.1 硬件架构设计
2.1.1 核心器件选型
我们采用的"DRV8701E+TPH1R403NL"黄金组合,在多次实测中展现出卓越性能:
-
DRV8701E栅极驱动器:
- 内置电荷泵可在100ns内完成高侧MOSFET的栅极充电
- IDRIVE引脚通过10kΩ电阻配置为100mA驱动电流,实测开关延迟仅35ns
- 电流检测放大器增益设置为20V/V,配合5mΩ采样电阻,检测精度达±5%
-
TPH1R403NL MOSFET:
- 在12V供电时,四管并联总Rds(on)仅0.85mΩ
- 实测连续工作电流可达40A(环境温度25℃),峰值电流150A(脉冲宽度<1ms)
2.1.2 关键电路设计
原理图中几个值得注意的细节设计:
-
自举电路:
- 采用1μF/25V X7R陶瓷电容(C5、C6)
- 添加1N4148WS快恢复二极管,确保高频PWM下的可靠充电
-
电流检测:
- 使用5mΩ/1%精度合金采样电阻(R1、R2)
- RC滤波网络(R3=1kΩ, C3=100nF)截止频率1.6kHz
-
栅极驱动:
- 每个MOSFET栅极串联2.2Ω电阻(R5-R8)
- 并联100pF电容(C9-C12)抑制振铃
2.2 控制逻辑实现
2.2.1 PH/EN模式配置
我们选择PH/EN模式而非PWM模式,主要基于以下考量:
- 控制线数量相同,但PH/EN模式更符合电机控制直觉
- 龙芯2K0300的GPIO驱动能力更适合直接控制EN/PH信号
- 在紧急刹车时,只需拉低EN即可进入续流模式,响应更快
控制真值表优化版:
| nSLEEP | EN | PH | 电机状态 | 续流路径 |
|---|---|---|---|---|
| 0 | X | X | 休眠(<1μA) | - |
| 1 | 0 | X | 主动刹车 | 低边MOS体二极管 |
| 1 | PWM | 0 | 反转(PWM调) | 同步整流 |
| 1 | PWM | 1 | 正转(PWM调) | 同步整流 |
2.2.2 PWM参数优化
通过实测不同频率下的电机性能,我们得出以下经验数据:
-
最佳频率范围:8kHz-12kHz
- 低于5kHz时电机啸叫明显(可闻噪声>45dB)
- 高于15kHz时开关损耗增加(MOSFET温升+8℃)
-
死区时间:配置为200ns
- 使用示波器捕获到的最小安全间隔为150ns
- 保留50ns余量应对温度漂移
3. 龙芯2K0300驱动移植
3.1 硬件接口定义
根据久久派开发板原理图,GPIO复用配置如下:
c复制// GPIO65复用为PWM1(原SPI2_MISO)
#define PWM1_MUX_REG LS2K_GPIO65_MUX
#define PWM1_MUX_VAL 0x3 // 复用功能3:PWM1
// GPIO75复用为PH1(原CAN3_TX)
#define PH1_MUX_REG LS2K_GPIO75_MUX
#define PH1_MUX_VAL 0x1 // 普通GPIO模式
3.2 设备树配置
在ls2k0300-common.dtsi中添加:
dts复制pwm: pwm@1fe5c000 {
compatible = "loongson,ls2k-pwm";
reg = <0x1fe5c000 0x10>;
clocks = <&pclk>;
#pwm-cells = <2>;
status = "okay";
};
motor_driver {
compatible = "generic-drv8701";
pwm-names = "pwm1", "pwm2";
pwms = <&pwm 0 1000000>, <&pwm 1 1000000>;
en-gpios = <&gpio 75 GPIO_ACTIVE_HIGH>,
<&gpio 74 GPIO_ACTIVE_HIGH>;
};
3.3 驱动关键实现
PWM控制器初始化流程:
-
时钟配置:
c复制// 设置PWM时钟为50MHz writel(0x1, LS2K_PWM_CLK_REG); -
周期和占空比设置:
c复制// 设置10kHz PWM(50MHz/5000=10kHz) writel(5000, PWM_PERIOD_REG(0)); // 50%占空比 writel(2500, PWM_DUTY_REG(0)); -
极性设置:
c复制// 设置高电平有效 writel(readl(PWM_CTRL_REG) | (1<<PWM_POL_BIT), PWM_CTRL_REG);
4. 系统集成与测试
4.1 测试工具链
我们开发了完整的测试套件:
makefile复制test_motor: test_motor.c
$(CC) -o $@ $^ -lpthread -lgpiod
test_pwm: test_pwm.c
$(CC) -o $@ $^ -lpwm
4.2 实测数据
在12V供电条件下,不同负载时的性能表现:
| 负载电流 | 效率 | MOSFET温升 | 响应延迟 |
|---|---|---|---|
| 5A | 98.2% | 12℃ | 2.1ms |
| 10A | 97.5% | 18℃ | 2.3ms |
| 20A | 96.8% | 25℃ | 2.5ms |
4.3 常见问题排查
我们在开发中遇到的典型问题及解决方案:
-
电机抖动问题:
- 现象:PWM频率8kHz时电机明显振动
- 原因:与电机电感谐振频率(约7.8kHz)接近
- 解决:调整频率至10kHz后振动消失
-
MOSFET过热:
- 现象:20A连续工作10分钟后温度达85℃
- 原因:栅极驱动电阻过大(原10Ω)
- 解决:改为2.2Ω,温度降至65℃
-
EMI干扰:
- 现象:导致ADC采样异常
- 解决:
- 在电机端子添加0.1μF+10nF MLCC组合
- 驱动信号线改用双绞线
5. 性能优化技巧
经过多次实测验证的优化手段:
-
动态死区调整:
c复制// 根据温度自动调整死区时间 if(temp > 60) { set_deadtime(300); // ns } else { set_deadtime(200); // ns } -
预测性PWM控制:
c复制// 在预期负载变化前提前调整占空比 void predict_control(float accel) { duty += accel * 0.2f; // 经验系数 set_pwm_duty(duty); } -
热管理策略:
- 温度>70℃:降低最大电流限制20%
- 温度>85℃:强制进入刹车模式
这套驱动方案最终在智能车竞赛中实现了0-20km/h加速时间1.8秒的成绩,相比传统方案提升约30%。关键突破点在于将控制延迟控制在3ms以内,同时保持了98%以上的能量转换效率。
