[PIC®/AVR®/dsPIC®产品] PIC16F1503 休眠低功耗电流降不到规格书上写的标准,求助

[复制链接]
2590|1
 楼主| jiangcr81 发表于 2015-6-9 15:34 | 显示全部楼层 |阅读模式
  1. /*
  2. 项目:示例程序
  3. 芯片:PIC16F1503
  4. 功能:
  5. 休眠唤醒
  6. 2.7uA

  7. 脚位定义
  8.              ________________________
  9.             |VDD                  VSS|
  10.             |RA5              AN0/RA0|
  11.             |RA4/AN3          AN1/RA1|
  12.             |RA3         PWM3/AN2/RA2|
  13.             |RC5/CWG1A/PWM1   AN4/RC0|
  14.             |RC4/CWG1B   PWM4/AN5/RC1|
  15.             |RC3/AN7/PWM2     AN6/RC2|
  16.              ------------------------


  17. */

  18. #include <pic.h>

  19. //芯片配置字
  20. __CONFIG(0x3924);
  21. __CONFIG(0x3FFF);

  22. void main()
  23. {
  24.         /*
  25.         振荡器控制寄存器
  26.         <6-3>IRCF 内部振荡器频率选择位
  27.                                                         5V供电        3.3V供电        T0
  28.         1111 16MHz                                887uA                                125us
  29.         1110 8MHz                                613uA                                250us
  30.         1101 4MHz                                470uA                                500us
  31.         1100 2MHz                                389uA                                1ms
  32.         1011 1MHz                                354uA                                2ms
  33.         1010 500kHz                                331uA                                4ms
  34.         1001 250kHz
  35.         1000 125kHz
  36.         0111 500kHz 复位默认        332uA        290uA                4ms
  37.         0110 250kHz
  38.         0101 125kHz                                320uA
  39.         0100 62.5kHz
  40.         001x 31.25kHz                        317uA
  41.         000x 31kHz                                20uA        18.3uA
  42.         */
  43.         OSCCON = 0B00000000;        //<6-3>IRCF;<1:0>SCS
  44.         VREGCON= 0B00000010;        //<1>VREGPM
  45.        
  46.         /*
  47.         PS 预分频比选择位
  48.         000 1:2
  49.         001 1:4
  50.         010 1:8
  51.         011 1:16
  52.         100 1:32
  53.         101 1:64
  54.         110 1:128
  55.         111 1:256
  56.         */
  57.         OPTION_REG = 0B00000000;//<7>#WPUEN;<6>INTEDG;<5>TMR0CS;<4>TMR0SE;<3>PSA;<2:0>PS

  58.         APFCON = 0B00000000;        //备用引脚选择
  59.         ANSELA = 0B00000000;        //模拟数字  1:模拟; 0:数字
  60.         ANSELC = 0B00000000;        //模拟数字  1:模拟; 0:数字
  61.        
  62.         LATA   = 0B00001000;        //数据锁存器
  63.         TRISA  = 0B00001000;        //输入输出        1:输入; 0:输出
  64.         PORTA  = 0B00001000;        //电平                1:高;   0:低
  65.         WPUA   = 0B00001000;        //上拉                1:使能; 0:禁止
  66.        
  67.         LATC   = 0B00000000;        //数据锁存器
  68.         TRISC  = 0B00000000;        //输入输出        1:输入; 0:输出
  69.         PORTC  = 0B00000000;        //电平                1:高;   0:低

  70.         IOCAP  = 0B00000000;        //PA电平变化中断正边沿
  71.         IOCAN  = 0B00000000;        //PA电平变化中断负边沿
  72.        
  73.         //ADC
  74.         FVRCON = 0B01000000;        //<7>FVREN;<6>FVRRDY;<5>TSEN;<4>TSRNG;<3:2>CDAFVR;<1:0>ADFVR
  75.         /*<6-2>CHS
  76.         00000 AN0
  77.         00001 AN1
  78.         00010 AN2
  79.         00011 AN3
  80.         00100 AN4
  81.         00101 AN5
  82.         00110 AN6
  83.         00111 AN7
  84.         11101 温度
  85.         11110 DAC
  86.         11111 FVR
  87.         */
  88.         ADCON0 = 0B01111100;        //<6-2>CHS;<1>GO/DONE;<0>ADON
  89.         ADCON1 = 0B10100000;        //<7>ADFM;<6-4>ADCS;<1:0>ADPREF

  90.         //Timer0
  91.         TMR0   = 0x00;

  92.         //Timer1
  93.         /*
  94.         <5:4>T1CKPS Timer1输入时钟预分频比选择位
  95.         11 1:8
  96.         10 1:4
  97.         01 1:2
  98.         00 1:1
  99.         */
  100.         T1CON  = 0B00000000;        //<7:6>TMR1CS;<5:4>T1CKPS;<2>#T1SYNC;<0>TMR1ON
  101.         T1GCON = 0B00000000;        //<7>TMR1GE;<6>T1GPOL;<5>T1GTM;<4>T1GSPM;<3>T1GGO;<2>T1GVAL;<1:0>T1GSS
  102.         TMR1H  = 0x00;                        //递增到FFFFh发生中断
  103.         TMR1L  = 0x00;

  104.         //Timer2
  105.         /*
  106.         <6-3>T2OUTPS Timer2输出后分频比选择位
  107.         0000 1:1
  108.         0001 1:2
  109.         0010 1:3
  110.         ...
  111.         1101 1:14
  112.         1110 1:15
  113.         1111 1:16
  114.         <1:0>Timer2时钟预分频比选择位 影响PWM周期
  115.         00 1
  116.         01 4
  117.         10 16
  118.         11 64
  119.         */
  120.         T2CON  = 0B00000000;        //<6-3>T2OUTPS;<2>TMR2ON;<1:0>T2CKPS
  121.         PR2    = 0x68;                        //周期寄存器//PWM周期=(PR2+1)×4Tosc×(TMR2预分频值)
  122.         TMR2   = 0x00;                        //计数保持寄存器

  123.         //PWM1
  124.         /*
  125.         38kHz T2CKPS预分频1, PR2=0X68;PWM1DCH=0x1A;
  126.         */
  127.         PWM1CON= 0B00000000;        //<7>PWM1EN;<6>PWM1OE;<5>PWM1OUT;<4>PWM1POL
  128.         PWM1DCH= 0x1A;                        //PWM占空比高位
  129.         PWM1DCL= 0x00;                        //<7:6>PWM占空比低位 10位分辨率的占空比

  130.         //CWG模块
  131.         CWG1DBR= 0x0A;                        //<5-0>上升沿死区计数
  132.         CWG1DBF= 0x0A;                        //<5-0>下降沿死区计数
  133.         CWG1CON0=0B00000000;        //<7>G1EN;<6>G1OEB;<5>G1OEA;<4>G1POLB;<3>G1POLA;<0>G1CS0
  134.         /* <2-0>G1IS
  135.         111 LC1OUT
  136.         110 N1OUT
  137.         101 PWM4OUT
  138.         100 PWM3OUT
  139.         011 PWM2OUT
  140.         010 PWM1OUT
  141.         001 ASYNC_C1OUT
  142.         000 ASYNC_C2OUT
  143.         */
  144.         CWG1CON1=0B10100010;        //<7:6>G1ASDLB;<5:4>G1ASDLA;<2-0>G1IS
  145.         CWG1CON2=0B00000000;        //<7>G1ASE;<6>G1ARSEN;<3>G1ASDC2;<2>G1ASDC1;<1>G1ASDFLT;<0>G1ASDCLC2
  146.        
  147.         PIE1   = 0B00000000;        //<7>TMR1GIE;<6>ADIE;<3>SSP1IE;<1>TMR2IE;<0>TMR1IE
  148.         PIR1   = 0B00000000;        //<7>TMR1GIF;<6>ADIF;<3>SSP1IF;<1>TMR2IF;<0>TMR1IF
  149.         INTCON = 0B00000000;        //<7>GIE;<6>PEIE;<5>TMR0IE;<4>INTE;<3>IOCIE;<2>TMR0IF;<1>INTF;<0>IOCIF

  150.         asm("nop");
  151.         asm("nop");
  152.         asm("nop");
  153.         asm("nop");
  154.         asm("nop");
  155.         asm("nop");
  156.         asm("nop");
  157.         asm("nop");
  158.         asm("nop");
  159.         asm("nop");
  160.         asm("nop");
  161.         asm("nop");
  162.         asm("nop");
  163.         asm("nop");
  164.         asm("nop");
  165.         asm("nop");
  166.        
  167.         while(1)
  168.         {
  169.                 SLEEP();
  170.                 ///////////////////////////////////////////////////////////
  171.         }
  172. }



数据手册上写典型值是 0.5uA, 实测是 2.7uA。不知道哪里有问题。芯片只接了电源和地,其它脚都悬空输出低的。
大神们帮看看,谢谢!
sunmj 发表于 2015-6-12 08:24 | 显示全部楼层
看看这个有没有帮助,别的网站看到的

PIC16单片机设置不同IO口状态对功耗的影响
最近在做PIC单片机的低功耗,于是设置不同IO口状态测试了一下功耗情况,采用串联万用表的方式测量电流,单片机IO口为悬空状态,整个系统无外设驱动,测试采用的是PIC16F690单片机。

思路如下:系统上电后初始化所有的IO,然后进入调用系统函数SLEEP();进入休眠状态。
1. A、B、C端口全部为输入上拉:休眠后耗电500uA左右。
2. A、B、C端口全部为输入下拉:休眠后耗电500uA左右。
3. A、B、C端口全部为输出上拉:休眠后耗电2200uA左右。
4. A、B、C端口全部为输出下拉:休眠后耗电<1uA。反正万用表直流2mA 档示数为零,我没有更精密的测量工具了,所以具体多少nA不知,但以上测量数据足以给同行们一些启示。
实际运用中,降低晶振的工作频率,关闭BOR欠压复位等设置可以更省电。注意,悬空的IO引脚不管是上拉到VDD还是下拉到GND,总需要拉一下的。如果只设置为输入后输出,而没有设置为上拉到VDD或下拉到GND,则会非常耗电,功耗会至少增大十倍。千万注意呀!
您需要登录后才可以回帖 登录 | 注册

本版积分规则

4

主题

14

帖子

0

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