Library to use my Photo MOS Relays Circuit having 16 or less channels.
Fork of PMRC4ch by
PMRC16ch.h@23:cea3ec410735, 2018-11-07 (annotated)
- 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?
User | Revision | Line number | New 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 |