sonnybirdyaya 发表于 2015-3-9 13:47:45

请教:STC15W204S的比较器使用问题

本帖最后由 sonnybirdyaya 于 2015-3-9 13:47 编辑

原理图RT

思路为:
Key1,2导通后单片机得5V电,
P3.3控制水泵的开关,当水泵正常抽水时,电流约400MA,水泵空转时。电流约100MA;
使用采样电阻R6,2.2欧姆,这样对应的正常CMP-脚电压为0.4*2.2=0.88V 空转电压为0.1*2.2=0.22V
与CMP+脚的R2,R7分压后的电压约0.47V比较;
单片机上电后,水泵开始工作,延时10S判断是否正常抽水,当水泵正常抽水时,维持水泵运行,当水泵空转时,切断水泵并点亮LED报警。

问题:
1.由于产品厚度限制,没办法在78L05两端使用大电容滤波,目前来看没有太大的干扰问题;这种方案是否存在问题?如有,有什么方法能减少这种问题;
2.实际测试发现,系统开始抽水1-3分钟(每次不同)以后,会自动切断水泵工作,并点亮报警LED灯;
我用万用表测量了采样电阻R6(2W 2512的贴片)的电压,发现切断前CMP- 点电压没有明显的变化;R6上的温度尚可,手可以摸上去;
想请教下发生这个现象可能的原因是什么?


程序如下


    sbit LED_Low = P3^2 ;//定义LED
    sbit Pump=P3^3;//泵端口定义
    char CmpTemp1;//比较器结果临时变量1
    char CmpTemp2;//比较器结果临时变量2
    char Cmp;//比较器结果,水泵空转时,Cmp==1;


//比较器寄存器设置
sfr CMPCR1 = 0xE6;
sfr CMPCR2 = 0xE7;
   
//CMPCR1
#define        CMPEN        0x80        //1: 允许比较器, 0: 禁止,关闭比较器电源
#define        CMPIF        0x40        //比较器中断标志, 包括上升沿或下降沿中断, 软件清0
#define        PIE                0x20        //1: 比较结果由0变1, 产生上升沿中断
#define        NIE                0x10        //1: 比较结果由1变0, 产生下降沿中断
#define        PIS                0x08        //输入正极性选择, 0: 选择内部P5.5做正输入,         1: 由ADCIS所选择的ADC输入端做正输入.
#define        NIS                0x04        //输入负极性选择, 0: 选择内部BandGap电压BGv做负输入, 1: 选择外部P5.4做输入.
#define        CMPOE        0x02        //1: 允许比较结果输出到P1.2, 0: 禁止.
#define        CMPRES        0x01        //比较结果, 1: CMP+电平高于CMP-,0: CMP+电平低于CMP-,只读

//CMPCR2
#define        INVCMPO        0x80        //1: 比较器输出取反,0: 不取反
#define        DISFLT        0x40        //1: 关闭0.1uF滤波,   0: 允许
#define        LCDTY        0x00        //0~63, 比较结果变化延时周期数



void Delay1s(){....}               


main()
{
       
        //初始化
       CMPCR1 = 0;
       CMPCR2 = 0x1f;//比较器不取反,允许0.1uf滤波,比较结果变化延时1f周期数

         CMPCR1 &=~PIE;//比较结果由0变1, 产生上升沿中断 0: 禁止
       CMPCR1 &=~NIE;//比较结果由0变1, 产生下降沿中断 0: 禁止
       CMPCR1 &=~PIS;// 输入正极性选择, 0: 选择内部P5.5做正输入
       CMPCR1 |=NIS;//输入负极性选择, 1: 选择外部P5.4做输入.
       CMPCR1 &=~CMPOE;//允许比较结果输出到P1.2, 0: 禁止
       CMPCR1 |= CMPEN;        //允许比较器                ENABLE,DISABLE


        P3M1 = 0x00;//P3.3 P3.2 推挽模式
      P3M0 = 0x0c;


        LED_Low = 0 ;//空转指示灯灭
        Pump = 1;//泵开始工作
        Cmp = 0; //水泵非空转标志


        Delay1s();
        Delay1s();
        Delay1s();
        Delay1s();
        Delay1s();
        Delay1s();
        Delay1s();
        Delay1s();
        Delay1s();
        Delay1s();//延时10S后 开始判断是否空转

        while(1)
        {
       CmpTemp1 = CMPCR1&CMPRES;
       Delay1s();
       Delay1s();
       Delay1s();
       CmpTemp2 = CMPCR1&CMPRES;       
       if(CmpTemp1 == CmpTemp2) Cmp = CmpTemp2;
       if(Cmp == 1) {Pump = 0; LED_Low = 1 ;}// 水泵空转 停泵 缺水灯亮
       Delay1s();
       Delay1s();
       Delay1s();
        }       
}

sonnybirdyaya 发表于 2015-3-9 13:59:37

补充一下STC15W204S的比较器说明

小李非刀 发表于 2015-3-9 14:18:44

1、不能一个电容都没有,MCU是一个高速数字系统,至少要接0.1uF和10uF。78L05前面接0.1uF或以上电容。
2、比较结果进行软件滤波,不要一读到到马上执行,由马达的地方干扰大,采样到CMP-最好用RC滤波一下。

sonnybirdyaya 发表于 2015-3-9 14:26:41

小李非刀 发表于 2015-3-9 14:18
1、不能一个电容都没有,MCU是一个高速数字系统,至少要接0.1uF和10uF。78L05前面接0.1uF或以上电容。
2、 ...

多谢指教
1、不能一个电容都没有,MCU是一个高速数字系统,至少要接0.1uF和10uF。78L05前面接0.1uF或以上电容。---我尝试了一下 ,在78L05前面接了一个0.1uf的贴片,7805后面接了一个100uf的电解,情况照旧;
2、比较结果进行软件滤波,不要一读到到马上执行---这个可以看程序,已经有一个3S的软件滤波,比较两次的结果是否一致,一致后才作动         ,由马达的地方干扰大,采样到CMP-最好用RC滤波一下。--------这个RC的话,能不能推荐一下参数,我之前的想法是,既然有软件滤波了 硬件的滤波是不是有必要,或者可能是电机干扰了MCU的运行?

小李非刀 发表于 2015-3-9 14:34:30

MCU一定要接0.1uF电容,高频退偶的。
RC,一般就是1K 0.1uF就OK。

sonnybirdyaya 发表于 2015-3-9 14:41:47

小李非刀 发表于 2015-3-9 14:34
MCU一定要接0.1uF电容,高频退偶的。
RC,一般就是1K 0.1uF就OK。

收到 ,稍后测试汇报

cqfeiyu 发表于 2015-3-9 15:12:20

也太省了吧,耐压5V以上的贴片电容又不贵
页: [1]
查看完整版本: 请教:STC15W204S的比较器使用问题