AC7811使用ADC门限功能实现主电检测
本帖最后由 JasonLee27 于 2020-3-4 15:13 编辑软件环境: keil 5.23 SecureCRT
硬件环境: AC7811通用开发板 ATC-LINK
汽车上的电子产品采用汽车蓄电池供电,一般要求的正常工作电压范围是9~16V,过低,过高都需要记录故障。
对于这个功能,我们都会使用ADC来采集计算主电电压值。但如果一直采用软件的方式去判断是否过压欠压,未免太浪费CPU,所以ADC都会提供一个门限功能(AC7811叫模拟看门狗)。
工程师可以设置触发中断的上下限,在采样值未超出门限时,不会有中断,一旦超出后,就会产生ADC中断,这个时候在处理异常,就可以节省很多CPU资源。
我们可以看下7811的模拟看门狗配置说明
这里我使用mode5(连续扫描模式),模拟看门狗选择单规则组通道。
通用开发板上刚好有个ADC_IN1的模拟按键,可以产生不同的AD值,便于我测试
在代码中定义上下门限,以及超出门限后的恢复门限,这里异常门限和恢复门限值不同,是为了防止电压刚好在门限上下范围浮动,造成一直触发中断的问题。
#define AMOHighValue (3000)
#define AMOLowValue (1000)
#define AMOLowRecoverValue(1100)
#define AMOHighRecoverValue (2900)然后是adc中断程序,根据采样值判断当前状态(AC7811并不能直接告诉你是超出上门限还是下门限,so,自己判断吧。根据当前状态重新设置门限,这是因为当采样值超出门限后,是会一直产生中断的,所以,要么产生中断后,关闭中断,要么重新设置门限将当前采样值包含进去,否则会一直产生中断,导致其他程序无法运行(话说我最开始还吐槽过这个设定,觉得这么搞怎么用,后来看了下瑞萨和NXP的,发现貌似别人也差不多。)
void ADC_Callback(void)
{
if (ADC_GetIntFlag(ADC, ADC_FLAG_AMO))///<发生模拟看门狗事件
{
if (s_sampleValue > AMOHighValue) ///<超出上限
{
ADC_SetAnalogWatchDogThreshold(ADC, 4095, AMOHighRecoverValue); ///<设置恢复门限
printf("\r\n too High %d ", s_sampleValue);
}
else if (s_sampleValue < AMOLowValue) ///<低于下限
{
ADC_SetAnalogWatchDogThreshold(ADC, AMOLowRecoverValue, 0); ///<设置恢复门限
printf("\r\n too Low %d ", s_sampleValue);
}
else if ((s_sampleValue > AMOLowRecoverValue) || (s_sampleValue < AMOHighRecoverValue)) ///<进入正常值
{
ADC_SetAnalogWatchDogThreshold(ADC, AMOHighValue, AMOLowValue); ///<重设异常门限
printf("\r\n Recover %d ", s_sampleValue);
}
else
{
///<should not be here
printf("\r\n error %d", s_sampleValue);
}
}
ADC_ClearFlag(ADC, ADC_FLAG_AMO | ADC_FLAG_EOC | ADC_FLAG_IEOC); ///<直接清除所有标志,
}下面是我测试的打印内容
This is adc_sample1 demo
too High 4095
Recover 2088
too High 4095
Recover 2090
too High 4095
Recover 2108
too High 4095
too Low 928
too High 4092
too Low 893
too High 4095
Recover 2101
too High 3164
Recover 2111
too High 4043
最后的最后,附上完整的工程(代码有点乱,大家凑合着看)
**** Hidden Message *****
非常棒,如果IO不够,有富余的ADC,绝对可以。 操作非常棒。 非常棒的操作 感谢分享
理论上讲,这样是没有问题的,但是实际使用过程中,不一定好用,需要把瞬间的故障工况找出来,比如,某某电机工作了,启动瞬间;套一句老外文献上的话,汽车电源总线是非常肮脏的, jazzyfox 发表于 2020-4-2 09:44
理论上讲,这样是没有问题的,但是实际使用过程中,不一定好用,需要把瞬间的故障工况找出来,比如,某某电 ...
这个就是整车厂考虑的问题了,对零部件厂商来说,只需要记录电源故障即可。 JasonLee27 发表于 2020-4-3 11:34
这个就是整车厂考虑的问题了,对零部件厂商来说,只需要记录电源故障即可。 ...
单纯的记录电源故障,有什么特殊的意义吗?还是这个用途是为应用而拓展? jazzyfox 发表于 2020-4-3 11:36
单纯的记录电源故障,有什么特殊的意义吗?还是这个用途是为应用而拓展? ...
诊断里面有做电源过压和欠压故障记录,一版低于9V和高于16V都属于故障,但这个情况下ECU并非一定就工作异常了。
有时候汽车在行驶过程中出现问题,4S店或原厂需要排查问题的时候就可以通过读取诊断故障码查看历史故障,进而判断故障原因。这个不局限于欠压或者过压。
二来,这个功能并不单纯只是检测电源故障问题,像TBOX是带备用电池的,在整车电源过低或者发生意外碰撞之类导致电源断开的情况下,需要TBOX能够立即切换为备用电池供电,这个功能虽然采用硬比较器也可以实现,但如果MCU内部就可以实现这个功能,那就省去了一个外围器件。 谢谢分享. 学习。。。。。。 xuexixuexi 学习学习..附件无法下载 借鉴学习 附件无法下载,楼主能不能重新上传分享一下,谢谢 这种操作太厉害了,不错的选择,很赞的。 还能这么操作,不错,不错的。 我感觉这么操作,真的不错,哈哈!
借鉴学习 赞,多发点这种应用{:lol:}
页:
[1]
2