test interruptIn feature with 555 timer
Dependencies: ClockControl PowerControl mbed
Fork of Frequency_counter by
Test interruptIn function with using LMC555 timer IC
LPC 1768 自身が持つタイマー割り込み機能を使わずに、 あえて外部のタイマー IC 555 からの信号で周期的に割り込みするテスト。
下記の回路例では、555 の output 端子が 約 10 秒周期のうち、0.3 秒間 Low になるはず。 ただし、コンデンサーおよび抵抗の誤差の影響があり、実測値は約7秒周期
C を 47μ から 330 μ に変えると約1分前後で周期的に割り込みがかかります。
なるべく配線が交差しないように部品配置してみた例
Diff: main.cpp
- Revision:
- 6:7f90a61e1a69
- Parent:
- 5:9be3080ca8ba
- Child:
- 7:42e7f18361c8
--- a/main.cpp Tue Jun 04 06:14:19 2013 +0000 +++ b/main.cpp Sun Aug 11 08:34:00 2013 +0000 @@ -1,14 +1,6 @@ +//see mbed.org/users/strysd/notebook/measure_humidity_with_hs15p_and_lmc555/ #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 1000 //wait interrupts in msec -#define WAIT_NEXT 4000 //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 +#include "main.h" InterruptIn in(p8); //connect to the Discharge of 555 DigitalOut run555(p9);//connect to the Reset of 555 @@ -22,15 +14,14 @@ 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 < READ_TIMER){ + my_interval = t1.read_us();// Get time since last interrupt } - if(rest_in == 0){ + t1.reset();// Reset timer and wait for next interrupt + rest_in--; + + if(rest_in <= 0){ //No use interrupt run555 = led = 0; t1.stop(); @@ -41,7 +32,7 @@ run555 = led = 0; // Set up the interrupt in.mode(PullUp); - in.fall(&flip); + in.rise(&flip); printf("\rStarting measure\n"); @@ -52,14 +43,15 @@ rest_in = IN_TIMES; run555 = led = 1; wait_ms(WAIT_IN); + run555 = led = 0;//force stop 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); + printf("\r %.0f Hz, %.0f micro sec, %.1f kilo ohm \n", + my_freq, my_interval, my_ohm); } wait_ms(WAIT_NEXT);