Library to use my Photo MOS Relays Circuit having 16 or less channels.

Fork of PMRC4ch by Akifumi Takahashi

Committer:
aktk
Date:
Wed Nov 07 16:38:00 2018 +0000
Revision:
23:cea3ec410735
Parent:
22:4aad836d3333
Child:
24:4714402606f0
changed comment;

Who changed what in which revision?

UserRevisionLine numberNew contents of line
aktk 15:56703876e914 1 #ifndef PMRC_16CHANNEL_H
aktk 15:56703876e914 2 #define PMRC_16CHANNEL_H
aktk 15:56703876e914 3 /**
aktk 15:56703876e914 4 * PMRC16ch.h
aktk 15:56703876e914 5 * ----------------------------------------
aktk 15:56703876e914 6 * - A Program with which to control
aktk 15:56703876e914 7 * Photo MOS Relay Circuit
aktk 15:56703876e914 8 * for 16 channels Electric Stimulation.
aktk 22:4aad836d3333 9 * - Photo Couplers are controlled by
aktk 22:4aad836d3333 10 * Shift Resisters. So this lib serves
aktk 22:4aad836d3333 11 * shift resister's utility.
aktk 15:56703876e914 12 * ----------------------------------------
aktk 23:cea3ec410735 13 *
aktk 15:56703876e914 14 * 32 Photo MOS Relay IN
aktk 15:56703876e914 15 * 16 channel OUT
aktk 15:56703876e914 16 * +--i o----+----i o--+
aktk 15:56703876e914 17 * | [PMR01-1] | [PMR01-2] |
aktk 15:56703876e914 18 * | (ch1(B)out) |
aktk 15:56703876e914 19 * | |
aktk 15:56703876e914 20 * +--i o----+----i o--+
aktk 15:56703876e914 21 * | [PMR02-1] | [PMR02-2] |
aktk 15:56703876e914 22 * | (ch2(R)out) |
aktk 15:56703876e914 23 * | |
aktk 15:56703876e914 24 * . . .
aktk 15:56703876e914 25 * . . .
aktk 15:56703876e914 26 * . . .
aktk 15:56703876e914 27 * Vpp GND
aktk 15:56703876e914 28 * ----------------------------------------
aktk 15:56703876e914 29 * Shit-Resister
aktk 15:56703876e914 30 * nOE is connected to GND
aktk 15:56703876e914 31 * in
aktk 15:56703876e914 32 * ->[PMR01-1]->[PMR01-2]->[PMR02-1]->[PMR02-2]
aktk 15:56703876e914 33 * ->[PMR03-1]->[PMR03-2]->[PMR04-1]->[PMR04-2]
aktk 15:56703876e914 34 * ->[PMR05-1]->[PMR05-2]->[PMR06-1]->[PMR06-2]
aktk 15:56703876e914 35 * ->[PMR07-1]->[PMR07-2]->[PMR08-1]->[PMR08-2]
aktk 15:56703876e914 36 * ->[PMR09-1]->[PMR09-2]->[PMR10-1]->[PMR10-2]
aktk 15:56703876e914 37 * ->[PMR11-1]->[PMR11-2]->[PMR12-1]->[PMR12-2]
aktk 15:56703876e914 38 * ->[PMR13-1]->[PMR13-2]->[PMR14-1]->[PMR14-2]
aktk 15:56703876e914 39 * ->[PMR15-1]->[PMR15-2]->[PMR16-1]->[PMR16-2]
aktk 15:56703876e914 40 * ->out
aktk 15:56703876e914 41 * ----------------------------------------
aktk 15:56703876e914 42 * Log
aktk 15:56703876e914 43 * ver.1 2016/dec/11-
aktk 15:56703876e914 44 * ch.16 VER.
aktk 21:fa067e2a30f2 45 * ver.16.1 2018/jun/01-
aktk 21:fa067e2a30f2 46 * ver.16.2 2018/jun/28-
aktk 21:fa067e2a30f2 47 * major change
aktk 15:56703876e914 48 */
aktk 15:56703876e914 49 #include "mbed.h"
aktk 15:56703876e914 50 class PMRC16ch
aktk 15:56703876e914 51 {
aktk 15:56703876e914 52 public:
aktk 15:56703876e914 53 //
aktk 15:56703876e914 54 // Constructor
aktk 15:56703876e914 55 //
aktk 15:56703876e914 56 PMRC16ch();
aktk 15:56703876e914 57 PMRC16ch(
aktk 21:fa067e2a30f2 58 uint8_t arg_num_ch
aktk 21:fa067e2a30f2 59 );
aktk 21:fa067e2a30f2 60 PMRC16ch(
aktk 15:56703876e914 61 uint8_t arg_num_ch,
aktk 15:56703876e914 62 PinName arg_SCK,
aktk 15:56703876e914 63 PinName arg_CLR,
aktk 15:56703876e914 64 PinName arg_RCK,
aktk 15:56703876e914 65 PinName arg_SER,
aktk 15:56703876e914 66 PinName arg_OUT
aktk 19:1112aeb5cddd 67 );
aktk 15:56703876e914 68
aktk 15:56703876e914 69 // Const.
aktk 19:1112aeb5cddd 70 enum State {
aktk 21:fa067e2a30f2 71 ALLGROUND = 0x55555555,
aktk 21:fa067e2a30f2 72 CH1 = /*1V*/0b10000000000000000000000000000000/*16G*/,
aktk 21:fa067e2a30f2 73 CH2 = /*1V*/0b00100000000000000000000000000000/*16G*/,
aktk 21:fa067e2a30f2 74 CH3 = /*1V*/0b00001000000000000000000000000000/*16G*/,
aktk 21:fa067e2a30f2 75 CH4 = /*1V*/0b00000010000000000000000000000000/*16G*/,
aktk 21:fa067e2a30f2 76 CH5 = /*1V*/0b00000000100000000000000000000000/*16G*/,
aktk 21:fa067e2a30f2 77 CH6 = /*1V*/0b00000000001000000000000000000000/*16G*/,
aktk 21:fa067e2a30f2 78 CH7 = /*1V*/0b00000000000010000000000000000000/*16G*/,
aktk 21:fa067e2a30f2 79 CH8 = /*1V*/0b00000000000000100000000000000000/*16G*/,
aktk 21:fa067e2a30f2 80 CH9 = /*1V*/0b00000000000000001000000000000000/*16G*/,
aktk 21:fa067e2a30f2 81 CH10= /*1V*/0b00000000000000000010000000000000/*16G*/,
aktk 21:fa067e2a30f2 82 CH11= /*1V*/0b00000000000000000000100000000000/*16G*/,
aktk 21:fa067e2a30f2 83 CH12= /*1V*/0b00000000000000000000001000000000/*16G*/,
aktk 21:fa067e2a30f2 84 CH13= /*1V*/0b00000000000000000000000010000000/*16G*/,
aktk 21:fa067e2a30f2 85 CH14= /*1V*/0b00000000000000000000000000100000/*16G*/,
aktk 21:fa067e2a30f2 86 CH15= /*1V*/0b00000000000000000000000000001000/*16G*/,
aktk 21:fa067e2a30f2 87 CH16= /*1V*/0b00000000000000000000000000000010/*16G*/,
aktk 21:fa067e2a30f2 88 ALLHiZ = 0x00000000
aktk 19:1112aeb5cddd 89 };
aktk 15:56703876e914 90 enum Polarity {Anodic = 0, Cathodic = 1};
aktk 21:fa067e2a30f2 91 enum StimMode {ONE_VS_THEOTHERS, TWIN_ELECTRODES};
aktk 15:56703876e914 92 //
aktk 21:fa067e2a30f2 93 // Function to prepare channels
aktk 15:56703876e914 94 //
aktk 20:26972de3cf90 95 void allGround();
aktk 15:56703876e914 96 void allHiZ();
aktk 21:fa067e2a30f2 97 void setPol(Polarity pol); //inline definition
aktk 21:fa067e2a30f2 98 void setOvsO(char ch);
aktk 21:fa067e2a30f2 99 void setTwin(char stim_ch, char ref_ch);
aktk 15:56703876e914 100 //
aktk 15:56703876e914 101 // Function to get prameter
aktk 15:56703876e914 102 //
aktk 21:fa067e2a30f2 103 uint32_t getState(); //inline definition
aktk 21:fa067e2a30f2 104 bool getPol(); //inline definition
aktk 15:56703876e914 105
aktk 15:56703876e914 106 private:
aktk 21:fa067e2a30f2 107 // The number of channels to use
aktk 21:fa067e2a30f2 108 const uint8_t m_num_ch;
aktk 15:56703876e914 109 //
aktk 15:56703876e914 110 // Sig var to controll PRM circuit
aktk 15:56703876e914 111 //
aktk 15:56703876e914 112 DigitalOut m_SCK; // Shift-resister's clock
aktk 15:56703876e914 113 DigitalOut m_CLR; // To use when you want to clear shift-resister
aktk 15:56703876e914 114 DigitalOut m_RCK; // FF's clock
aktk 15:56703876e914 115 DigitalOut m_SER; // Serial input to shift data in a shift-resister
aktk 15:56703876e914 116 DigitalIn m_OUT; // Output data overflowed from shift-resister
aktk 21:fa067e2a30f2 117 //
aktk 21:fa067e2a30f2 118 // Var of state
aktk 21:fa067e2a30f2 119 //
aktk 21:fa067e2a30f2 120 // Position of stimulation bits
aktk 21:fa067e2a30f2 121 // 0: no stimbits, 1~m_num_ch: channel of stimulation
aktk 21:fa067e2a30f2 122 uint32_t m_pos_stim;
aktk 21:fa067e2a30f2 123 static const uint32_t m_statearray[];
aktk 21:fa067e2a30f2 124 uint32_t m_PMRC_state;
aktk 21:fa067e2a30f2 125 Polarity m_PMRC_POL;
aktk 21:fa067e2a30f2 126 StimMode m_PMRC_mode;
aktk 15:56703876e914 127 // Initialization
aktk 15:56703876e914 128 void init();
aktk 15:56703876e914 129 //
aktk 21:fa067e2a30f2 130 // Function to control buffer of shift-resister
aktk 15:56703876e914 131 //
aktk 15:56703876e914 132 // shift the bits arbitary times
aktk 15:56703876e914 133 void shiftby(int times);
aktk 21:fa067e2a30f2 134 // the function with which to rapidly set it all-ground
aktk 15:56703876e914 135 void sweep();
aktk 15:56703876e914 136 // set the simulation bits of 01
aktk 15:56703876e914 137 void setStimbits();
aktk 21:fa067e2a30f2 138 // set all bits arbitarily
aktk 21:fa067e2a30f2 139 void setBits(const uint32_t bits);
aktk 21:fa067e2a30f2 140 //
aktk 21:fa067e2a30f2 141 // Clock Function
aktk 21:fa067e2a30f2 142 //
aktk 15:56703876e914 143 //update the clock of shift-resister
aktk 15:56703876e914 144 void update();
aktk 15:56703876e914 145 // output the data by uploading them to FF Resitors
aktk 15:56703876e914 146 void upload();
aktk 15:56703876e914 147 };
aktk 21:fa067e2a30f2 148 inline void PMRC16ch::setPol(Polarity arg_pol)
aktk 21:fa067e2a30f2 149 {
aktk 21:fa067e2a30f2 150 m_PMRC_POL = arg_pol;
aktk 21:fa067e2a30f2 151 }
aktk 20:26972de3cf90 152 inline uint32_t PMRC16ch::getState()
aktk 15:56703876e914 153 {
aktk 21:fa067e2a30f2 154 return m_PMRC_state;
aktk 15:56703876e914 155 }
aktk 15:56703876e914 156 inline bool PMRC16ch::getPol()
aktk 15:56703876e914 157 {
aktk 15:56703876e914 158 //return false if cathodic
aktk 15:56703876e914 159 //return true if anodic
aktk 15:56703876e914 160 return static_cast<bool>(m_PMRC_POL);
aktk 15:56703876e914 161 }
aktk 15:56703876e914 162 #endif