GWのガイガーカウンタ自作チャレンジ(2台目) バッテリ駆動版(11)

| | トラックバック(0)
だめ押しのsleep関数 による省電力化と、内蔵タイマーによる1秒未満のパルス間隔への対応をしてみた。結果、消費電流は、実測で、50mAになった(sleep適用前は、55mA)。また、タイマーで、msecの値でパルス間隔時間を測定するように変更してみた。下グラグは、タイマー使用したときの測定値のグラフ。ラジュウム温泉素の接近時に、1.76倍のパスルが発生している結果になった。

11072701.jpg変更後のmbedのソースコードは、、、、

#include "mbed.h"
#include "string.h"
#include "SDFileSystem.h"
#include "PowerControl/PowerControl.h"
#include "EthernetPowerControl.h"
#include "ClockControl.h"

DigitalOut ledActive(p27);
DigitalOut cntRst(p15);
DigitalOut pw400V(p16);
DigitalOut ledEject(p18);

InterruptIn intrQ01(p11);
InterruptIn intrQ04(p12);
InterruptIn intrQ08(p13);
InterruptIn intrQ12(p14);

InterruptIn swAdjust(p28);
InterruptIn swEject(p17);

DigitalIn swSd(p29);
Serial pc(USBTX, USBRX); // tx, rx

SDFileSystem sd(p5,p6,p7,p8, "gm");

time_t seconds_prev;
int need_mark = 0;
Timer myTimer;
Ticker myTicker;

void handler_intrQ04 (void);
void handler_swAdjust (void);
void handler_swEject (void);
void handler_ticker (void);

int statDetect;
int statEject;
int statAdjust;

#define USR_POWERDOWN    (0x104)
int semihost_powerdown() {
    uint32_t arg;
    return __semihost(USR_POWERDOWN, &arg); 
}

void updateLEDs(void) {
    if (statDetect || statEject || statAdjust ) {
        ledActive = 1;
    } else {
        ledActive = 0;
    }
    if (statEject) {
        ledEject = 1;
    } else {
        ledEject = 0;
    }
}

int main() {
    statDetect = 0;
    statEject = 0;
    statAdjust = 0;

    updateLEDs();

    need_mark = 0;
    setSystemFrequency( 0x3, 0x1, 6, 1 );    // need a change to 4800bps
    PHY_PowerDown();
    
    Peripheral_PowerDown(
        LPC1768_PCONP_PCADC |
        LPC1768_PCONP_PCCAN1 |
        LPC1768_PCONP_PCCAN2 |
        LPC1768_PCONP_PCENET |
        LPC1768_PCONP_PCUSB |
//      LPC1768_PCONP_PCI2C0 |
        LPC1768_PCONP_PCI2C1 |
        LPC1768_PCONP_PCI2C2 |
        LPC1768_PCONP_PCPWM1 |
        LPC1768_PCONP_PCMCPWM
    );
    
    semihost_powerdown();
    
    seconds_prev = time(NULL);
    
    intrQ04.fall( handler_intrQ04 );
    myTimer.reset();
    myTimer.start();
    swAdjust.fall( handler_swAdjust );
    swEject.fall( handler_swEject );
    
    pc.printf( "\rBegin Geiger Couter!\n" );
    
    myTicker.attach( &handler_ticker, 60.0);
    
    while(1) {
        Sleep();
    }
}

void handler_ticker (void) {
    time_t seconds = time(NULL);
    struct tm *tc = localtime( &seconds );        
    int min = tc->tm_min;
    pc.printf( "\r--- %d --- \n", min );
    if ( (min % 10) == 0 ) {
        need_mark = 1;
    }
}

void handler_intrQ04 (void) {

    FILE *fp;
    time_t seconds;

    struct tm *tc;
    int myYear, myMon, myDay;
    int myHour, myMin, mySec;
    char fName[256];
    int diff_msec;

    statDetect = 1;
    diff_msec = myTimer.read_ms();
    myTimer.reset();
    seconds = time(NULL);
    seconds_prev = seconds;
    tc = localtime( &seconds );
    myYear = tc->tm_year;
    myMon = tc->tm_mon;
    myDay = tc->tm_mday;
    myHour = tc->tm_hour;
    myMin = tc->tm_min;
    mySec = tc->tm_sec;

    updateLEDs();
    if (1)
//    if (need_mark == 1)
    {
        need_mark = 0; 
        
        if ( (swSd == 0) && (statEject == 0) ) {
            SDFileSystem sd(p5,p6,p7,p8, "gm");
            sprintf( fName, "/gm/%04d%02d%02d.csv", myYear+1900, myMon+1, myDay ); 
            fp = fopen ( fName, "a" );
            if (fp != NULL ){
                       
                fprintf( fp , "%04d/%02d/%02d %02d:%02d:%02d, %d, %d, %d\n",
                    myYear+1900, myMon+1, myDay, myHour, myMin, mySec,
                    seconds, diff_msec, (16*60*1000*10)/(diff_msec)  );
                fclose( fp );
                pc.printf( "\r%04d/%02d/%02d %02d:%02d:%02d, %d, %d, %d ",
                    myYear+1900, myMon+1, myDay, myHour, myMin, mySec,
                    seconds,  diff_msec,  (16*60*1000*10)/(diff_msec) );
            } else {
                pc.printf( "\rcan't open sd " );
            }
        } else {
            pc.printf( "\rnone of sd or skip writeing it " );
            if ( (swSd != 0) && (statEject != 0) ) statEject = 0;
        }
    } else {
        pc.printf( "\rskip - %04d/%02d/%02d %02d:%02d:%02d, %d, %d, %d ",
            myYear+1900, myMon+1, myDay, myHour, myMin, mySec,
            seconds, diff_msec, (16*60*1000*10)/(diff_msec) );

    }
    if ( statAdjust != 0 ) {
        pc.printf( "- sw H - " );
    } else {
        pc.printf( "- sw L - " );
    }
    if ( statEject != 0 ) {
        pc.printf( "- ej H - " );
    } else {
        pc.printf( "- ej L - " );
    }
    if ( swSd != 0 ) {
        pc.printf( "- sd H - \n" );
    } else {
        pc.printf( "- sd L - \n" );
    }
    statDetect = 0;
    updateLEDs();
}

void handler_swAdjust (void) {
    char cc;
    int val;
    struct tm t;
   
    statAdjust = 1;    
    updateLEDs();
   
    pc.printf( "\rPlease, set date and time.\n" );
    while(1) {
        val = 0;
        pc.printf( "\rYear: " );
        if (scanf( "%d", &val ) < 1) {
            goto MY_EXIT;
        }
        pc.printf( "Year = %d\n", val );
        t.tm_year = val - 1900;
        
        pc.printf( "\rMonth: " );
        if (scanf( "%d", &val ) < 1) {
            goto MY_EXIT;
        }
        pc.printf( "Month = %d\n", val );
        t.tm_mon = val - 1;
        
        pc.printf( "\rDay: " );
        if (scanf( "%d", &val ) < 1) {
            goto MY_EXIT;
        }
        pc.printf( "Day = %d\n", val );
        t.tm_mday = val;
    
        pc.printf( "\rHour: " );
        if (scanf( "%d", &val ) < 1) {
            goto MY_EXIT;
        }
        pc.printf( "Hour = %d\n", val );
        t.tm_hour = val;
        
        pc.printf( "\rMin: " );
        if (scanf( "%d", &val ) < 1) {
            goto MY_EXIT;
        }
        pc.printf( "Min = %d\n", val );
        t.tm_min = val;
        
        t.tm_sec = 0;
        
        pc.printf( "\rSet %04d/%02d/%02d %02d:%02d:00 to RTC? (y/n/c)\n", 
            t.tm_year + 1900,
            t.tm_mon + 1,
            t.tm_mday,
            t.tm_hour,
            t.tm_min
        );
        while(1) {
            if ( scanf( "%c", &cc ) < 1 ) {
                goto MY_EXIT;
            }
            if ( cc == 'y' ) {
                time_t seconds = mktime( &t );
                pc.printf( "\rseconds = %d \n" , seconds );
                set_time ( seconds );    
                goto MY_EXIT;
            }
            if ( cc == 'c' ) {
                goto MY_EXIT;
            }
            if ( cc == 'n' ) break;
        }
    }
MY_EXIT:
    statAdjust = 0;
    updateLEDs();
}

void handler_swEject (void) {
    if (statEject == 1) {
        statEject = 0;    
    } else {
        statEject = 1;
    }
    updateLEDs();
}


こんな感じになった。あとは、パルス間隔時間の測定をオートレンジにするプログラムを追加したいかな。

トラックバック(0)

このブログ記事を参照しているブログ一覧: GWのガイガーカウンタ自作チャレンジ(2台目) バッテリ駆動版(11)

このブログ記事に対するトラックバックURL: http://the.nerd.jp/blogs/cgi-bin/mt-tb.cgi/4656

リンク用バナ画像

Thank you for visitors:

from 7th, May. 2005

2013年11月

          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

MY TWITTER

今月のイラスト/ムービー

応援サイト、その他




Visit RenderSan
<-- script type="text/javascript" src="http://swf.mikunavi.net/miku" width=150 height=44 --><-- /script --><-- br / -->
 

このブログ記事について

このページは、Digi Pontaが2011年7月27日 21:54に書いたブログ記事です。

ひとつ前のブログ記事は「ラジュウム温泉素でお試し(1)」です。

次のブログ記事は「ACM Siggraph2011のバッチが届いてた」です。

最近のコンテンツはインデックスページで見られます。過去に書かれたものはアーカイブのページで見られます。

Powered by Movable Type 4.01

マイサイト





Trackback People






注)「Calture」の正しい綴りは、「Culture」です。お間違いないように。