做了一个东西,驱动一路电磁阀和一路加热器,电磁阀和加热器都是接到机箱外面,并且经常拆开检修,有可能接错线,或者没接好,或者短路,通过ADC检测电流来判断是否接对线及负载电阻是否正常,短路则用VC比较器中断实现。从CW32F003引脚功能上看,可以非常简单地实现。如图:
从图中可以看出几点:
1.电磁阀及加热器是用MOSFET驱动的,MOSFET栅极驱动电压较高,开通电压一般在4V,5V以上才可以完全开通。CW32F003可以工作在5.5V,所以芯片的电源电压就选了5.5V,用GPIO端口直接驱动MOSFET。
2.ADC输入口和VC的正极恰好有重叠的,检测电流及过流信号可接到同一个引脚上,电路非常简单。
3.取样信号是经过一个电阻接到引脚上的,因为短路时的信号电压会比较高,为保护芯片,此电阻当然是越高越好。但ADC要求输入电阻尽量小一些,所以折中一下选30k。
4.电流取样用0.1R电阻,正常工作时,电磁阀电流100mA,加热器电流500mA,信号电压范围0~50mV,特别是电磁阀的信号电压在0~10mV,可以说非常小。
比较器功能没什么好说的,必须好。用的时候只需简单设置一下:
VC1->DIV = 0x47; // VCC分压0.7V@5.5V
VC1->CR1 = 0x59; // 63uS滤波,上跳中断
VC1->SR = 0x00; // 清中断标志
VC1->CR0 = 0x802F; // VC1使能
VC2->CR1 = 0x59; // 63uS滤波,上跳中断
VC2->SR = 0x00; // 清中断标志
VC2->CR0 = 0x862F; // VC2使能
NVIC->ICPR[0] = 0xC000; // 解除VC1 VC2中断
NVIC->ISER[0] = 0xC000; // 开VC1 VC2中断
问题由3和4引出的,按照一般做法,ADC序列转换可将电磁阀电流和加热器电流变换成数字量:
ADC->SQR = 0x010075; // 序列配置: SV电流、JR电流
ADC->CR0 = 0x1A19; // 单次序列,1.5V基准. 我没有打开BUF,因为在信号很小时BUF有底数,底数更难处理.
// 因为信号太弱了,所以采样时间取最大.
while((ADC->ISR & 0x80)==0); // 等ADC就绪
ADC->START = 0x00; // ------------有过单次转换后再序列转换,必须这样写,序列转换才正常
ADC->START = 0x01; // 启动转换
while(ADC->START & 0x01); // 等完成
njrdl=ADC->RESULT0; // JR电流
nsvdl=ADC->RESULT1; // SV电流
两个电流值经滤波变换成mA数,扩大了10倍,10mV对应100mA。但是观察试验数据,发现在实际电流基本一致的时候,两路的显示数相差较大,有一路低了20左右。后来干脆将两路的取样电压并在一起,理论上应相差很小才对,但仍然是相差很大。
因为30k电阻的影响,显示数比理论数低一些是正常的。但两路输入信号已经是同一个了,显示数应该一致才是啊,折腾了好久也没解决。
在把序列转换改成单次转换时,偶然间把两路转换次序换了一下,突然发现了一个规律,先转换的那一路数要大一些。后又改为序列转换,在序列中改变转换次序,也得到了同样的规律。
这样,解决方案也出来了,轮流在前:这次转换,电磁阀先,加热器后,下次就是加热器先,电磁阀后。这样显示的数基本一致,相差±1。这个结果很好了,原始电压值不到10mV啊。
static u8 nn; // 轮换状态
if(nn)
{
nn=0;
ADC->SQR = 0x010075; // 序列配置: SV电流、JR电流
ADC->CR0 = 0x1A19; // 单次序列,1.5V基准
while((ADC->ISR & 0x80)==0); // 等ADC就绪
ADC->START = 0x00;
ADC->START = 0x01; // 启动转换
while(ADC->START & 0x01); // 等完成
njrdl=ADC->RESULT0; // JR电流
nsvdl=ADC->RESULT1; // SV电流
}
else
{
nn=1;
ADC->SQR = 0x010057; // 序列配置: JR电流、SV电流
ADC->CR0 = 0x1A19; // 单次序列,1.5V基准
while((ADC->ISR & 0x80)==0); // 等ADC就绪
ADC->START = 0x00;
ADC->START = 0x01; // 启动转换
while(ADC->START & 0x01); // 等完成
nsvdl=ADC->RESULT0; // SV电流
njrdl=ADC->RESULT1; // JR电流
}
大家如果也遇到这个问题, 可以试一试, 看是否有普遍性. 另有几路电压检测是电压≥0.3V,和万用表测的结果基本相符,也没再细究。
|