Classic Computer Magazine Archive COMPUTE II ISSUE 3 / AUGUST/SEPTEMBER 1980 / PAGE 32

A Digital Cardiotachometer Implemented With The AIM 65

Marvin L. De Jong
Department of Mathematics-Physics
The School of the Ozarks
Pt. Lookout, MO 65726

The circuit shown in Figure 1 and the computer program given in the listing may be used to measure the pulse (heartbeat) rate of a person and display this result (in heartbeats per minute) on the AIM 65 display. A modified version of a PASCO Photo-Plethysmograph (PASCO Scientific, 1933 Republic Avenue, San Leandro, CA 94577) was used to detect the pulses. You might be able to build your own photo-plethysmograph using suitable infared photodiodes and phototransistors (such as the Fairchild FPA106 array) for a lot less money, but be prepared to do some experimentation. The voltage fluctuation from the plethysmograph is amplified by an instrumentation amplifier. We used an Analog Devices (Route 1, Industrial Park, P.O. Box 280, Norwood, MA 02062) AD521. The negative pulses from the AD521 are fed to a 555 timer that acts as a Schmitt trigger circuit, producing a well-defined square pulse at the clock input of the 74LS74. The LED will turn off when a pulse is detected. In the circuit of Figure 1, the 2000 ohm potentiometer on the AD521 controls the gain, and it should be adjusted so that heartbeats cause the LED to flash. An oscilloscope is very useful for making circuit adjustments.

The time interval between two successive pulses to the clock input of the 74LS74 is measured by the computer, and this result is converted to heartbeats per minute. The T1 timer on the 6522 on the AIM 65 microcomputer is used to produce a train of pulses that are fed to one input of the 74LS00 NAND gate. The period of these pulses is 100 microseconds. The leading edge of the heartbeat pulse at the clock input of the 74LS74 flips the Q output to logic one, gating the pulses from PB7 onto PB6 where the T2 counter/timer on the 6522 counts them. They are counted until the leading edge of the next heartbeat pulse flops the Q output to logic zero, closing the gate. Thus, the computer contains the number of 100 microsecond pulses that occurred between two heartbeats. Since f = 1/T where f is the frequency of the heartbeats and T is the time interval between beats, then f = 104/N where N is the number of pulses counted by the T2 counter/timer. Changing the units to pulses per minute gives f = 60 × 104/N.

We first describe the machine language subroutine called by the BASIC program. The instructions from $0E00 to $0E30 merely initialize the various 6522 registers. For example, T1 must produce a pulse train on PB7 and T2 must count pulses. A positive transition on CB1 must set a flag, while reading Port B produces a one microsecond pulse on CB2, clearing the flip-flop. Starting with the instruction at $0E30, the D-input of the flip-flop is set at logic one. Since the flip-flop was previously cleared, its output is currently at logic zero on the Q pin. The first heartbeat pulse reaching the flip-flop clock input sets the Q output to logic one. This transition is also detected by the instructions at $0E37 through $0E39, and as soon as it occurs, the program begins to watch the pulse count on T2.

Before switching the D-input of the flip-flop to logic zero in order to turn the gate off when the next heartbeat pulse arrives, the T2 counter is watched to allow approximately one-half a heartbeat period to elapse. It waits 0.0244 s to be exact (you may wish to decrease the value of the byte at $0E44). The reason for waiting lies in the fact that the wave shape of the heartbeat pulse (at least mine) has a secondary peak that can trigger the flip-flop if the gain is set a bit too high. So, we wait until this secondary pulse has been completed before catching the next heartbeat pulse. Bringing the D-input to logic zero allows the next clock pulse to switch Q to logic zero, closing the gate. The number of counts in T2 is obtained, and if T2 counted through zero, producing an interrupt (IRQ) request, the number of interrupts (counts exceeding 65536) are also obtained.

The BASIC program calls the machine language subroutine which then measures the number of 100 microsecond intervals between heartbeats. The BASIC program merely converts this number to a frequency and displays the result. Finally, it returns to measure another heartbeat period. Note that because of various time delays in processing the data, only every other heartbeat interval is measured.

I would not recommend that a novice experimenter with very little test equipment attempt to build this circuit. A number of adjustments are necessary and things like fluorescent lights can cause problems with the plethysmograph, in particular they can produce a 120 cycle modulation that triggers the circuit. The circuit does make a nice electronics project, and I am sure that improvements are possible. Of course, the circuit and the program are meant to be used for instructional purposes rather than in actual medical applications.

Besides being useful in teaching some simple biomedical instrumentation, this program and circuit might be useful for experiments on factors that alter the heartbeat rate. What about that last cup of coffee you drank? Can you exert control over your pulse rate with your mind? What is the cause of the statistical fluctuation in heartbeat rates when a person is simply relaxed? What happened to your heartbeat rate when that pretty girl walked by?



DIGITAL CARDIOTACHOMETER PROGRAM

10 POKE 04,00:POKE 05,14
20 Y = USR(0)
30 X = 65536*PEEK(51) + 256*PEEK(50) + PEEK(49)
40 R = 600000/X
50 R = INT(R + .5)
60 PRINT R; "PULSES/MIN"
70 GOTO 20
80 END



0E00 A9 B0      START   LDA $B0     Initialize PCR on the 6522. CB 2 in output
0E02 8D 0C A0           STA PCR     pulse mode. Transition an CB1 sets flag.
0E05 A9 81              LDA $81     Initialize DDRB so PB0 and PB1 are output
0E07 8D 02 A0           STA DDRB    pins.
0E0A 8D 00 A0           STA PBD     Set PB0 and PB7 to logic one.
0E0D CE 00 A0           DEC PBD     Make D-input on flip-flop logic zero.
0E10 A9 E0              LDA $E0     Set up ACR so T1 is in free-running mode
0E12 8D 0B A0           STA ACR     and T2 counts pulses.
0E15 A9 A0              LDA $A0     Set up IER so T2 produces interrupts when
0E17 8D 0E A0           STA IER     it counts through zero.
0E1A A9 30              LDA $30     Set period of pulse train from PB7 to be
0E1C 8D 06 A0           STA T1LL    100 microseconds.
0E1F A9 00              LDA $00
0E21 8D 05 A0           STA T1LH    Start pulse train from PB7.
0E24 A9 00              LDA $00     Clear interrupt counter.
0E26 85 33              STA PLSHI   This location contains number of interrupts.
0E28 A9 FF              LDA $FF     Initialize the T2 counter to count down
0E2A 8D 08 A0           STA T2LL    from $FFFF.
0E2D 8D 09 A0           STA T2CH
0E30 EE 00 A0           INC PBD     Set D-input to logic one. Next pulse from
0E33 58                 CLI         plethysmograph will start timing.
0E34 AD 0D A0   WAIT    LDA IFR     Check flag to see if timing has started.
0E37 29 10              AND $10     Mask all except bit four of the IFR.
0E39 F0 F9              BEQ WAIT    Loop here until a pulse starts the timing.
0E3B A9 00              LDA $00     Clear PCR to prevent clearing the 74LS74.
0E3D 8D 0C A0           STA PCR
0E40 AD 09 A0   LOAF    LDA T2CH    Read the timer. Wait here until about
0E43 C9 F4              CMP $F4     one-half the pulse period has passed
0E45 B0 F9              BCS LOAF    before setting D-input to logic zero
0E47 CE 00 A0           DEC PBD     at the next pulse.
0E4A AD 0D A0   LOITER  LDA IPR     Read the flag register. Has the next
0E4D 29 10              AND $10     pulse occurred?
0E4F F0 F9              BEQ LOITER  No. Then wait here.
0E51 A9 FF              LDA $FF     Yes. Then count the pulses that have
0E53 38                 SEC         occurred (from PB7 to PB6).
0E54 ED 08 A0           SBC T2CL    Low order byte of PB7 pulse count.
0E57 85 31              STA PLSLO
0E59 A9 FF              LDA $FF     Get middle byte of PB7 pulse count.
0E5B ED 09 A0           SBC T2CH
0E5E 85 32              STA PLSMI   PLSHI, PLSMI, and PLSLO are read by the
0E60 78                 SEI         BASIC program.
0E61 4C D1 C0           JMP BASIC   Return to BASIC program.


INTERRUPT ROUTINE: SET IRQ VECTOR TO $0E65

0E65 48         INTRPT  PHA         Save accumulator on the stack.
0E66 A9 FF              LDA $FF     Restart T2 by reloading it.
0E68 8D 09 A0           STA T2CH
0E6B 38                 SEC         Now increment the interrupt counter, PLSHI.
0E6C D8                 CLD
0E6D A9 00              LDA $00
0E6F 65 33              ADC PLSHI
0E71 85 33              STA PLSHI   Result into PLSHI.
0E73 68                 PLA         Recall accumulator contents.
0E74 40                 RTI         Return to the machine language subroutine.


Figure 1.
Interface circuit for the digital cardiotachometer.