单片机PWM控制对3.7V锂电池恒流充电问题

xiazai562644322 2020-05-20 03:25:57
最近在做单片机用PWM控制3.7V锂电池充电,充电过程是模拟常规充电芯片的,涓流-恒流-恒压,通过采R16采样电阻反馈电流调整PWM,现在恒流阶段做的电流有抖动,预定600mA,会600±25mA一直抖动,需要电流做稳定点,起码±10mA左右以内,贴上原理图和部分代码,求各位高手解答。
/***************充电恒流控制***************///ValFlgAD_Curt/10000/5*4096
void ChrgCCSet(unsigned int ValueADSet_Curt)
{
// ClrChrgCC();
ValFlgAD_Curt = ValueADSet_Curt;
En.ChrgCurtCtrl = 1;
}
void ClrChrgCC(void)
{
En.ChrgCurtCtrl = 0;
}

void ChrgCCRun(void)
{
if(En.ChrgCurtCtrl)
{
RegVal_ADC_R = AvgVal_ADC(ADCH_CURT_R);
RegVal_ADC_F = AvgVal_ADC(ADCH_CURT_F);
if(RegVal_ADC_R > RegVal_ADC_F)
{
RegADC_ChrgCurt = RegVal_ADC_R-RegVal_ADC_F;//R16两端AD差值
if(RegADC_ChrgCurt>(ValFlgAD_Curt+2))//与目标AD差值比较
{
if((DATA_CHRGPWM>0)&&(LastADC_ChrgCurt<RegADC_ChrgCurt))DATA_CHRGPWM--;
}
else if(RegADC_ChrgCurt<(ValFlgAD_Curt))//与目标AD差值比较
{
if((DATA_CHRGPWM< MAXDATA_CHRGPWM)&&(LastADC_ChrgCurt>RegADC_ChrgCurt))DATA_CHRGPWM++;
}
LastADC_ChrgCurt = RegADC_ChrgCurt;
}
}
}
...全文
3345 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
老皮芽子 2020-05-21
  • 打赏
  • 举报
回复
AD 要加运放,或者将采样电阻加大,最少要到0.5欧姆
xiazai562644322 2020-05-20
  • 打赏
  • 举报
回复
频率8KHZ左右,最大只能到20K,大了试过没什么变化
xiazai562644322 2020-05-20
  • 打赏
  • 举报
回复
感谢分析,加了电感是有好一些,现在正负10mA左右抖动了,单纯占空比+1不会超过5mA,因为重载取的寄存器最大值255,加一理论上增加1/255;没有用运放,是小家电上应用,成本要求高,AD是12位的,手册描述误差最大正负4;AD是有采多次取平均值;
hhhh63 2020-05-20
  • 打赏
  • 举报
回复
1、PWM频率提高一些。
2、测一节普通电池,试试是不是单片机的AD抖动太大,如果是,按楼上所说加一些虑波。
老皮芽子 2020-05-20
  • 打赏
  • 举报
回复
软件硬件都需要下功夫才能提高测量精度。 1.首先 PWM 的颗粒度是否满足设计要求。就是说 DATA_CHRGPWM ++ 输出电流变化不能大于5mA 2.电流测量的精度能否满足设计要求。分流电阻的大小,后面是否接运放?运放的放大系数?AD的量程?AD的精度? 3.在软件上读取的AD值要考虑误差、干扰、要学会用CPU做些均值滤波、中值滤波等,降低噪声干扰测量的精度。 4.在电路上Q1-C2之间应该有个电感吧?否则电流波动比较大。

27,507

社区成员

发帖
与我相关
我的任务
社区描述
硬件/嵌入开发 单片机/工控
社区管理员
  • 单片机/工控社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧