从‘相位’到‘力矩’:用单片机PWM玩转TB67H450驱动器的电流控制(附Arduino代码)

张开发
2026/4/12 22:19:31 15 分钟阅读

分享文章

从‘相位’到‘力矩’:用单片机PWM玩转TB67H450驱动器的电流控制(附Arduino代码)
从能量流视角解析TB67H450驱动器的PWM电流控制技术在嵌入式开发领域精确控制电机力矩往往是区分能用和好用的关键所在。当我们面对需要恒张力控制的绕线机或是需要动态调整输出力的机械臂关节时单纯让电机转动已经不能满足需求——我们需要的是对每一安培电流的精准掌控。TB67H450这款经典驱动器芯片正是通过其独特的VREF引脚设计为我们打开了从数字信号到物理力矩的精确转换之门。传统教程往往止步于如何接线能让电机转起来却很少深入剖析PWM占空比如何一步步转化为电机轴上的扭矩。本文将带您穿越这个完整的信号链从单片机的数字PWM输出开始经过滤波电路或DAC转换成为VREF引脚的模拟电压进而控制H桥的电流输出最终体现为电机线圈中的相电流和输出力矩。我们将用示波器波形图揭示各环节的对应关系并通过可调节力矩的Arduino示例代码让这些原理真正落地为可复用的技术方案。1. TB67H450驱动器的电流控制架构解析1.1 芯片内部能量路径设计TB67H450的精妙之处在于它将数字控制与模拟功率输出完美结合。当深入分析其内部结构时会发现它实际上构建了三条相互独立却又紧密关联的能量路径逻辑控制路径IN1/IN2引脚接收来自单片机的方向控制信号功率输出路径VM引脚接入电机电源OUT1/OUT2连接电机线圈电流调节路径VREF引脚接收控制电压RS引脚实现电流检测这种三路径分离设计使得控制信号、功率输出和电流调节各司其职互不干扰。特别值得注意的是VREF引脚它作为连接数字世界与模拟世界的桥梁接收0-5V的模拟电压信号将这个电压值按1/10的比例转换为电流参考值。1.2 VREF引脚的电压-电流转换机制VREF引脚的电压与输出电流的关系可以用以下公式表示Iout (Vref × 10) / (RS × 5)其中Iout电机相电流AVrefVREF引脚电压VRS电流检测电阻Ω这个公式揭示了几个关键点输出电流与VREF电压呈线性关系RS电阻值越大相同VREF电压下输出电流越小最大输出电流受限于芯片的功率处理能力在实际应用中我们通常会选择一个适当的RS电阻值常见为0.1Ω-0.5Ω然后通过调节VREF电压来精确控制电流输出。2. PWM到模拟电压的转换技术2.1 RC滤波电路设计要点当使用PWM信号直接驱动VREF引脚时需要一个低通滤波器将数字PWM转换为平滑的模拟电压。典型的RC滤波器设计需要考虑以下参数参数计算公式设计考虑截止频率fc1/(2πRC)应远低于PWM频率(通常1/10)纹波电压Vpp≈Vcc×(fc/fpwm)决定输出平滑度响应时间τRC影响调节速度例如对于16kHz的PWM信号若选择R10kΩC1μF截止频率fc≈16Hz纹波电压Vpp≈5V×(16/16000)5mV响应时间τ10ms这种配置能在保证足够低纹波的同时提供较快的响应速度适合大多数电机控制场景。2.2 基于DAC的高精度方案对于需要更高精度的应用可以使用单片机内置DAC或外接DAC芯片直接生成VREF电压。与RC滤波方案相比DAC方案具有以下优势精度更高通常可达12位(0.1%)以上响应更快无需等待RC充电时间无纹波输出为纯净直流电压Arduino UNO等基础开发板通常没有硬件DAC但可以使用如下软件模拟方案// 使用Timer1生成8位PWM配合高阶滤波 void setupDAC() { TCCR1A _BV(COM1A1) | _BV(WGM10); // 8位相位修正PWM TCCR1B _BV(CS10); // 无预分频 pinMode(9, OUTPUT); // OC1A输出 } void setVref(byte value) { OCR1A value; // 设置PWM占空比 }3. 电流闭环控制实现方法3.1 基于RS引脚的电流检测TB67H450的RS引脚实际上是一个电流镜像输出其电压与电机相电流成正比Vrs Iout × RS通过测量这个电压我们可以实现电流闭环控制。典型电路会在RS引脚与地之间接入一个精密电阻如0.1Ω 1%然后用运算放大器放大这个微小电压信号供ADC读取。3.2 PID控制算法实现下面是一个针对Arduino平台的简易PID电流控制器实现class CurrentPID { public: CurrentPID(float Kp, float Ki, float Kd, float maxOutput) { this-Kp Kp; this-Ki Ki; this-Kd Kd; this-maxOutput maxOutput; lastError integral 0; } float update(float setpoint, float actual, float dt) { float error setpoint - actual; integral error * dt; float derivative (error - lastError) / dt; lastError error; float output Kp*error Ki*integral Kd*derivative; return constrain(output, 0, maxOutput); } private: float Kp, Ki, Kd; float maxOutput; float lastError, integral; }; // 使用示例 CurrentPID pid(0.5, 0.1, 0.01, 255); // 创建PID控制器 void loop() { static unsigned long lastTime 0; unsigned long now millis(); float dt (now - lastTime) / 1000.0; lastTime now; float current analogRead(A0) * 0.0049 / 0.1; // 假设RS0.1Ω float pwm pid.update(targetCurrent, current, dt); analogWrite(PWM_PIN, pwm); }4. 力矩控制实战应用4.1 绕线机恒张力控制方案在绕线机应用中保持恒定的线材张力至关重要。通过实时测量张力传感器信号我们可以动态调整电机电流来实现恒张力控制。系统架构通常包括张力检测环节使用应变片或压力传感器测量实际张力信号调理电路放大传感器信号供ADC读取控制算法PID控制器计算所需电流电流驱动通过TB67H450输出相应电流一个典型的控制流程如下读取张力传感器电压值计算当前张力与目标张力的偏差通过PID算法确定需要的电机电流调节PWM占空比改变VREF电压读取RS电压验证实际电流闭环调整直至张力稳定4.2 机械臂关节自适应控制机械臂关节需要根据负载自动调整输出力矩。基于TB67H450的实现方案通常包含以下特点重力补偿根据关节角度计算重力矩并预补偿动态调整根据实际运动状态调节电流安全保护设置电流上限防止过载关节控制器的核心代码结构可能如下void updateJoint(int jointIndex, float angle, float velocity) { // 计算重力补偿 float gravityTorque computeGravityTorque(jointIndex, angle); // 计算运动所需扭矩 float motionTorque computeMotionTorque(velocity, acceleration); // 总需求扭矩 float totalTorque gravityTorque motionTorque; // 转换为电流指令 (考虑电机扭矩常数) float current totalTorque / torqueConstant; // 设置电流 setMotorCurrent(jointIndex, current); }在实际调试中我们通常会先用示波器观察PWM信号、VREF电压和RS电压波形确保各环节转换关系符合预期。一个经验法则是当提高PWM占空比时应该能观察到VREF电压平稳上升同时RS电压同步增加且三者之间没有明显的相位延迟或波形畸变。

更多文章