第一次拿到SC8721这颗电源管理芯片时,我对着数据手册发了半小时呆——密密麻麻的寄存器说明、复杂的电压计算公式、还有那些看起来就头疼的时序图。但实际用起来你会发现,这颗芯片的设计其实非常工程师友好。它内置了MOS管,外围电路只需要几个基础元件就能工作,支持2.7V到22V的宽电压输入输出范围,最棒的是可以通过I²C接口精准控制输出电压。
我建议你先准备这些材料:
硬件连接简单到令人感动,只需要连接4根线:
CSO引脚是我踩过最多坑的地方。这个引脚看起来只是个普通的ADC输入,用来检测输出电流大小,但实际使用时有两个致命细节:
第一,CSO的电压范围是0-1.2V,超过这个范围轻则读数不准,重则损坏芯片。我在第一次测试时没注意,直接接了5V的ADC参考电压,结果芯片当场冒烟。正确的做法是:
第二,CSO对走线特别敏感。有次我的PCB布局把CSO走线放在了开关电源路径旁边,导致检测值总是跳动。后来重画板子,给CSO单独走了屏蔽线才解决。
SC8721虽然内置了MOS管,但输入输出电容的选择直接影响稳定性。经过多次测试,我发现这些组合效果最好:
| 参数 | 推荐值 | 注意事项 |
|---|---|---|
| 输入电容 | 22μF陶瓷+100μF电解 | 靠近芯片引脚放置 |
| 输出电容 | 47μF陶瓷+220μF电解 | ESR要低于100mΩ |
| 布线要求 | 星型接地 | 功率地和信号地单点连接 |
特别提醒:当输出电压超过15V时,务必检查所有电容的耐压值。我有次用了16V耐压的电容在20V输出场景,半小时后电容就鼓包了。
SC8721的I²C设备地址固定为0x62(7位地址),换算成8位写地址是0xC4,读地址是0xC5。这里有个容易混淆的点:有些I²C库函数要求7位地址,有些要8位地址,用错会导致通信失败。
我封装的基础读写函数长这样:
c复制uint8_t SC8721_ReadReg(uint8_t reg)
{
uint8_t rx_data;
HAL_I2C_Mem_Read(&hi2c1, 0xC4, reg, I2C_MEMADD_SIZE_8BIT, &rx_data, 1, 100);
return rx_data;
}
void SC8721_WriteReg(uint8_t reg, uint8_t value)
{
HAL_I2C_Mem_Write(&hi2c1, 0xC4, reg, I2C_MEMADD_SIZE_8BIT, &value, 1, 100);
}
设置输出电压是核心功能,但手册里的公式看得人头晕。经过反复实验,我总结出这个更易懂的计算方法:
对应的代码实现:
c复制void SC8721_SetVoltage(uint16_t mV)
{
uint16_t steps = 0;
uint8_t fb_dir = 0;
if(mV >= 5000) {
steps = (mV - 5000) / 20;
fb_dir = 0;
} else {
steps = (5000 - mV) / 20;
fb_dir = 1;
}
SC8721_WriteReg(0x03, steps >> 2); // MSB
SC8721_WriteReg(0x04, (steps & 0x03) | (fb_dir ? 0x1C : 0x18)); // LSB
}
遇到输出电压不对时,建议按这个顺序检查:
常见错误码解析:
很多同学反映高电压输出时芯片容易烧,我通过大量实验发现两个主要原因:
有个很隐蔽的坑:当从高电压快速切换到低电压时,如果负载电容过大,反向电流可能损坏芯片。解决方法是在输出端加个肖特基二极管防止倒灌。
如果需要频繁调整电压,要注意这些时序:
我常用的平滑调压函数:
c复制void SC8721_RampVoltage(uint16_t start_mV, uint16_t end_mV, uint16_t step_mV)
{
uint16_t current = start_mV;
while(current != end_mV) {
SC8721_SetVoltage(current);
HAL_Delay(10);
if(end_mV > start_mV) {
current = (current + step_mV) < end_mV ? (current + step_mV) : end_mV;
} else {
current = (current - step_mV) > end_mV ? (current - step_mV) : end_mV;
}
}
}
CSO的检测精度受PCB布局影响很大,建议上电后先做零点校准:
实测电流计算公式:
code复制实际电流(mA) = (CSO读数 - 零点偏移) × 1200 / (R_sense × 增益)
其中R_sense是检测电阻,增益在寄存器0x01中设置