PIC单片机之探讨低功耗

     许多人说PIC单片机一大的优势就是低功耗,那我们就来讨论,讨论低功耗的实现。

1,睡眠(sleep)

   睡眠方式是我们最常用的一种方式来降低功耗,但睡眠期间单片机不能做任何的事情。对于那些没事情就睡着,有事情就做一下的情况睡眠无疑是功耗最低的处理方式。

 比如:

            睡眠+ I/O电平变化中断唤醒 当按键没按下时,单片机睡眠,当按键按下后,执行相应的工作。

            睡眠+数据接收中断唤醒      这样单片机就可以再没有接收到数据时候进入睡眠状态,接收到数据的时候就唤醒然后处理数据。当然首先单片机要有相关的外设比如SPI ,I2C,USART,等这些支持这些通讯的模块。

            睡眠+看门狗唤醒                  这个可以用在需要定时唤醒做事情的场合

2,降低时钟频率

             如果即想功耗低,又想单片机在能低功耗的情况下工作。这无疑是个最好的选择。

            PIC单片机 比如PIC16F1823 /1829可以选择从32MHz到31KHz的内部时钟频率,我们通常可以将单片机设置在 4MHz 以上的频率下工作,如果需要单片机降低功耗的时候可以降低频率比如在31KHz的频率下工作。

           虽然PIC16F1823数据手册中写到,单片机在睡眠电流只有只纳安,在31KHz的电流有几微安。但事实纳安只是个幻想。在项目一个中我使用降频得到的最低功耗是50微安左右,采用睡眠也是50微安。因为在如此低的频率下,功耗主要是流失在I/O口上了。

3,电流大户

      单片机工作时钟频率,要降低功耗首先要不就睡眠(关掉时钟),要么就降低频率。

       最耗电流的模块 就数ADC模块,其实模块的耗电和他比起来就是小巫见大巫。所以要低功耗ADC模块绝对不能开。

       还有个用电大户就是I/O口,I/O要不上拉,要不下拉,不能悬空,除此之外还有其他因素,比如I/0口的输入输出状态,比如和其它芯片连接要串个电阻。

       

发布了24 篇原创文章 · 获赞 67 · 访问量 27万+
展开阅读全文

请问单片机如何通过电平变化中断唤醒单片机

10-29

//初始化 #include "holychip_define.h" #include "inital.h" void inital(void) { PORTA=0X00; PORTB=0X00; //PORT口输出高低电平设置 1=高电平,0=低电平 TRISA=0X00; //输入输出设置 1=输入,0=输出 TRISB=0XE0; //输入输出设置 1=输入,0=输出 0X11100000 PB7,PB6,PB5设置为输入 PHCON1=0XFF; //上拉设置 1=DISABLED PULL-UP ;0=PULL-UP PHCON =0XFF; //上拉设置 1=DISABLED PULL-UP ;0=PULL-UP PDCON1=0XFF; //下拉设置 1=DISABLED PULL-UP ;0=PULL-UP PDCON =0XFF; //下拉设置 1=DISABLED PULL-UP ;0=PULL-UP ODCON1=0X00; //开漏设置 0=DISABLED PULL-UP ;1=PULL-UP ODCON =0X00; //开漏设置 0=DISABLED PULL-UP ;1=PULL-UP } //系统初始化 void sysinitial(void) { INTECON=0x00; OSCCON=0X80; OPTION=0X80; //Ftimer0 1/2 PCON=0X40; //更改 上下电复位 禁止看门狗 } //模式转换 #include "holychip_define.h" #include "model.h" void high_frequence_change_to_sleep(void) //高低频切睡眠 { // SBIT(OSCCON, 7, LOW); T0OSCEN=0; } void high_frequence_change_to_low_frequence(void) //高频切低频 { // SBIT(OSCCON, 0, HIGH); SCS=1; } void low_frequence_change_to_high_frequence(void) //低频切高频 { // SBIT(OSCCON, 0, LOW); SCS=0; } void low_or_high_frequence_change_to_green(void) //高低频切绿色模式 T0定时唤醒 { OPTION=0X05; SBIT(OPTION, 5, HIGH); //T0CS=1 // T0CS =1; T0IF=0; //清T0中断标志 T0IE=1; //使能T0定时器 T0=0X00; //T0赋初值 asm(sleep) } //PB电平变化中断初始化 #include "holychip_define.h" #include "PORTB_interrupt_inital.h" void PORTB_interrupt_inital() { TRISB=0XE0; //PORTB端口设置 0X11100000 PB7,PB6,PB5设置为输入 IOCB=0XE0; //使能PORTB端口为电平变化中断 PBIF=0; // PROTB中断请求标志清零 PBIE=1; //使能PROTB中断 GIE=1; //使能GIE } //脉冲显示函数 #include "holychip_define.h" #include "Pulse_display.h uS延时函数 void DelayUs(unsigned char t) { while(--t); } mS延时函数 void DelayMs(unsigned int t) { unsigned char count = 200; while(t--) { while(count--); } } //脉冲显示子程序 void Pulse_display(void) { if(PORTB7==1) PORTA1=1; DelayMs(20); PORTA1=0; if(PORTB7==0) PORTA2=1; DelayMs(20); PORTA2=0; if(PORTB6==1) PORTA3=1; DelayMs(20); PORTA3=0; if(PORTB6==0) PORTB0=1; DelayMs(20); PORTB0=0; if(PORTB5==1) PORTB1=1; DelayMs(20); PORTB1=0; if(PORTB5==0) PORTB2=1; DelayMs(20); PORTB2=0; } //主函数 #include "holychip_define.h" #include "inital.h" #include "Pulse_display.h" #include "PORTB_interrupt_inital.h" #include "model.h" void main(void) { inital(); //端口初始化 DelayMs(100); //延时等待系统稳定 sysinitial(); //系统初始化 PORTB_interrupt_inital();//PB电平中断初始化,设置PB7,PB6,PB5电平中断 while(1) { high_frequence_change_to_sleep(); //高频转换为睡眠模式 Pulse_display(); //脉冲显示 } } //PORTB中断服务程序 void Intr(void) __interrupt 0 { if(PBIF) //Judge PBIF { PBIF=0; //Clear PBIF } } 我目前在做一个低功耗的项目,所以采用单片机的休眠模式,想知道如何使用单片机电平变化中断唤醒单片机? 问答

没有更多推荐了,返回首页

©️2019 CSDN 皮肤主题: 大白 设计师: CSDN官方博客

分享到微信朋友圈

×

扫一扫,手机浏览