Library to use my Photo MOS Relays Circuit having 16 or less channels.
Fork of PMRC4ch by
PMRC16ch.h@40:d30c68b7ec18, 2018-11-07 (annotated)
- Committer:
- aktk
- Date:
- Wed Nov 07 18:46:18 2018 +0000
- Revision:
- 40:d30c68b7ec18
- Parent:
- 39:c12b8ce1263b
- Child:
- 41:903a9dc5769c
renshoo datteba
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
aktk | 34:013746eddc4a | 1 | /** PMRC16 class header file |
aktk | 37:0106e81d7dfc | 2 | * \file PMRC16ch.h |
aktk | 37:0106e81d7dfc | 3 | * \author Akifumi Takahashi |
aktk | 37:0106e81d7dfc | 4 | * \date 2016/dec/11- |
aktk | 31:0f491590ada9 | 5 | * - ver.1; 8 channel |
aktk | 37:0106e81d7dfc | 6 | * \date 2018/jun/01- |
aktk | 31:0f491590ada9 | 7 | * - ver.16.1; 16 channel |
aktk | 37:0106e81d7dfc | 8 | * \date 2018/jun/28- |
aktk | 31:0f491590ada9 | 9 | * - ver.16.2; major change |
aktk | 29:9028bc6b5717 | 10 | */ |
aktk | 34:013746eddc4a | 11 | #ifndef PMRC_16CHANNEL_H |
aktk | 34:013746eddc4a | 12 | #define PMRC_16CHANNEL_H |
aktk | 29:9028bc6b5717 | 13 | #include "mbed.h" |
aktk | 35:2329524f385a | 14 | /** PMCR16 nyaan |
aktk | 37:0106e81d7dfc | 15 | * \par About PMRC16 class |
aktk | 26:a47ab67a4d12 | 16 | * - A Program with which to control Photo MOS Relay Circuit |
aktk | 15:56703876e914 | 17 | * for 16 channels Electric Stimulation. |
aktk | 26:a47ab67a4d12 | 18 | * - Photo Couplers are controlled by Shift Resisters. So this lib serves |
aktk | 22:4aad836d3333 | 19 | * shift resister's utility. |
aktk | 23:cea3ec410735 | 20 | * |
aktk | 37:0106e81d7dfc | 21 | * \par Image of Photo MOS Relay Array |
aktk | 25:953a60ea0e64 | 22 | * - 32 Photo MOS Relay IN |
aktk | 25:953a60ea0e64 | 23 | * - 16 channel OUT |
aktk | 34:013746eddc4a | 24 | * |
aktk | 37:0106e81d7dfc | 25 | * \verbatim |
aktk | 31:0f491590ada9 | 26 | * +--i o----+----i o--+ |
aktk | 31:0f491590ada9 | 27 | * | [PMR01-1] | [PMR01-2] | |
aktk | 31:0f491590ada9 | 28 | * | (ch1(B)out) | |
aktk | 31:0f491590ada9 | 29 | * | | |
aktk | 31:0f491590ada9 | 30 | * +--i o----+----i o--+ |
aktk | 31:0f491590ada9 | 31 | * | [PMR02-1] | [PMR02-2] | |
aktk | 31:0f491590ada9 | 32 | * | (ch2(R)out) | |
aktk | 31:0f491590ada9 | 33 | * | | |
aktk | 31:0f491590ada9 | 34 | * . . . |
aktk | 31:0f491590ada9 | 35 | * . . . |
aktk | 31:0f491590ada9 | 36 | * . . . |
aktk | 31:0f491590ada9 | 37 | * Vpp GND |
aktk | 37:0106e81d7dfc | 38 | * \endverbatim |
aktk | 24:4714402606f0 | 39 | * |
aktk | 37:0106e81d7dfc | 40 | * \par Info. Shit-Resister circuit board |
aktk | 24:4714402606f0 | 41 | * - nOE is connected to GND |
aktk | 34:013746eddc4a | 42 | * |
aktk | 37:0106e81d7dfc | 43 | * \verbatim |
aktk | 15:56703876e914 | 44 | * in |
aktk | 15:56703876e914 | 45 | * ->[PMR01-1]->[PMR01-2]->[PMR02-1]->[PMR02-2] |
aktk | 15:56703876e914 | 46 | * ->[PMR03-1]->[PMR03-2]->[PMR04-1]->[PMR04-2] |
aktk | 15:56703876e914 | 47 | * ->[PMR05-1]->[PMR05-2]->[PMR06-1]->[PMR06-2] |
aktk | 15:56703876e914 | 48 | * ->[PMR07-1]->[PMR07-2]->[PMR08-1]->[PMR08-2] |
aktk | 15:56703876e914 | 49 | * ->[PMR09-1]->[PMR09-2]->[PMR10-1]->[PMR10-2] |
aktk | 15:56703876e914 | 50 | * ->[PMR11-1]->[PMR11-2]->[PMR12-1]->[PMR12-2] |
aktk | 15:56703876e914 | 51 | * ->[PMR13-1]->[PMR13-2]->[PMR14-1]->[PMR14-2] |
aktk | 15:56703876e914 | 52 | * ->[PMR15-1]->[PMR15-2]->[PMR16-1]->[PMR16-2] |
aktk | 15:56703876e914 | 53 | * ->out |
aktk | 37:0106e81d7dfc | 54 | * \endverbatim |
aktk | 24:4714402606f0 | 55 | * |
aktk | 37:0106e81d7dfc | 56 | * \version 1 |
aktk | 34:013746eddc4a | 57 | * - 2016/dec/11- |
aktk | 36:d365db06cf17 | 58 | * - program bersion for 8 channel circuit |
aktk | 37:0106e81d7dfc | 59 | * \version 16.1 |
aktk | 34:013746eddc4a | 60 | * - 2018/jun/01- |
aktk | 35:2329524f385a | 61 | * - 16 channel version |
aktk | 37:0106e81d7dfc | 62 | * \version 16.2 |
aktk | 34:013746eddc4a | 63 | * - 2018/jun/28- |
aktk | 34:013746eddc4a | 64 | * - major change |
aktk | 37:0106e81d7dfc | 65 | * \version 16.x |
aktk | 15:56703876e914 | 66 | */ |
aktk | 15:56703876e914 | 67 | class PMRC16ch |
aktk | 15:56703876e914 | 68 | { |
aktk | 15:56703876e914 | 69 | public: |
aktk | 15:56703876e914 | 70 | // |
aktk | 38:df92ed56a6a9 | 71 | /// \par Constructors |
aktk | 15:56703876e914 | 72 | // |
aktk | 38:df92ed56a6a9 | 73 | /// Constructor default |
aktk | 15:56703876e914 | 74 | PMRC16ch(); |
aktk | 38:df92ed56a6a9 | 75 | /// Constructor with setting num of channels |
aktk | 15:56703876e914 | 76 | PMRC16ch( |
aktk | 40:d30c68b7ec18 | 77 | uint8_t arg_num_ch ///< [in] number of channels to use |
aktk | 21:fa067e2a30f2 | 78 | ); |
aktk | 38:df92ed56a6a9 | 79 | //* Construxtor with full configuration |
aktk | 38:df92ed56a6a9 | 80 | /** |
aktk | 38:df92ed56a6a9 | 81 | * \par Avalable Setting |
aktk | 38:df92ed56a6a9 | 82 | * - number of channels to use |
aktk | 38:df92ed56a6a9 | 83 | * - pin settings |
aktk | 38:df92ed56a6a9 | 84 | */ |
aktk | 21:fa067e2a30f2 | 85 | PMRC16ch( |
aktk | 39:c12b8ce1263b | 86 | uint8_t arg_num_ch, ///<[in] number of channels to use |
aktk | 39:c12b8ce1263b | 87 | PinName arg_SCK, ///<[in] pin of shift registor clock |
aktk | 39:c12b8ce1263b | 88 | PinName arg_CLR, ///<[in] pin to clear the shift registor |
aktk | 39:c12b8ce1263b | 89 | PinName arg_RCK, ///<[in] pin of storage registor (buffer) clock |
aktk | 39:c12b8ce1263b | 90 | PinName arg_SER, ///<[in] pin to insert data |
aktk | 39:c12b8ce1263b | 91 | PinName arg_OUT ///<[in] pin to receive overflowed bit |
aktk | 19:1112aeb5cddd | 92 | ); |
aktk | 15:56703876e914 | 93 | |
aktk | 15:56703876e914 | 94 | // Const. |
aktk | 19:1112aeb5cddd | 95 | enum State { |
aktk | 21:fa067e2a30f2 | 96 | ALLGROUND = 0x55555555, |
aktk | 21:fa067e2a30f2 | 97 | CH1 = /*1V*/0b10000000000000000000000000000000/*16G*/, |
aktk | 21:fa067e2a30f2 | 98 | CH2 = /*1V*/0b00100000000000000000000000000000/*16G*/, |
aktk | 21:fa067e2a30f2 | 99 | CH3 = /*1V*/0b00001000000000000000000000000000/*16G*/, |
aktk | 21:fa067e2a30f2 | 100 | CH4 = /*1V*/0b00000010000000000000000000000000/*16G*/, |
aktk | 21:fa067e2a30f2 | 101 | CH5 = /*1V*/0b00000000100000000000000000000000/*16G*/, |
aktk | 21:fa067e2a30f2 | 102 | CH6 = /*1V*/0b00000000001000000000000000000000/*16G*/, |
aktk | 21:fa067e2a30f2 | 103 | CH7 = /*1V*/0b00000000000010000000000000000000/*16G*/, |
aktk | 21:fa067e2a30f2 | 104 | CH8 = /*1V*/0b00000000000000100000000000000000/*16G*/, |
aktk | 21:fa067e2a30f2 | 105 | CH9 = /*1V*/0b00000000000000001000000000000000/*16G*/, |
aktk | 21:fa067e2a30f2 | 106 | CH10= /*1V*/0b00000000000000000010000000000000/*16G*/, |
aktk | 21:fa067e2a30f2 | 107 | CH11= /*1V*/0b00000000000000000000100000000000/*16G*/, |
aktk | 21:fa067e2a30f2 | 108 | CH12= /*1V*/0b00000000000000000000001000000000/*16G*/, |
aktk | 21:fa067e2a30f2 | 109 | CH13= /*1V*/0b00000000000000000000000010000000/*16G*/, |
aktk | 21:fa067e2a30f2 | 110 | CH14= /*1V*/0b00000000000000000000000000100000/*16G*/, |
aktk | 21:fa067e2a30f2 | 111 | CH15= /*1V*/0b00000000000000000000000000001000/*16G*/, |
aktk | 21:fa067e2a30f2 | 112 | CH16= /*1V*/0b00000000000000000000000000000010/*16G*/, |
aktk | 21:fa067e2a30f2 | 113 | ALLHiZ = 0x00000000 |
aktk | 19:1112aeb5cddd | 114 | }; |
aktk | 15:56703876e914 | 115 | enum Polarity {Anodic = 0, Cathodic = 1}; |
aktk | 21:fa067e2a30f2 | 116 | enum StimMode {ONE_VS_THEOTHERS, TWIN_ELECTRODES}; |
aktk | 15:56703876e914 | 117 | // |
aktk | 21:fa067e2a30f2 | 118 | // Function to prepare channels |
aktk | 15:56703876e914 | 119 | // |
aktk | 20:26972de3cf90 | 120 | void allGround(); |
aktk | 15:56703876e914 | 121 | void allHiZ(); |
aktk | 21:fa067e2a30f2 | 122 | void setPol(Polarity pol); //inline definition |
aktk | 21:fa067e2a30f2 | 123 | void setOvsO(char ch); |
aktk | 21:fa067e2a30f2 | 124 | void setTwin(char stim_ch, char ref_ch); |
aktk | 15:56703876e914 | 125 | // |
aktk | 15:56703876e914 | 126 | // Function to get prameter |
aktk | 15:56703876e914 | 127 | // |
aktk | 21:fa067e2a30f2 | 128 | uint32_t getState(); //inline definition |
aktk | 21:fa067e2a30f2 | 129 | bool getPol(); //inline definition |
aktk | 15:56703876e914 | 130 | |
aktk | 15:56703876e914 | 131 | private: |
aktk | 21:fa067e2a30f2 | 132 | // The number of channels to use |
aktk | 21:fa067e2a30f2 | 133 | const uint8_t m_num_ch; |
aktk | 15:56703876e914 | 134 | // |
aktk | 15:56703876e914 | 135 | // Sig var to controll PRM circuit |
aktk | 15:56703876e914 | 136 | // |
aktk | 15:56703876e914 | 137 | DigitalOut m_SCK; // Shift-resister's clock |
aktk | 15:56703876e914 | 138 | DigitalOut m_CLR; // To use when you want to clear shift-resister |
aktk | 15:56703876e914 | 139 | DigitalOut m_RCK; // FF's clock |
aktk | 15:56703876e914 | 140 | DigitalOut m_SER; // Serial input to shift data in a shift-resister |
aktk | 15:56703876e914 | 141 | DigitalIn m_OUT; // Output data overflowed from shift-resister |
aktk | 21:fa067e2a30f2 | 142 | // |
aktk | 21:fa067e2a30f2 | 143 | // Var of state |
aktk | 21:fa067e2a30f2 | 144 | // |
aktk | 21:fa067e2a30f2 | 145 | // Position of stimulation bits |
aktk | 21:fa067e2a30f2 | 146 | // 0: no stimbits, 1~m_num_ch: channel of stimulation |
aktk | 21:fa067e2a30f2 | 147 | uint32_t m_pos_stim; |
aktk | 21:fa067e2a30f2 | 148 | static const uint32_t m_statearray[]; |
aktk | 21:fa067e2a30f2 | 149 | uint32_t m_PMRC_state; |
aktk | 21:fa067e2a30f2 | 150 | Polarity m_PMRC_POL; |
aktk | 21:fa067e2a30f2 | 151 | StimMode m_PMRC_mode; |
aktk | 15:56703876e914 | 152 | // Initialization |
aktk | 15:56703876e914 | 153 | void init(); |
aktk | 15:56703876e914 | 154 | // |
aktk | 21:fa067e2a30f2 | 155 | // Function to control buffer of shift-resister |
aktk | 15:56703876e914 | 156 | // |
aktk | 15:56703876e914 | 157 | // shift the bits arbitary times |
aktk | 15:56703876e914 | 158 | void shiftby(int times); |
aktk | 21:fa067e2a30f2 | 159 | // the function with which to rapidly set it all-ground |
aktk | 15:56703876e914 | 160 | void sweep(); |
aktk | 15:56703876e914 | 161 | // set the simulation bits of 01 |
aktk | 15:56703876e914 | 162 | void setStimbits(); |
aktk | 21:fa067e2a30f2 | 163 | // set all bits arbitarily |
aktk | 21:fa067e2a30f2 | 164 | void setBits(const uint32_t bits); |
aktk | 21:fa067e2a30f2 | 165 | // |
aktk | 21:fa067e2a30f2 | 166 | // Clock Function |
aktk | 21:fa067e2a30f2 | 167 | // |
aktk | 15:56703876e914 | 168 | //update the clock of shift-resister |
aktk | 15:56703876e914 | 169 | void update(); |
aktk | 15:56703876e914 | 170 | // output the data by uploading them to FF Resitors |
aktk | 15:56703876e914 | 171 | void upload(); |
aktk | 15:56703876e914 | 172 | }; |
aktk | 21:fa067e2a30f2 | 173 | inline void PMRC16ch::setPol(Polarity arg_pol) |
aktk | 21:fa067e2a30f2 | 174 | { |
aktk | 21:fa067e2a30f2 | 175 | m_PMRC_POL = arg_pol; |
aktk | 21:fa067e2a30f2 | 176 | } |
aktk | 20:26972de3cf90 | 177 | inline uint32_t PMRC16ch::getState() |
aktk | 15:56703876e914 | 178 | { |
aktk | 21:fa067e2a30f2 | 179 | return m_PMRC_state; |
aktk | 15:56703876e914 | 180 | } |
aktk | 15:56703876e914 | 181 | inline bool PMRC16ch::getPol() |
aktk | 15:56703876e914 | 182 | { |
aktk | 15:56703876e914 | 183 | //return false if cathodic |
aktk | 15:56703876e914 | 184 | //return true if anodic |
aktk | 15:56703876e914 | 185 | return static_cast<bool>(m_PMRC_POL); |
aktk | 15:56703876e914 | 186 | } |
aktk | 15:56703876e914 | 187 | #endif |