void CHG_Done_Current_Set(void)
{
GPIO_PinModeSet(gpioPortC, CHG_CTRL_PIN, gpioModePushPull, 0);
for(int itemp = 16; itemp > 1; itemp--); //延时5us左右
GPIO_PinModeSet(gpioPortC, CHG_CTRL_PIN, gpioModePushPull, 1);
}
当需要对截止电流做调整,先看下代码和SEPC
代码中设置方式如上,
SPEC对截止电流的设置如下:
要知道截止电流的大小,需要知道Ioreg
Ioreg的设置再看下SPEC。
Ioreg = 100mV/Rsns
要看下Rsns,找下原理图
这是当前B项目的SNS电阻 R505 0.1R_1%,但是问了下BOM中是用的0.13的电阻
那就0.13吧。
所以这个Iorge = 0.100v/0.13Ω = 769mA.
这个电流看起来还是比较大的。
根据当前的代码来看用的是20%Iorge = 0.2 * 769 = 153mA的截止电流
当前要求是设置到300mA ,那么试试看
30%Iorge = 0.3 * 769 = 230.7mA
40%Iorge = 0.4 * 769 = 307.6mA
50%Iorge = 0.5 * 769 = 384.5mA
所以设置40%Iorge比较合适。
当前设置是先将CTRL pin拉低然后延时5us后再拉低
这里先用用示波器验证下,是否因为没有写为volatile导致pin脚低和高之间的延时被“优化”掉了。
先用示波器测下
先用Delay(20ms)测下,果然是20ms。准确
再用默认代码试下这个循环,这里有点问题,因为不是volatile,这个循环我用波形验证了下不起作用
把这个int 类型改为volatile uint32_t 类型,设置为100*1000次循环,用示波器1S去抓取波形,测得
100*1000次循环对应42ms,也就是42*1000us,也就是说1个循环对应0.42us.
默认代码原来是16次循环
则16*0.42us = 6.72us
虽然SPEC中建议高低电平时间设置为2us(1-10us)比较合适,但我还是按照模式的循环做修改
都统一设置为6.72us的延时
/*
* 100 * 1000 -> (shi)42ms --> 42* 1000us
* 1->0.42us
*
*/
/*
* 低6.72us--->高6.72us--->低6.72us--->高6.72us--->低6.72us--->高
* 40%Ioreg
*/
GPIO_PinModeSet(gpioPortC, CHG_CTRL_PIN, gpioModePushPull, 0);
for(volatile uint32_t itemp = 16; itemp > 1; itemp--); //这个无所谓,默认的,是16*0.42 = 6.72us
GPIO_PinModeSet(gpioPortC, CHG_CTRL_PIN, gpioModePushPull, 1);
for(volatile uint32_t itemp = 16; itemp > 1; itemp--); //这个无所谓,默认的,是16*0.42 = 6.72us
GPIO_PinModeSet(gpioPortC, CHG_CTRL_PIN, gpioModePushPull, 0);
for(volatile uint32_t itemp = 16; itemp > 1; itemp--); //这个无所谓,默认的,是16*0.42 = 6.72us
GPIO_PinModeSet(gpioPortC, CHG_CTRL_PIN, gpioModePushPull, 1);
for(volatile uint32_t itemp = 16; itemp > 1; itemp--); //这个无所谓,默认的,是16*0.42 = 6.72us.
GPIO_PinModeSet(gpioPortC, CHG_CTRL_PIN, gpioModePushPull, 0);
for(volatile uint32_t itemp = 16; itemp > 1; itemp--); //这个无所谓,默认的,是16*0.42 = 6.72us
GPIO_PinModeSet(gpioPortC, CHG_CTRL_PIN, gpioModePushPull, 1);
OK,按照SPEC做理论代码书写OK。
可以验证正式的电流了。
1:要验证下正常充电电流是否是769mA.
2: 要验证下截止电流是否是307mA
ps,其实可以先测试下SNS的电阻是不是0.13Ω,哈哈
周一来验证下