[技术问答] N76E003 ADC采集比较电路,耗电量大,请佬指点优化下

[复制链接]
2027|17
 楼主| 盾视工作室 发表于 2020-6-15 19:21 | 显示全部楼层 |阅读模式
下面这代码帮忙优化指点下?是否可以休眠,休眠后P04能输入触发ADC解除休眠状态




  1. #include "N76E003.h"
  2. #include "Common.h"
  3. #include "Delay.h"
  4. #include "SFR_Macro.h"
  5. #include "Function_define.h"

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

  9. /******************************************************************************


  10. DS功能:


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

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

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

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

  24.         P06_Quasi_Mode;
  25.         P13_Quasi_Mode;
  26.         P14_Quasi_Mode;
  27.         P06=1;
  28.         P14=0;
  29.         P13=0;

  30.         //Timer1_Delay10ms(100);
  31.         Timer1_Delay10ms(100);//延时2s
  32.         /*----电源欠压采样----P07------*/
  33.   P06=0;
  34.          
  35.         ADP17 =0x07FF;
  36.                 for(i=0;i<10;i++)
  37.                 {
  38.                         Enable_ADC_AIN2;                                                                                                                        // P07
  39.                         set_ADCS;                                                                                                                                                       
  40.                         while(ADCF == 0);//等待采样完毕
  41.                         ADCdataH[i] = ADCRH;
  42.                         ADCdataL[i] = ADCRL;
  43.                 }
  44.                 tempH =(ADCdataH[6]+ADCdataH[7]+ADCdataH[8]+ADCdataH[9]+ADCdataH[5])/5;
  45.                 tempL =(ADCdataL[5]+ADCdataL[6]+ADCdataL[7]+ADCdataL[8]+ADCdataL[9])/5;
  46.                 ADP07 =((unsigned int)tempH<<4) + tempL;
  47.                 if(ADP07<=(ADP17+5))
  48.                 {
  49.                         P13=1;
  50.                 }
  51.                 else if(ADP07>ADP17)
  52.                 {
  53.                         P13=0;
  54.                 }
  55.                 Timer1_Delay10ms(10);
  56.                        

  57.         /*----电压采样----P03------*/
  58.         for(i=0;i<10;i++)
  59.         {
  60.                 Enable_ADC_AIN6;                                                                                                                        // P03
  61.                 set_ADCS;                                                                                                                                                       
  62.                 while(ADCF == 0);//等待采样完毕
  63.                 ADCdataH[i] = ADCRH;
  64.           ADCdataL[i] = ADCRL;
  65.         }
  66.         tempH =(ADCdataH[6]+ADCdataH[7]+ADCdataH[8]+ADCdataH[9]+ADCdataH[5])/5;
  67.         tempL =(ADCdataL[5]+ADCdataL[6]+ADCdataL[7]+ADCdataL[8]+ADCdataL[9])/5;
  68.         ADP03 =((unsigned int)tempH<<4) + tempL;
  69.        
  70.         while(1)
  71.         {
  72.                 /*----电压采样----P04------*/
  73.                 for(i=0;i<10;i++)
  74.                 {
  75.                         Enable_ADC_AIN5;                                                                                                                        // P04
  76.                         set_ADCS;                                                                                                                                                       
  77.                         while(ADCF == 0);//等待采样完毕
  78.                         ADCdataH[i] = ADCRH;
  79.                         ADCdataL[i] = ADCRL;
  80.                 }
  81.                 tempH =(ADCdataH[6]+ADCdataH[7]+ADCdataH[8]+ADCdataH[9]+ADCdataH[5])/5;
  82.                 tempL =(ADCdataL[5]+ADCdataL[6]+ADCdataL[7]+ADCdataL[8]+ADCdataL[9])/5;
  83.                 ADP04 =((unsigned int)tempH<<4) + tempL;
  84. //                ADP03=256;
  85. //                ADP04=265;
  86.                 if(ADP04>(ADP03+20))   //100=0.1V
  87.                 {
  88.                         P06=1;
  89.                         P14=1;
  90.                 }
  91.                 else if(ADP04<=ADP03)
  92.                 {
  93.                         P14=0;
  94.                         P06=0;
  95.                 }
  96.                 Timer1_Delay10ms(10);
  97.                 nop;
  98.         }                       
  99. }
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时唤醒功能,不知道能达 ...

你要看你这种条件有没有触发中断的事件,只要有合适的中断事件发生就可以唤醒。
huangcunxiake 发表于 2020-6-16 08:51 | 显示全部楼层
低功耗精髓是大部分时间在休眠呢。
 楼主| 盾视工作室 发表于 2020-6-16 17:36 | 显示全部楼层
  1. unsigned  char xdata ADCdataH[10], ADCdataL[10];
  2. unsigned int ADP03,ADP04,ADP07,ADP17;
  3. unsigned int tempH,tempL,tempHLD,tempHLI;

  4. /******************************************************************************


  5. DS功能:


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

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

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

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

  19.         P06_Quasi_Mode;
  20.         P13_Quasi_Mode;
  21.         P14_Quasi_Mode;
  22.         P06=1;
  23.         P14=0;
  24.         P13=0;

  25.         //Timer1_Delay10ms(100);
  26.         Timer1_Delay10ms(100);//延时2s
  27.         /*----电源欠压采样----P07------*/
  28.   P06=0;
  29.          
  30.         ADP17 =0x07FF;
  31.                 for(i=0;i<10;i++)
  32.                 {
  33.                         Enable_ADC_AIN2;                                                                                                                        // P07
  34.                         set_ADCS;                                                                                                                                                       
  35.                         while(ADCF == 0);//等待采样完毕
  36.                         ADCdataH[i] = ADCRH;
  37.                         ADCdataL[i] = ADCRL;
  38.                 }
  39.                 tempH =(ADCdataH[6]+ADCdataH[7]+ADCdataH[8]+ADCdataH[9]+ADCdataH[5])/5;
  40.                 tempL =(ADCdataL[5]+ADCdataL[6]+ADCdataL[7]+ADCdataL[8]+ADCdataL[9])/5;
  41.                 ADP07 =((unsigned int)tempH<<4) + tempL;
  42.                 if(ADP07<=(ADP17+5))
  43.                 {
  44.                         P13=1;
  45.                 }
  46.                 else if(ADP07>ADP17)
  47.                 {
  48.                         P13=0;
  49.                 }
  50.                 Timer1_Delay10ms(10);
  51.                 clr_ADCF;     //这里关闭ADC达到省电       

  52.         /*----电压采样----P03------*/
  53.         for(i=0;i<10;i++)
  54.         {
  55.                 Enable_ADC_AIN6;                                                                                                                        // P03
  56.                 set_ADCS;                                                                                                                                                       
  57.                 while(ADCF == 0);//等待采样完毕
  58.                 ADCdataH[i] = ADCRH;
  59.           ADCdataL[i] = ADCRL;
  60.         }
  61.         tempH =(ADCdataH[6]+ADCdataH[7]+ADCdataH[8]+ADCdataH[9]+ADCdataH[5])/5;
  62.         tempL =(ADCdataL[5]+ADCdataL[6]+ADCdataL[7]+ADCdataL[8]+ADCdataL[9])/5;
  63.         ADP03 =((unsigned int)tempH<<4) + tempL;
  64.         clr_ADCF;     //这里关闭ADC达到省电看下入这位置对吗
  65.         while(1)
  66.         {
  67.                 /*----电压采样----P04------*/
  68.                 for(i=0;i<10;i++)
  69.                 {
  70.                         Enable_ADC_AIN5;                                                                                                                        // P04
  71.                         set_ADCS;                                                                                                                                                       
  72.                         while(ADCF == 0);//等待采样完毕
  73.                         ADCdataH[i] = ADCRH;
  74.                         ADCdataL[i] = ADCRL;
  75.                 }
  76.                 tempH =(ADCdataH[6]+ADCdataH[7]+ADCdataH[8]+ADCdataH[9]+ADCdataH[5])/5;
  77.                 tempL =(ADCdataL[5]+ADCdataL[6]+ADCdataL[7]+ADCdataL[8]+ADCdataL[9])/5;
  78.                 ADP04 =((unsigned int)tempH<<4) + tempL;
  79. //                ADP03=256;
  80. //                ADP04=265;
  81.                 if(ADP04>(ADP03+20))   //100=0.1V
  82.                 {
  83.                         P06=1;
  84.                         P14=1;
  85.                 }
  86.                 else if(ADP04<=ADP03)
  87.                 {
  88.                         P14=0;
  89.                         P06=0;
  90.                 }
  91.                
  92.                 Timer1_Delay10ms(10);

  93.                 nop;
  94.                 //循环1分钟后当(ADP04<=ADP03)进入掉电模式休眠省电,电压在2V以下
  95.                 //当(ADP04>ADP03)电压在4-5V 外部中断唤醒休眠
  96.                
  97.                
  98.         }                       
  99. }
这样能实现吗?关闭ADC放这位置是正确的不?菜鸟一个多多指教
zhuomuniao110 发表于 2020-6-16 17:53 | 显示全部楼层
看效果啊。
能否实现,烧录进去不就知道了。
huahuagg 发表于 2020-6-17 22:12 | 显示全部楼层
楼主跑一下试试不就知道了。
gwsan 发表于 2020-7-6 17:12 | 显示全部楼层
现在耗电量是多少
kxsi 发表于 2020-7-6 17:13 | 显示全部楼层
用哪种休眠模式呢
nawu 发表于 2020-7-6 17:13 | 显示全部楼层
当然可以了
qcliu 发表于 2020-7-6 17:14 | 显示全部楼层
最低电压需要多少
tfqi 发表于 2020-7-6 17:14 | 显示全部楼层
楼主问题解决了吗

评论

没有呢,等高人指点  发表于 2020-7-15 20:58
 楼主| 盾视工作室 发表于 2020-7-15 20:58 | 显示全部楼层
tfqi 发表于 2020-7-6 17:14
楼主问题解决了吗

没解决,就这程序,只给芯片供电没带负载都是7mA.
 楼主| 盾视工作室 发表于 2020-7-15 20:59 | 显示全部楼层
qcliu 发表于 2020-7-6 17:14
最低电压需要多少

最低电压2.4-5.5V
wanduzi 发表于 2020-7-15 22:01 | 显示全部楼层
实现了没
qiangtech 发表于 2020-7-16 11:22 | 显示全部楼层
如果是想达到降低功耗,就要让MCU多进入掉电模式。如果楼主的ADC输入信号保持时间比较长,可以考虑使用WKT自唤醒定时器。用定时器定时唤醒MCU进行ADC检测,完成功能。如果ADC输入的信号时间很短,可以考虑用一个比较器或者复位IC之类的形成一个电平边沿就可以唤醒MCU完成功能。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

7

主题

50

帖子

0

粉丝
快速回复 在线客服 返回列表 返回顶部