1. 项目背景与核心器件选型
在工业自动化和小型机器人领域,直流电机控制一直是基础但关键的技术环节。这次我们要探讨的是基于TB6593FNG驱动芯片和PIC18F96J94主控的定制化解决方案——这个组合特别适合需要精确控制的中小型直流电机应用场景。
TB6593FNG是东芝推出的H桥电机驱动器,最大支持40V/3A的驱动能力,内置了过流、过热和欠压保护功能。它的PWM频率支持范围广(5kHz-100kHz),而且具有低导通电阻(上下桥臂合计仅0.6Ω)。这些特性使其在中小功率直流电机驱动中表现出色,尤其是需要频繁启停和正反转的场合。
PIC18F96J94则是Microchip的8位MCU,虽然架构传统,但其丰富的外设(特别是PWM模块和ADC)配合96KB Flash+3.8KB RAM的资源,完全能满足大多数直流电机控制的需求。我选择它的一个重要原因是其内置的ECAN模块,这在需要多电机协同的系统中非常实用。
提示:虽然STM32系列现在更流行,但在抗干扰要求高的工业场景,PIC18F96J94经过验证的稳定性和丰富的通信接口往往更具优势。
2. 硬件设计关键细节
2.1 电源与滤波设计
根据TB6593FNG的datasheet建议,我们在VM电源引脚布置了三级滤波:
- 主电源入口:100μF电解电容 + 10μF陶瓷电容
- 芯片近端:47μF钽电容 + 100nF陶瓷电容
- 每个H桥输出端:0.1μF陶瓷电容
这种设计实测可将电源纹波控制在50mV以内(负载电流2A时)。特别要注意的是,当PWM频率高于20kHz时,陶瓷电容的ESR特性会直接影响开关噪声,建议使用X7R或更好的材质。
2.2 散热与布局
TB6593FNG的HSOP8封装虽然小巧,但在3A连续电流下仍会产生约2W的热耗散(P=I²×Rds(on))。我们的解决方案是:
- 使用2oz铜厚的PCB
- 在芯片底部布置4×4阵列的过孔(直径0.3mm)连接到地平面
- 保留3cm²以上的裸露铜皮区域
实测表明,这种设计在25℃环境温度下可使结温保持在75℃以下,无需额外散热片。
2.3 信号隔离与保护
由于PIC18F96J94是3.3V器件而TB6593FNG支持5V逻辑,我们采用了双向电平转换电路(使用TXB0108PWR),同时:
- 所有控制信号线串联22Ω电阻
- 在IN1/IN2引脚对地接100pF电容
- 电机输出端布置TVS二极管阵列(SMBJ15CA)
3. 固件实现与PID控制
3.1 PWM配置要点
PIC18F96J94的PWM模块配置有几个关键参数需要特别注意:
// PWM周期计算示例(16MHz主频) PR2 = 199; // PWM周期 = (PR2+1)*4*Tosc*TMR2预分频 // = 200*4*(1/16MHz)*16 = 800μs → 1.25kHz T2CON = 0b00000111; // TMR2开启,预分频1:16 CCP1CON = 0b00001100; // PWM模式实际测试发现,当PWM频率低于5kHz时,电机运行会有明显噪声;高于20kHz时,TB6593FNG的开关损耗会显著增加。我们最终选择12.5kHz作为平衡点。
3.2 速度闭环实现
采用增量式PID算法,代码核心如下:
typedef struct { float Kp, Ki, Kd; float err, last_err, integral; } PID_Controller; float PID_Update(PID_Controller* pid, float setpoint, float actual) { pid->err = setpoint - actual; pid->integral += pid->err; float derivative = pid->err - pid->last_err; pid->last_err = pid->err; return pid->Kp * pid->err + pid->Ki * pid->integral + pid->Kd * derivative; }参数整定经验:
- 先设Ki=0,Kd=0,逐步增加Kp直到出现等幅振荡
- 取振荡周期Tu,按Ziegler-Nichols法设置:
- Kp = 0.6 × Ku
- Ki = 2 × Kp / Tu
- Kd = Kp × Tu / 8
- 最后根据实际响应微调
3.3 电流检测与保护
利用TB6593FNG的IS引脚输出(50mA/A的灵敏度),通过PIC18F96J94的ADC检测电流。关键校准步骤:
- 电机堵转,记录ADC原始值作为3A基准
- 空载运行,记录底噪值
- 采用两点校准公式:
actual_current = (raw_adc - offset) * scale_factor;
过流保护策略采用"渐进式响应":
- 超过额定值120%:降低PWM占空比
- 超过150%:立即关闭PWM输出
- 持续500ms后尝试软启动
4. 实测性能与优化
4.1 基础性能指标
测试电机:24V/50W有刷直流电机(额定转速3000RPM)
| 指标 | 开环控制 | PID闭环控制 |
|---|---|---|
| 转速波动 | ±15% | ±2% |
| 阶跃响应时间 | 无 | 200ms |
| 负载调整率 | 30% | <5% |
| 效率@50%负载 | 68% | 72% |
4.2 死区时间优化
TB6593FNG的典型死区时间是1μs,但我们发现通过调整IN1/IN2的切换时序可以进一步降低扭矩脉动:
// 优化后的换向时序 void SetMotorDirection(bool forward) { if(forward) { IN1 = 1; delay_us(0.5); // 关键延迟 IN2 = 0; } else { IN2 = 1; delay_us(0.5); IN1 = 0; } }这个0.5μs的延迟使得桥臂切换时的交越失真降低了约40%。
4.3 抗干扰措施
在工业现场测试中,我们遇到了几个典型问题及解决方案:
EMI导致MCU复位
- 在PIC18F96J94的MCLR引脚增加10kΩ上拉+0.1μF电容
- 电机电缆改用屏蔽双绞线,屏蔽层单端接地
地环路引入噪声
- 将TB6593FNG的GND与PIC的数字地通过0Ω电阻单点连接
- 模拟部分(如电流检测)采用独立地平面
启动冲击电流
- 实现软启动算法:PWM占空比从10%开始,每10ms增加1%
- 在VM电源端加入NTC热敏电阻(10Ω/5A规格)
5. 进阶功能实现
5.1 基于mikroBUS的扩展
利用PIC18F96J94的SPI接口连接mikroBUS插座,可以方便地添加传感器模块。例如接上加速度计后,我们实现了振动抑制算法:
void VibrationSuppression(float accel_data) { static float filter_buffer[5] = {0}; // 滑动平均滤波 for(int i=4; i>0; i--) filter_buffer[i] = filter_buffer[i-1]; filter_buffer[0] = accel_data; float avg = (filter_buffer[0]+filter_buffer[1]*0.8 + filter_buffer[2]*0.6+filter_buffer[3]*0.4 + filter_buffer[4]*0.2)/3; if(fabs(avg) > 0.2g) AdjustPID(0.9, 1.1, 0.95); // 动态调整PID参数 }5.2 CAN总线通信
PIC18F96J94内置的ECAN模块支持CAN2.0B协议。在多电机协同场景下,我们定义了以下通信协议:
| 字节 | 内容 | 说明 |
|---|---|---|
| 0 | 目标地址 | 0x00为广播地址 |
| 1 | 命令字 | 0x01: 启停, 0x02: 调速 |
| 2-3 | 转速设定值 | 大端格式,单位RPM |
| 4-5 | 电流限制值 | 大端格式,单位mA |
| 6 | 校验和 | 前5字节异或值 |
一个典型的调速指令发送示例:
void CAN_SendSpeed(uint8_t addr, uint16_t rpm, uint16_t current_limit) { uint8_t buf[7]; buf[0] = addr; buf[1] = 0x02; buf[2] = rpm >> 8; buf[3] = rpm & 0xFF; buf[4] = current_limit >> 8; buf[5] = current_limit & 0xFF; buf[6] = buf[0] ^ buf[1] ^ buf[2] ^ buf[3] ^ buf[4] ^ buf[5]; ECAN_Transmit(0, buf, 7); }5.3 能量回馈处理
在快速减速时,电机会变成发电机向电源回馈能量。我们的解决方案是:
- 在VM端并联5.6Ω/50W制动电阻
- 通过比较器检测母线电压(分压电阻网络为10k+2.2k)
- 当电压超过28V时,通过MOSFET(IRL3803)接通制动电阻
关键电路参数:
- 电压检测滞回:26V开启,24V关闭
- 制动脉冲宽度:100ms周期,占空比根据过压程度动态调整
6. 开发工具与调试技巧
6.1 必备工具清单
| 工具/软件 | 用途 | 备注 |
|---|---|---|
| MPLAB X IDE | 主开发环境 | 需安装XC8编译器 |
| PICkit 4 | 编程调试器 | 支持实时调试 |
| Saleae Logic 8 | 逻辑分析仪 | 分析PWM和信号时序 |
| 直流电子负载 | 模拟不同工况 | 可编程电流模式最佳 |
| 红外测温枪 | 监测关键点温升 | 建议分辨率≤1℃ |
6.2 调试技巧分享
示波器探头接法:
- 测量PWM信号时,接地夹尽量靠近测试点
- 电机端电压测量建议使用差分探头
- 电流波形用电流探头或采样电阻+示波器数学运算
常见问题排查表:
| 现象 | 可能原因 | 排查步骤 |
|---|---|---|
| 电机抖动 | 死区时间不足 | 增大IN1/IN2切换延迟 |
| 空载电流过大 | H桥上下管直通 | 检查控制信号逻辑 |
| 高速时保护触发 | 反电动势导致过压 | 增加制动电阻或降低减速斜率 |
| CAN通信失败 | 终端电阻缺失 | 在总线两端加120Ω电阻 |
| ADC读数不稳定 | 地环路干扰 | 检查模拟地分离情况 |
6.3 量产测试方案
我们设计了自动化测试流程,主要包含:
静态测试
- 各电源对地阻抗
- 待机电流(应<5mA)
- GPIO电平测试
动态测试
- 全速空载运行1分钟
- 50%负载阶跃测试
- 正反转切换测试(每秒1次,持续30秒)
老化测试
- 高温环境(60℃)连续运行8小时
- 振动测试(5-500Hz扫频)
测试数据通过脚本自动记录,生成如下格式的报告:
[2024-03-20 14:00:00] SN:001234 - 静态测试: PASS - 动态测试: * 空载电流: 120mA (规格≤150mA) * 转速误差: ±1.2% (规格±3%) * 温升: 32℃→58℃ (规格≤65℃) - 老化测试: 无异常重启 RESULT: PASS