SSブログ

ULPWU 超低電流SLEEPモードを使う PIC12F683

先日、友人との会話の中で、所有する車に警報機が実装されて居ない
という事で、購入しようと思えば星の数ほどピンからキリまで様々な
警報機が在るのですが「ダミーでも構わない」という事で製作する
ことに成りまして超単純なLチカを造ろうと、色々と考えて居たのです
至った結論として・・・・

・電池が矢鱈に長持ちする
・三回点滅にする
・警報機らしく見せかける

・・・・などを考慮して取り敢えずPIC12F683を使う事にしました
理由は・・・・

・8ピンと小さい
・ULPWU 超低電流SLEEPモードを持って居る

・・・・からです。

データシートに依れば下記の様に謳われています
Low-Power Features:
• Standby Current:
- 50 nA @ 2.0V, typical
• Operating Current:
- 11μA @ 32 kHz, 2.0V, typical
- 220μA @ 4 MHz, 2.0V, typical
• Watchdog Timer Current:
- 1μA @ 2.0V, typical

最低電流値が50nAとはなかなかの実力だと思います
電源電圧で変わる数値ですから額面通りに受け取れませんがそれでも
それ成りに極小電流値で動いて呉れることでしょう。

という訳で又々他力本願のC言語探しをしていたところ記事が見つか
りまして早速、コピペ致しました PIC マイコンを便利に使うページ
部分的なコピペですが難なくアッサリと動いて呉れました感謝です。

動画は未だブレッドボード試作ですが何か探してそれらしく見せかけ
る為に組み込む予定です。


LEDは三回点滅します
ON = 10ms
インターバル = 200ms
周期 = 3.28秒
ザックリ計算して92.3uA/h、エボルタUM-3 で1,000mA/hですから
1.23年ぐらい持つだろうという捕らぬ狸の皮算用中です
電池は三本、4.5Vで動かします。

写真は
黄色 LEDオン波形
青  ULPWU コンデンサ放電波形
ピンク CPUクロック出力波形、sleep したかの確認の為に出力して居ます

追記2019/01/30(水)
動画の周期は正確ではない事が発覚致しました
理由は何かですが、オシロスコープのプローブのインピーダンスですプローブ
を除去することで周期が9.2秒まで広がりました、現在ULPWU コンデンサは
積層セラミックコンデンサー104を二個パラレルに接続して居ますが一個に
減らしました、それでも周期は4.6秒ですからもっと少ない容量でも良いかも
知れません、要はお好み次第って事ですね。
DSCN0562

回路図です
bandicam 2019-01-29 21-55-26-894


ソースファイル、部分コピペにLEDの点滅を割り込ませただけです

/*
 * File:   main.c
 * Author: maru Jan,29,2019
 */


// インクルードファイル
#include 
#include 
#include 

// PIC12F683コンフィグレーションビット設定
// PIC12F683 Configuration Bit Settings
// 'C' source line config statements
// CONFIG
#pragma config FOSC = INTOSCCLK // Oscillator Selection bits 自己発信、1/4周波数出力 3pin出力
#pragma config WDTE = OFF       // Watchdog Timer Enable bit (WDT disabled)
#pragma config PWRTE = ON       // Power-up Timer Enable bit (PWRT enabled)
#pragma config MCLRE = OFF      // MCLR Pin Function Select bit (MCLR pin function is digital input, MCLR internally tied to VDD)
#pragma config CP = OFF         // Code Protection bit (Program memory code protection is disabled)
#pragma config CPD = OFF        // Data Code Protection bit (Data memory code protection is disabled)
#pragma config BOREN = ON       // Brown Out Detect (BOR enabled)
#pragma config IESO = OFF       // Internal External Switchover bit (Internal External Switchover mode is disabled)
#pragma config FCMEN = OFF      // Fail-Safe Clock Monitor Enabled bit (Fail-Safe Clock Monitor is disabled)

// #pragma config statements should precede project file includes.
// Use project enums instead of #define for ON and OFF.

#include 

// クロック周波数指定
// (__delay_ms()関数が必要としているため)
#define _XTAL_FREQ  1000000



/******************************
LowPowerSleep
 *******************************/
void LowPowerSleep(void) {
#ifndef DEBUG
    for (int i = 0; i < 3; i++) {
        GP5 = 1;
        __delay_ms(10);
        GP5 = 0;
        __delay_ms(200);
    }
    GP0 = 1;
    TRISIO0 = 0; //charge start
    __delay_us(650); //2*PI*C*R*10

    GPIF = 0;
    ULPWUE = 1; //enable ULPWU
    IOC0 = 1;
#endif
    GPIE = 1;
    GIE = 1;
    TRISIO0 = 1; //discharge start
#ifdef DEBUG
    TMR0 = 0;
    T0IF = 0;
    while (!T0IF);
#else
    SLEEP();
    NOP();
#endif
}

/*
 * main()関数
 */
int main(int argc, char** argv) {

    // PICマイコン初期化
    OSCCON = 0x40; //クロック周波数を1MHzに設定
    ANSEL = 0x00; //すべてのピンをデジタルモードに設定
    TRISIO = 0x00; //すべてのピンを出力に設定

    // LEDのピンを0にして、LEDを消灯する
    GP5 = 0;

    // 点滅を永遠繰り返す
    while (1) {

        LowPowerSleep();

        NOP();
    }

    // ここには到達しない
    return (EXIT_SUCCESS);
}

続きを読む


nice!(0)  コメント(0) 

この広告は前回の更新から一定期間経過したブログに表示されています。更新すると自動で解除されます。