4. 安全保护机制:过压保护、欠压保护、过流保护、温度保护电路设计
好了,咱们接着聊牙刷的「保命」电路。
说实话,电动牙刷这玩意儿,看着小,但里面又是电机又是电池,还有充电电路。万一哪个环节出问题,轻则牙刷报废,重则...你懂的。所以安全保护机制,是必须认真对待的。
我个人习惯把保护电路分成四类:过压、欠压、过流、温度。咱们一个一个来拆解。
4.1 过压保护:别让电压冲昏了头
过压保护,说白了就是防止电压太高把芯片烧了。牙刷里最怕过压的,就是主控MCU和锂电池充电管理芯片。
为什么会过压?最常见的情况是充电器坏了,输出一个不正常的电压。或者用户用了非原装充电器,输出5V变成了9V。嗯,我见过不少这样的案例。
核心思路:在电源输入端加一个TVS管(瞬态抑制二极管),再加一个过压保护芯片。
我常用的方案是这样的:
// 过压保护电路关键参数
// TVS管选型:SMBJ5.0A,击穿电压6.4V,钳位电压9.2V
// 过压保护芯片:TPS2521,过压阈值6.0V,响应时间<1μs
// 电路连接示意
// VBUS --- [TVS管到GND] --- [TPS2521 IN] --- [TPS2521 OUT] --- 负载
// |
// [分压电阻到GND]
这里有个坑,我踩过。TVS管的钳位电压一定要选对。你想想看,如果牙刷的充电电压是5V,你选个钳位电压12V的TVS管,那等它起作用的时候,后面的芯片早就冒烟了。
我的经验:TVS管的钳位电压,最好选在正常电压的1.2~1.5倍。比如5V系统,选6~8V钳位的TVS管。别贪便宜买那种参数虚标的,我吃过亏。
4.2 欠压保护:电池没电了就别硬撑
欠压保护,主要是针对锂电池的。锂电池最怕过放,一旦电压低于2.7V,电池内部结构就可能损坏,甚至鼓包。
我记得有一次,一个客户反馈牙刷用着用着突然不转了,但充电又能用。拆开一看,电池电压只有2.5V,已经过放了。幸好没鼓包,不然就危险了。
欠压保护怎么做?两种方法:
- 硬件方案:用电压比较器+基准电压源。当电池电压低于设定阈值时,比较器输出低电平,切断负载。
- 软件方案:MCU通过ADC采样电池电压,低于阈值时主动关闭电机。
我个人更推荐软硬结合。为什么?因为纯软件方案有个隐患:如果MCU死机了,欠压保护就失效了。
// 欠压保护阈值设定(以3.7V锂电池为例)
#define BATTERY_UNDER_VOLTAGE_THRESHOLD 3.0f // 单位:V
#define BATTERY_SHUTDOWN_THRESHOLD 2.9f // 单位:V
// 软件欠压检测函数
void check_battery_voltage(void) {
float vbat = get_battery_voltage();
if (vbat < BATTERY_SHUTDOWN_THRESHOLD) {
// 切断电机电源
motor_stop();
// 进入低功耗模式
enter_sleep_mode();
// 点亮欠压指示灯
led_red_on();
} else if (vbat < BATTERY_UNDER_VOLTAGE_THRESHOLD) {
// 提示用户充电
led_red_blink();
}
}
注意:软件欠压检测一定要加迟滞。否则电池电压在阈值附近波动时,电机会频繁启停,用户体验极差。我一般设0.1V的迟滞量。
4.3 过流保护:别让电机把电池抽干
过流保护,主要保护电机驱动电路和电池。牙刷电机堵转时,电流会飙升到正常值的3~5倍。如果不保护,驱动芯片和电池都会遭殃。
你想想看,用户刷牙时用力过猛,牙刷头卡在牙齿缝里,电机转不动,电流瞬间飙到2A。这时候要是没有过流保护,驱动芯片可能直接烧掉。
过流保护的实现方式:
| 方案 | 原理 | 优点 | 缺点 |
|---|---|---|---|
| 采样电阻+比较器 | 在电机回路串一个小电阻,检测其两端电压 | 响应快,成本低 | 有功耗,需要精密电阻 |
| 霍尔电流传感器 | 利用霍尔效应检测电流 | 无损耗,隔离性好 | 成本高,体积大 |
| 驱动芯片自带保护 | 如DRV8837内置过流保护 | 集成度高,设计简单 | 阈值固定,不够灵活 |
我一般用第一种方案,便宜又可靠。采样电阻选0.1Ω,比较器阈值设0.2V,对应2A的过流保护点。
// 过流保护电路参数
// 采样电阻:R_sense = 0.1Ω
// 比较器阈值:V_th = 0.2V
// 过流保护点:I_protect = V_th / R_sense = 2A
// 比较器输出接MCU中断引脚
void EXTI_IRQHandler(void) {
if (over_current_flag) {
// 立即关闭电机
motor_stop();
// 记录故障
fault_log |= FAULT_OVER_CURRENT;
// 蜂鸣器报警
buzzer_on();
// 等待用户松开按键
while (button_read() == PRESSED);
buzzer_off();
}
}
避坑指南:采样电阻的功率要算好。2A电流流过0.1Ω电阻,功耗是0.4W。我建议选1W的电阻,留够余量。曾经有个同事选了0.25W的,结果电阻直接冒烟了。
4.4 温度保护:别让牙刷变成暖手宝
温度保护,主要是防止电池过热和电机过热。锂电池在充电和放电时都会发热,如果散热不好,温度超过60°C就有危险。
我记得有一次做可靠性测试,牙刷连续工作30分钟后,外壳温度到了55°C。虽然没到危险线,但用户拿着肯定不舒服。所以温度保护不仅要考虑安全,还要考虑用户体验。
温度保护的实现:
- NTC热敏电阻:贴在电池表面和电机附近,通过ADC读取温度。
- 温度开关:比如KSD9700,当温度超过设定值时自动断开。
- 软件保护:MCU根据温度值调整电机功率或停止工作。
我常用的NTC是10kΩ的,B值3950。电路很简单:NTC串联一个10kΩ电阻到VCC,中间点接ADC。
// NTC温度读取代码
#define NTC_B_VALUE 3950
#define NTC_R25 10000 // 25°C时电阻10kΩ
#define SERIES_RESISTOR 10000 // 串联电阻10kΩ
float read_temperature(void) {
uint16_t adc_value = read_adc(NTC_ADC_CHANNEL);
float voltage = (float)adc_value / 4096 * 3.3;
float resistance = SERIES_RESISTOR * (3.3 / voltage - 1);
// 用Steinhart-Hart方程计算温度
float steinhart;
steinhart = resistance / NTC_R25; // R/R0
steinhart = log(steinhart); // ln(R/R0)
steinhart /= NTC_B_VALUE; // 1/B * ln(R/R0)
steinhart += 1.0 / (25 + 273.15); // + 1/T0
steinhart = 1.0 / steinhart; // 得到开尔文温度
steinhart -= 273.15; // 转换为摄氏度
return steinhart;
}
// 温度保护逻辑
void temperature_protection(void) {
float temp = read_temperature();
if (temp > 60.0f) {
// 温度过高,停止充电或降低电机功率
motor_set_speed(50); // 降到50%功率
led_red_blink();
}
if (temp > 70.0f) {
// 危险温度,立即停止所有操作
motor_stop();
charger_disable();
buzzer_alarm();
}
}
重要提醒:NTC的安装位置很关键。一定要紧贴热源,用导热硅胶固定。我见过有人把NTC焊在PCB上离电池5cm远的地方,测出来的温度比实际低了10°C,这保护等于没做。
4.5 四种保护的协同工作
好了,四种保护都讲完了。但实际产品中,它们不是各自为战的。我习惯把它们整合成一个统一的保护系统。
举个例子:牙刷正在充电,同时用户在使用。这时候如果电池温度升高,温度保护会先降低充电电流。如果温度继续升高,过流保护会限制电机功率。如果电压异常,过压或欠压保护会切断电源。
我的设计原则是:
- 优先级:温度保护 > 过压保护 > 过流保护 > 欠压保护
- 响应时间:硬件保护(μs级) > 软件保护(ms级)
- 恢复机制:过流和过温保护需要用户手动复位,欠压保护在充电后自动恢复
总结一下:安全保护不是简单的堆砌电路,而是要形成一个完整的保护链。每个保护点都要有明确的阈值、响应时间和恢复策略。我做了这么多年硬件,最大的体会就是:保护电路宁可多做,不能少做。因为一个故障,可能毁掉整个产品的口碑。
嗯,这一章内容不少,但都是干货。下一章咱们聊聊牙刷的无线充电电路设计,那个更有意思。