test interruptIn feature with 555 timer

Dependencies:   ClockControl PowerControl mbed

Fork of Frequency_counter by Satoru Yoshida

Test interruptIn function with using LMC555 timer IC

LPC 1768 自身が持つタイマー割り込み機能を使わずに、 あえて外部のタイマー IC 555 からの信号で周期的に割り込みするテスト。

下記の回路例では、555 の output 端子が 約 10 秒周期のうち、0.3 秒間 Low になるはず。 ただし、コンデンサーおよび抵抗の誤差の影響があり、実測値は約7秒周期

C を 47μ から 330 μ に変えると約1分前後で周期的に割り込みがかかります。

/media/uploads/strysd/int555_10s.png

なるべく配線が交差しないように部品配置してみた例

/media/uploads/strysd/555test.jpg

main.cpp

Committer:
strysd
Date:
2013-06-03
Revision:
4:64d9c0bed75b
Parent:
3:bf0a5effbed2
Child:
5:9be3080ca8ba

File content as of revision 4:64d9c0bed75b:

#include "mbed.h"

//see mbed.org/users/strysd/notebook/measure_humidity_with_hs15p_and_lmc555/
#define CONV_KILO_OHM 0.0072 //if use 0.1 micro F
#define IN_TIMES  10 //interrupt times
#define READ_TIMER 3 //rest times when reads timer
#define WAIT_IN 200 //wait interrupts in msec
#define WAIT_NEXT 4800 //wait next measurement in msec
#define MAX_INTERVAL 100000 //  > 0.1 sec ( < 10 Hz)  in microseconds
#define MIN_INTERVAL 20 // < 20 micro sec ( > 50 kHz) in microseconds
#define ONESEC_BY_MICRO 1000000//   1 sec             in microseconds

InterruptIn in(p8);   //connect to the Discharge of 555
DigitalOut run555(p9);//connect to the Reset of 555
DigitalOut led(LED1);
Timer t1;

float my_interval = 0;//between interrupts in microseconds
float my_freq = 0;//Hz
float my_ohm  = 0;//ohm for HS15P
int   rest_in = 0;//rest of interrupt times

void flip(void)
{
    if(rest_in > 0){
        if(rest_in < READ_TIMER){
            my_interval = t1.read_us();// Get time since last interrupt
        }
        t1.reset();// Reset timer and wait for next interrupt
        rest_in--;
    }
    
    if(rest_in == 0){
        //No use interrupt
        run555 = led = 0;
        t1.stop();
    }
}

int main() {
    run555 = led = 0;
    in.mode(PullUp);
    in.rise(&flip);// Set up the interrupt for rising edge

    printf("\rStarting measure\n");
      
    while (1) {
        //Use interrupt
        my_interval = 0;
        t1.start();
        rest_in = IN_TIMES;
        run555 = led = 1;
        wait_ms(WAIT_IN);

        if (my_interval < MIN_INTERVAL || my_interval > MAX_INTERVAL){
            printf("\r not ready\n");
        } else {
            my_freq = ONESEC_BY_MICRO / my_interval;  // Convert to Hz
            my_ohm  = my_interval     * CONV_KILO_OHM;// Convert to kilo ohm
            printf("\r %d Hz, %d micro sec, %4.1f kilo ohm \n",
                   (int)my_freq, (int)my_interval, my_ohm);
        }

         wait_ms(WAIT_NEXT);
    }
}