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