PIC16F1823の消費電流を測定してみる
無事にPICerFTの導入&書込みが出来るようになりましたので、サンプルコードを組んで消費電流を測定してみます。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 |
//****************************************************************************** //* sleep_test.c : Power consumption check for PIC16F1823. * //* * //* usage: * //* * //* history: * //* Oct05,2022 start coding. N.Mato * //* * //* Copyright(c)2022 Rigel Intelligence * //****************************************************************************** //*** includes ***************************************************************** #include <xc.h> //*** PIC12F1822/16F1823 Configuration Bit Settings **************************** // CONFIG1 #pragma config FOSC = INTOSC // Oscillator Selection (INTOSC oscillator: I/O function on CLKIN pin) #pragma config WDTE = OFF // Watchdog Timer Enable (WDT disabled) #pragma config PWRTE = ON // Power-up Timer Enable (PWRT enabled: 64msec wait) #pragma config MCLRE = OFF // MCLR Pin Function Select (MCLR/VPP pin function is digital input) #pragma config CP = OFF // Flash Program Memory Code Protection (Program memory code protection is disabled) #pragma config CPD = OFF // Data Memory Code Protection (Data memory code protection is disabled) #pragma config BOREN = ON // Brown-out Reset Enable (Brown-out Reset enabled) #pragma config CLKOUTEN = OFF // Clock Out Enable (CLKOUT function is disabled. I/O or oscillator function on the CLKOUT pin) #pragma config IESO = OFF // Internal/External Switchover (Internal/External Switchover mode is disabled) #pragma config FCMEN = OFF // Fail-Safe Clock Monitor Enable (Fail-Safe Clock Monitor is disabled) // CONFIG2 #pragma config WRT = OFF // Flash Memory Self-Write Protection (Write protection off) #pragma config PLLEN = OFF // PLL Enable (4x PLL disabled) #pragma config STVREN = ON // Stack Overflow/Underflow Reset Enable (Stack Overflow or Underflow will cause a Reset) #pragma config BORV = LO // Brown-out Reset Voltage Selection (Brown-out Reset Voltage (Vbor), low trip point selected.) #pragma config LVP = OFF // Low-Voltage Programming Enable (High-voltage on MCLR/VPP must be used for programming) //*** definitions ************************************************************** // クロック周波数指定(8MHz) __delay_ms()関数が使用する #define _XTAL_FREQ 8000000 // PortA definitions #define WakeUp 0b00010000 // RA4:input,interrupt: wakeup trigger from sleep mode #define LED 0b00100000 // RA5:output: LED ON/OFF control for debug purpose #define RA1_RX 0b00000010 // RA1:USART Rx #define RA0_TX 0b00000001 // RA0:USART Tx #define RA3_MCLR 0b00001000 // RA3:Input only (not used in this program) //*** functions **************************************************************** void __interrupt() isr( void ) { if(IOCAF4 == 1) // RA4: WakeUp { IOCAF4 = 0; // clear interrupt flag } } void main(void) { unsigned char temp; // PICマイコン設定 OSCCON = 0b01110010; // internal clock: 8MHz ANSELA = 0b00000000; // all pins are set as digital I/O ANSELC = 0b00000000; // all pins are set as digital I/O TRISA = 0b00011010; // GPIO input pins (RA3ピンは常に入力,RA1をRxとして入力,RA4をWakeup triggerとして入力) TRISC = 0b00000000; // GPIO all pins are set as output APFCON = 0b10000100; // alternative pins setup (Rx=RA1,Tx=RA0)) WPUA = (WakeUp|RA3_MCLR); // weak pull-up enable bits for RA WPUC = 0b00000000; // disable all weak pull-up for RC nWPUEN = 0; // weak pull-up enable PORTA = 0b00000000; // initialize RA output pins (LOW) PORTC = 0b00000000; // initialize RC output pins (LOW) // initialize interrupt IOCAP = (WakeUp); // rise edge interrupt IOCIE = 1; // enable IOC interrupt PEIE = 1; // enable periferal interrupt GIE = 1; // enable global interrupt // LEDを点灯する LATA5 = 1; // LED点滅処理(スリープ中は消灯) while(1) { __delay_ms(5000); // LEDを消灯する LATA5 = 0; // sleep here SLEEP(); NOP(); NOP(); NOP(); NOP(); // LEDを点灯する LATA5 = 1; } // 以下の命令は実行されない return; } |
プログラム本体部よりChipの設定部分が多いですが、ダイレクト感があるというか見える範囲できちんと設定している安心感があって良いと思います。
動作の確認方法ですが、RA4(3ピン)がスリープ復帰の割込み入力、RA5(2ピン)が動作確認用のLチカになっています。
・予めRA4をGNDに繋いで電源ONする(LED ON)
・5秒経つとSleepへ移行(LED OFF)
・RA4をOpenにする、もしくはVDDレベルを与えるとSleepから復帰(LED ON)
・再度5秒経つとSleepへ移行(LED OFF)の繰り返し
消費電流の測定はRP2040での測定と比較出来るようになるべく条件を合わせてみました。
・電源は5Vを供給
・実際に使用予定のレギュレータにて3Vを作り、PIC16F1823のVDDとする
・レギュレータ含めた系全体の消費電流を測定する
通常動作時で1mA程、Sleep時で250μA程度でした。
ちなみにチップ単体(3V供給)では、それぞれ800μA、20μAでした。レギュレータ周りで200μA程度を使用しており想定内といったところです。
やはり適材適所というところでしょうか。あらためてPICerFTに感謝です。
コメント