打印
[技术问答]

N76E003 ADC采集比较电路,耗电量大,请佬指点优化下

[复制链接]
1566|17
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
盾视工作室|  楼主 | 2020-6-15 19:21 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
下面这代码帮忙优化指点下?是否可以休眠,休眠后P04能输入触发ADC解除休眠状态




#include "N76E003.h"
#include "Common.h"
#include "Delay.h"
#include "SFR_Macro.h"
#include "Function_define.h"

unsigned  char xdata ADCdataH[10], ADCdataL[10];
unsigned int ADP03,ADP04,ADP07,ADP17;
unsigned int tempH,tempL,tempHLD,tempHLI;

/******************************************************************************


DS功能:


P17=2.5V电压
开机检测一次P07电压,不循环。当P07<P17时,P13为高电平,当P07>P17时,P13为低电平。

检测P03电压,并保存不变的固定电压值假设为a。

下面为循环到关机为止。
检测P04电压,
当P04>P03时,P06和P14输出高电平。
当P04<P03时,(P06和P14输出低电平,也可以不管,因为上面默认=0)

P0.6/P1.3/P0.0/P1.6输出高电平
P0.3/P0.4/P0.7/P17  ADC检测功能
******************************************************************************/
void main (void)
{
        unsigned char i;

        P06_Quasi_Mode;
        P13_Quasi_Mode;
        P14_Quasi_Mode;
        P06=1;
        P14=0;
        P13=0;

        //Timer1_Delay10ms(100);
        Timer1_Delay10ms(100);//延时2s
        /*----电源欠压采样----P07------*/
  P06=0;
         
        ADP17 =0x07FF;
                for(i=0;i<10;i++)
                {
                        Enable_ADC_AIN2;                                                                                                                        // P07
                        set_ADCS;                                                                                                                                                       
                        while(ADCF == 0);//等待采样完毕
                        ADCdataH[i] = ADCRH;
                        ADCdataL[i] = ADCRL;
                }
                tempH =(ADCdataH[6]+ADCdataH[7]+ADCdataH[8]+ADCdataH[9]+ADCdataH[5])/5;
                tempL =(ADCdataL[5]+ADCdataL[6]+ADCdataL[7]+ADCdataL[8]+ADCdataL[9])/5;
                ADP07 =((unsigned int)tempH<<4) + tempL;
                if(ADP07<=(ADP17+5))
                {
                        P13=1;
                }
                else if(ADP07>ADP17)
                {
                        P13=0;
                }
                Timer1_Delay10ms(10);
                       

        /*----电压采样----P03------*/
        for(i=0;i<10;i++)
        {
                Enable_ADC_AIN6;                                                                                                                        // P03
                set_ADCS;                                                                                                                                                       
                while(ADCF == 0);//等待采样完毕
                ADCdataH[i] = ADCRH;
          ADCdataL[i] = ADCRL;
        }
        tempH =(ADCdataH[6]+ADCdataH[7]+ADCdataH[8]+ADCdataH[9]+ADCdataH[5])/5;
        tempL =(ADCdataL[5]+ADCdataL[6]+ADCdataL[7]+ADCdataL[8]+ADCdataL[9])/5;
        ADP03 =((unsigned int)tempH<<4) + tempL;
       
        while(1)
        {
                /*----电压采样----P04------*/
                for(i=0;i<10;i++)
                {
                        Enable_ADC_AIN5;                                                                                                                        // P04
                        set_ADCS;                                                                                                                                                       
                        while(ADCF == 0);//等待采样完毕
                        ADCdataH[i] = ADCRH;
                        ADCdataL[i] = ADCRL;
                }
                tempH =(ADCdataH[6]+ADCdataH[7]+ADCdataH[8]+ADCdataH[9]+ADCdataH[5])/5;
                tempL =(ADCdataL[5]+ADCdataL[6]+ADCdataL[7]+ADCdataL[8]+ADCdataL[9])/5;
                ADP04 =((unsigned int)tempH<<4) + tempL;
//                ADP03=256;
//                ADP04=265;
                if(ADP04>(ADP03+20))   //100=0.1V
                {
                        P06=1;
                        P14=1;
                }
                else if(ADP04<=ADP03)
                {
                        P14=0;
                        P06=0;
                }
                Timer1_Delay10ms(10);
                nop;
        }                       
}

使用特权

评论回复
沙发
xinxianshi| | 2020-6-15 19:48 | 只看该作者
唤醒的方式是中断啊,ADC有中断没

使用特权

评论回复
板凳
盾视工作室|  楼主 | 2020-6-15 20:16 | 只看该作者
xinxianshi 发表于 2020-6-15 19:48
唤醒的方式是中断啊,ADC有中断没

有的,如果能在P04检测多久时或多少次时P04一直小于P03就可以休眠,当P04大于P03时唤醒功能,不知道能达到 这功能不。P04电压值会在0.1-1V之间

使用特权

评论回复
地板
xinxianshi| | 2020-6-15 20:28 | 只看该作者
盾视工作室 发表于 2020-6-15 20:16
有的,如果能在P04检测多久时或多少次时P04一直小于P03就可以休眠,当P04大于P03时唤醒功能,不知道能达 ...

你要看你这种条件有没有触发中断的事件,只要有合适的中断事件发生就可以唤醒。

使用特权

评论回复
5
huangcunxiake| | 2020-6-16 08:51 | 只看该作者
低功耗精髓是大部分时间在休眠呢。

使用特权

评论回复
6
盾视工作室|  楼主 | 2020-6-16 17:36 | 只看该作者
unsigned  char xdata ADCdataH[10], ADCdataL[10];
unsigned int ADP03,ADP04,ADP07,ADP17;
unsigned int tempH,tempL,tempHLD,tempHLI;

/******************************************************************************


DS功能:


P17=2.5V电压
开机检测一次P07电压,不循环。当P07<P17时,P13为高电平,当P07>P17时,P13为低电平。

检测P03电压,并保存不变的固定电压值假设为a。

下面为循环到关机为止。
检测P04电压,
当P04>P03时,P06和P13输出高电平。
当P04<P03时,(P06和P13输出低电平,也可以不管,因为上面默认=0)

P0.6/P1.3/P0.0/P1.6输出高电平
P0.3/P0.4/P0.7/P17  ADC检测功能
******************************************************************************/
void main (void)
{
        unsigned char i;

        P06_Quasi_Mode;
        P13_Quasi_Mode;
        P14_Quasi_Mode;
        P06=1;
        P14=0;
        P13=0;

        //Timer1_Delay10ms(100);
        Timer1_Delay10ms(100);//延时2s
        /*----电源欠压采样----P07------*/
  P06=0;
         
        ADP17 =0x07FF;
                for(i=0;i<10;i++)
                {
                        Enable_ADC_AIN2;                                                                                                                        // P07
                        set_ADCS;                                                                                                                                                       
                        while(ADCF == 0);//等待采样完毕
                        ADCdataH[i] = ADCRH;
                        ADCdataL[i] = ADCRL;
                }
                tempH =(ADCdataH[6]+ADCdataH[7]+ADCdataH[8]+ADCdataH[9]+ADCdataH[5])/5;
                tempL =(ADCdataL[5]+ADCdataL[6]+ADCdataL[7]+ADCdataL[8]+ADCdataL[9])/5;
                ADP07 =((unsigned int)tempH<<4) + tempL;
                if(ADP07<=(ADP17+5))
                {
                        P13=1;
                }
                else if(ADP07>ADP17)
                {
                        P13=0;
                }
                Timer1_Delay10ms(10);
                clr_ADCF;     //这里关闭ADC达到省电       

        /*----电压采样----P03------*/
        for(i=0;i<10;i++)
        {
                Enable_ADC_AIN6;                                                                                                                        // P03
                set_ADCS;                                                                                                                                                       
                while(ADCF == 0);//等待采样完毕
                ADCdataH[i] = ADCRH;
          ADCdataL[i] = ADCRL;
        }
        tempH =(ADCdataH[6]+ADCdataH[7]+ADCdataH[8]+ADCdataH[9]+ADCdataH[5])/5;
        tempL =(ADCdataL[5]+ADCdataL[6]+ADCdataL[7]+ADCdataL[8]+ADCdataL[9])/5;
        ADP03 =((unsigned int)tempH<<4) + tempL;
        clr_ADCF;     //这里关闭ADC达到省电看下入这位置对吗
        while(1)
        {
                /*----电压采样----P04------*/
                for(i=0;i<10;i++)
                {
                        Enable_ADC_AIN5;                                                                                                                        // P04
                        set_ADCS;                                                                                                                                                       
                        while(ADCF == 0);//等待采样完毕
                        ADCdataH[i] = ADCRH;
                        ADCdataL[i] = ADCRL;
                }
                tempH =(ADCdataH[6]+ADCdataH[7]+ADCdataH[8]+ADCdataH[9]+ADCdataH[5])/5;
                tempL =(ADCdataL[5]+ADCdataL[6]+ADCdataL[7]+ADCdataL[8]+ADCdataL[9])/5;
                ADP04 =((unsigned int)tempH<<4) + tempL;
//                ADP03=256;
//                ADP04=265;
                if(ADP04>(ADP03+20))   //100=0.1V
                {
                        P06=1;
                        P14=1;
                }
                else if(ADP04<=ADP03)
                {
                        P14=0;
                        P06=0;
                }
               
                Timer1_Delay10ms(10);

                nop;
                //循环1分钟后当(ADP04<=ADP03)进入掉电模式休眠省电,电压在2V以下
                //当(ADP04>ADP03)电压在4-5V 外部中断唤醒休眠
               
               
        }                       
}
这样能实现吗?关闭ADC放这位置是正确的不?菜鸟一个多多指教

使用特权

评论回复
7
zhuomuniao110| | 2020-6-16 17:53 | 只看该作者
看效果啊。
能否实现,烧录进去不就知道了。

使用特权

评论回复
8
huahuagg| | 2020-6-17 22:12 | 只看该作者
楼主跑一下试试不就知道了。

使用特权

评论回复
9
gwsan| | 2020-7-6 17:12 | 只看该作者
现在耗电量是多少

使用特权

评论回复
10
kxsi| | 2020-7-6 17:13 | 只看该作者
用哪种休眠模式呢

使用特权

评论回复
11
nawu| | 2020-7-6 17:13 | 只看该作者
当然可以了

使用特权

评论回复
12
qcliu| | 2020-7-6 17:14 | 只看该作者
最低电压需要多少

使用特权

评论回复
13
tfqi| | 2020-7-6 17:14 | 只看该作者
楼主问题解决了吗

使用特权

评论回复
评论
盾视工作室 2020-7-15 20:58 回复TA
没有呢,等高人指点 
14
盾视工作室|  楼主 | 2020-7-15 20:58 | 只看该作者
tfqi 发表于 2020-7-6 17:14
楼主问题解决了吗

没解决,就这程序,只给芯片供电没带负载都是7mA.

使用特权

评论回复
15
盾视工作室|  楼主 | 2020-7-15 20:59 | 只看该作者
qcliu 发表于 2020-7-6 17:14
最低电压需要多少

最低电压2.4-5.5V

使用特权

评论回复
16
wanduzi| | 2020-7-15 22:01 | 只看该作者
实现了没

使用特权

评论回复
17
qiangtech| | 2020-7-16 11:22 | 只看该作者
如果是想达到降低功耗,就要让MCU多进入掉电模式。如果楼主的ADC输入信号保持时间比较长,可以考虑使用WKT自唤醒定时器。用定时器定时唤醒MCU进行ADC检测,完成功能。如果ADC输入的信号时间很短,可以考虑用一个比较器或者复位IC之类的形成一个电平边沿就可以唤醒MCU完成功能。

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

7

主题

50

帖子

0

粉丝