Important changes to repositories hosted on mbed.com
Mbed hosted mercurial repositories are deprecated and are due to be permanently deleted in July 2026.
To keep a copy of this software download the repository Zip archive or clone locally using Mercurial.
It is also possible to export all your personal repositories from the account settings page.
main.cpp@0:baa08ea8b9ec, 2021-03-16 (annotated)
- Committer:
- Tetsuki
- Date:
- Tue Mar 16 08:24:53 2021 +0000
- Revision:
- 0:baa08ea8b9ec
Red Tansan Only
Who changed what in which revision?
| User | Revision | Line number | New contents of line |
|---|---|---|---|
| Tetsuki | 0:baa08ea8b9ec | 1 | /************************** |
| Tetsuki | 0:baa08ea8b9ec | 2 | For high-voltage switching circuit test |
| Tetsuki | 0:baa08ea8b9ec | 3 | 2016 Sep. 2- |
| Tetsuki | 0:baa08ea8b9ec | 4 | Hiroyuki Kajimoto |
| Tetsuki | 0:baa08ea8b9ec | 5 | ***************************/ |
| Tetsuki | 0:baa08ea8b9ec | 6 | |
| Tetsuki | 0:baa08ea8b9ec | 7 | #include "mbed.h" |
| Tetsuki | 0:baa08ea8b9ec | 8 | #include <stdio.h> |
| Tetsuki | 0:baa08ea8b9ec | 9 | #include <stdlib.h> |
| Tetsuki | 0:baa08ea8b9ec | 10 | |
| Tetsuki | 0:baa08ea8b9ec | 11 | DigitalOut SN74LV595_DIN(p14); |
| Tetsuki | 0:baa08ea8b9ec | 12 | DigitalOut SN74LV595_RCLK(p13); |
| Tetsuki | 0:baa08ea8b9ec | 13 | DigitalOut SN74LV595_CLR(p12); |
| Tetsuki | 0:baa08ea8b9ec | 14 | DigitalOut SN74LV595_CLK(p11); |
| Tetsuki | 0:baa08ea8b9ec | 15 | DigitalIn SN74LV595_DOUT(p10); //Shift register output, so normally it is not connected. |
| Tetsuki | 0:baa08ea8b9ec | 16 | |
| Tetsuki | 0:baa08ea8b9ec | 17 | //DAAD |
| Tetsuki | 0:baa08ea8b9ec | 18 | SPI spiDAAD(p5, p6, p7); // mosi(master output slave input, miso(not connected), clock signal |
| Tetsuki | 0:baa08ea8b9ec | 19 | DigitalOut DA_sync(p8); //chip select for AD5452 |
| Tetsuki | 0:baa08ea8b9ec | 20 | DigitalOut AD_cs(p9); //chip select for AD7276 |
| Tetsuki | 0:baa08ea8b9ec | 21 | |
| Tetsuki | 0:baa08ea8b9ec | 22 | //Other I/O |
| Tetsuki | 0:baa08ea8b9ec | 23 | BusOut myleds(LED1, LED2, LED3, LED4); |
| Tetsuki | 0:baa08ea8b9ec | 24 | |
| Tetsuki | 0:baa08ea8b9ec | 25 | // stimulation mode |
| Tetsuki | 0:baa08ea8b9ec | 26 | #define DA_TEST 0xFA //sinusoidal wave mode to test DA |
| Tetsuki | 0:baa08ea8b9ec | 27 | |
| Tetsuki | 0:baa08ea8b9ec | 28 | int Mode = DA_TEST; |
| Tetsuki | 0:baa08ea8b9ec | 29 | |
| Tetsuki | 0:baa08ea8b9ec | 30 | const int ELECTRODE_NUM = 16; |
| Tetsuki | 0:baa08ea8b9ec | 31 | short stim_pattern[ELECTRODE_NUM] = { 0 }; |
| Tetsuki | 0:baa08ea8b9ec | 32 | short impedance[ELECTRODE_NUM] = { 0 }; |
| Tetsuki | 0:baa08ea8b9ec | 33 | |
| Tetsuki | 0:baa08ea8b9ec | 34 | Timer timer; |
| Tetsuki | 0:baa08ea8b9ec | 35 | |
| Tetsuki | 0:baa08ea8b9ec | 36 | bool AccessDeny = false; |
| Tetsuki | 0:baa08ea8b9ec | 37 | |
| Tetsuki | 0:baa08ea8b9ec | 38 | int i; |
| Tetsuki | 0:baa08ea8b9ec | 39 | int Freq = 100; |
| Tetsuki | 0:baa08ea8b9ec | 40 | int Voltage = 294; |
| Tetsuki | 0:baa08ea8b9ec | 41 | int TIME = 0; |
| Tetsuki | 0:baa08ea8b9ec | 42 | |
| Tetsuki | 0:baa08ea8b9ec | 43 | |
| Tetsuki | 0:baa08ea8b9ec | 44 | |
| Tetsuki | 0:baa08ea8b9ec | 45 | /******************************************************************************/ |
| Tetsuki | 0:baa08ea8b9ec | 46 | /* |
| Tetsuki | 0:baa08ea8b9ec | 47 | SN74LV595 Data Transfer |
| Tetsuki | 0:baa08ea8b9ec | 48 | 2 bits are required for 1 electrode. |
| Tetsuki | 0:baa08ea8b9ec | 49 | 00 OPEN |
| Tetsuki | 0:baa08ea8b9ec | 50 | 10 GND |
| Tetsuki | 0:baa08ea8b9ec | 51 | 01 HIGH |
| Tetsuki | 0:baa08ea8b9ec | 52 | 11 SHORT |
| Tetsuki | 0:baa08ea8b9ec | 53 | */ |
| Tetsuki | 0:baa08ea8b9ec | 54 | /******************************************************************************/ |
| Tetsuki | 0:baa08ea8b9ec | 55 | void SN74LV595FastScan(int usWhichPin) |
| Tetsuki | 0:baa08ea8b9ec | 56 | { |
| Tetsuki | 0:baa08ea8b9ec | 57 | int ii, pin; |
| Tetsuki | 0:baa08ea8b9ec | 58 | static int pos; |
| Tetsuki | 0:baa08ea8b9ec | 59 | |
| Tetsuki | 0:baa08ea8b9ec | 60 | SN74LV595_RCLK = 0; |
| Tetsuki | 0:baa08ea8b9ec | 61 | if (usWhichPin == 0) { //set 01(High) |
| Tetsuki | 0:baa08ea8b9ec | 62 | SN74LV595_DIN = 0; |
| Tetsuki | 0:baa08ea8b9ec | 63 | SN74LV595_CLK = 1; |
| Tetsuki | 0:baa08ea8b9ec | 64 | SN74LV595_CLK = 0; |
| Tetsuki | 0:baa08ea8b9ec | 65 | SN74LV595_DIN = 1; |
| Tetsuki | 0:baa08ea8b9ec | 66 | SN74LV595_CLK = 1; |
| Tetsuki | 0:baa08ea8b9ec | 67 | SN74LV595_CLK = 0; |
| Tetsuki | 0:baa08ea8b9ec | 68 | pos = 0; |
| Tetsuki | 0:baa08ea8b9ec | 69 | } |
| Tetsuki | 0:baa08ea8b9ec | 70 | else { |
| Tetsuki | 0:baa08ea8b9ec | 71 | pin = usWhichPin - pos; |
| Tetsuki | 0:baa08ea8b9ec | 72 | for (ii = 0; ii < pin; ii++) {//set 10 (GND) |
| Tetsuki | 0:baa08ea8b9ec | 73 | SN74LV595_DIN = 1; |
| Tetsuki | 0:baa08ea8b9ec | 74 | SN74LV595_CLK = 1; |
| Tetsuki | 0:baa08ea8b9ec | 75 | SN74LV595_CLK = 0; |
| Tetsuki | 0:baa08ea8b9ec | 76 | SN74LV595_DIN = 0; |
| Tetsuki | 0:baa08ea8b9ec | 77 | SN74LV595_CLK = 1; |
| Tetsuki | 0:baa08ea8b9ec | 78 | SN74LV595_CLK = 0; |
| Tetsuki | 0:baa08ea8b9ec | 79 | } |
| Tetsuki | 0:baa08ea8b9ec | 80 | pos = usWhichPin; |
| Tetsuki | 0:baa08ea8b9ec | 81 | } |
| Tetsuki | 0:baa08ea8b9ec | 82 | //Load S/R |
| Tetsuki | 0:baa08ea8b9ec | 83 | SN74LV595_RCLK = 1; |
| Tetsuki | 0:baa08ea8b9ec | 84 | SN74LV595_RCLK = 0; |
| Tetsuki | 0:baa08ea8b9ec | 85 | } |
| Tetsuki | 0:baa08ea8b9ec | 86 | |
| Tetsuki | 0:baa08ea8b9ec | 87 | /******************************************************************************/ |
| Tetsuki | 0:baa08ea8b9ec | 88 | /* |
| Tetsuki | 0:baa08ea8b9ec | 89 | SN74LV595 init & Clear |
| Tetsuki | 0:baa08ea8b9ec | 90 | */ |
| Tetsuki | 0:baa08ea8b9ec | 91 | /******************************************************************************/ |
| Tetsuki | 0:baa08ea8b9ec | 92 | void SN74LV595Clear() |
| Tetsuki | 0:baa08ea8b9ec | 93 | { |
| Tetsuki | 0:baa08ea8b9ec | 94 | SN74LV595_CLR = 0; |
| Tetsuki | 0:baa08ea8b9ec | 95 | SN74LV595_RCLK = 0; |
| Tetsuki | 0:baa08ea8b9ec | 96 | SN74LV595_CLK = 0; |
| Tetsuki | 0:baa08ea8b9ec | 97 | SN74LV595_CLK = 1; |
| Tetsuki | 0:baa08ea8b9ec | 98 | SN74LV595_CLK = 0; |
| Tetsuki | 0:baa08ea8b9ec | 99 | SN74LV595_CLR = 1; |
| Tetsuki | 0:baa08ea8b9ec | 100 | } |
| Tetsuki | 0:baa08ea8b9ec | 101 | |
| Tetsuki | 0:baa08ea8b9ec | 102 | void SN74LV595Init(int TotalPin) |
| Tetsuki | 0:baa08ea8b9ec | 103 | { |
| Tetsuki | 0:baa08ea8b9ec | 104 | int ii; |
| Tetsuki | 0:baa08ea8b9ec | 105 | |
| Tetsuki | 0:baa08ea8b9ec | 106 | SN74LV595_CLR = 1; |
| Tetsuki | 0:baa08ea8b9ec | 107 | SN74LV595_CLK = 0; |
| Tetsuki | 0:baa08ea8b9ec | 108 | SN74LV595_RCLK = 0; |
| Tetsuki | 0:baa08ea8b9ec | 109 | for (ii = 0; ii < TotalPin; ii++) { |
| Tetsuki | 0:baa08ea8b9ec | 110 | SN74LV595_DIN = 1; |
| Tetsuki | 0:baa08ea8b9ec | 111 | SN74LV595_CLK = 1; |
| Tetsuki | 0:baa08ea8b9ec | 112 | SN74LV595_CLK = 0; |
| Tetsuki | 0:baa08ea8b9ec | 113 | SN74LV595_DIN = 0; |
| Tetsuki | 0:baa08ea8b9ec | 114 | SN74LV595_CLK = 1; |
| Tetsuki | 0:baa08ea8b9ec | 115 | SN74LV595_CLK = 0; |
| Tetsuki | 0:baa08ea8b9ec | 116 | } |
| Tetsuki | 0:baa08ea8b9ec | 117 | //Load S/R |
| Tetsuki | 0:baa08ea8b9ec | 118 | SN74LV595_RCLK = 1; |
| Tetsuki | 0:baa08ea8b9ec | 119 | SN74LV595_RCLK = 0; |
| Tetsuki | 0:baa08ea8b9ec | 120 | } |
| Tetsuki | 0:baa08ea8b9ec | 121 | |
| Tetsuki | 0:baa08ea8b9ec | 122 | |
| Tetsuki | 0:baa08ea8b9ec | 123 | /******************************************************************************/ |
| Tetsuki | 0:baa08ea8b9ec | 124 | /* |
| Tetsuki | 0:baa08ea8b9ec | 125 | DA&AD at the same time, using the same SPI clock. |
| Tetsuki | 0:baa08ea8b9ec | 126 | DA output by AD5452(SPI) |
| Tetsuki | 0:baa08ea8b9ec | 127 | AD input by AD7276(SPI) |
| Tetsuki | 0:baa08ea8b9ec | 128 | */ |
| Tetsuki | 0:baa08ea8b9ec | 129 | /******************************************************************************/ |
| Tetsuki | 0:baa08ea8b9ec | 130 | |
| Tetsuki | 0:baa08ea8b9ec | 131 | short DAAD(short DA) |
| Tetsuki | 0:baa08ea8b9ec | 132 | { |
| Tetsuki | 0:baa08ea8b9ec | 133 | short AD; |
| Tetsuki | 0:baa08ea8b9ec | 134 | |
| Tetsuki | 0:baa08ea8b9ec | 135 | //enable |
| Tetsuki | 0:baa08ea8b9ec | 136 | DA_sync = 0; |
| Tetsuki | 0:baa08ea8b9ec | 137 | AD_cs = 0; |
| Tetsuki | 0:baa08ea8b9ec | 138 | //simultaneous DA and AD |
| Tetsuki | 0:baa08ea8b9ec | 139 | AD = spiDAAD.write(DA << 2); |
| Tetsuki | 0:baa08ea8b9ec | 140 | //disable |
| Tetsuki | 0:baa08ea8b9ec | 141 | DA_sync = 1; |
| Tetsuki | 0:baa08ea8b9ec | 142 | AD_cs = 1; |
| Tetsuki | 0:baa08ea8b9ec | 143 | |
| Tetsuki | 0:baa08ea8b9ec | 144 | return AD >> 2;//bottom 2bits are unnecessary |
| Tetsuki | 0:baa08ea8b9ec | 145 | } |
| Tetsuki | 0:baa08ea8b9ec | 146 | |
| Tetsuki | 0:baa08ea8b9ec | 147 | void DAADinit() |
| Tetsuki | 0:baa08ea8b9ec | 148 | { |
| Tetsuki | 0:baa08ea8b9ec | 149 | //Setup SPI, 16bit, falling edge, 48MHz clock |
| Tetsuki | 0:baa08ea8b9ec | 150 | spiDAAD.format(16, 2); |
| Tetsuki | 0:baa08ea8b9ec | 151 | spiDAAD.frequency(48000000); |
| Tetsuki | 0:baa08ea8b9ec | 152 | } |
| Tetsuki | 0:baa08ea8b9ec | 153 | |
| Tetsuki | 0:baa08ea8b9ec | 154 | |
| Tetsuki | 0:baa08ea8b9ec | 155 | int main() |
| Tetsuki | 0:baa08ea8b9ec | 156 | { |
| Tetsuki | 0:baa08ea8b9ec | 157 | double t=0.0; |
| Tetsuki | 0:baa08ea8b9ec | 158 | short AD; |
| Tetsuki | 0:baa08ea8b9ec | 159 | |
| Tetsuki | 0:baa08ea8b9ec | 160 | DAADinit(); |
| Tetsuki | 0:baa08ea8b9ec | 161 | SN74LV595Init(ELECTRODE_NUM); |
| Tetsuki | 0:baa08ea8b9ec | 162 | timer.start(); |
| Tetsuki | 0:baa08ea8b9ec | 163 | |
| Tetsuki | 0:baa08ea8b9ec | 164 | |
| Tetsuki | 0:baa08ea8b9ec | 165 | for (int t = 0; t < 8; t++) { |
| Tetsuki | 0:baa08ea8b9ec | 166 | myleds = 1 << (t % 4); |
| Tetsuki | 0:baa08ea8b9ec | 167 | wait(0.05); |
| Tetsuki | 0:baa08ea8b9ec | 168 | } |
| Tetsuki | 0:baa08ea8b9ec | 169 | myleds = 1; |
| Tetsuki | 0:baa08ea8b9ec | 170 | while(1){ |
| Tetsuki | 0:baa08ea8b9ec | 171 | |
| Tetsuki | 0:baa08ea8b9ec | 172 | t = (double)timer.read_us() * 0.000001; |
| Tetsuki | 0:baa08ea8b9ec | 173 | AD = DAAD((short)(Voltage * (1.0 + sin(2.0 * 3.1415926 * Freq * t)))); |
| Tetsuki | 0:baa08ea8b9ec | 174 | TIME = TIME +1; |
| Tetsuki | 0:baa08ea8b9ec | 175 | if{TIME>1000){ |
| Tetsuki | 0:baa08ea8b9ec | 176 | double Freqdevided1 = 100*(rand()%3)/ Freq;//出力時間 |
| Tetsuki | 0:baa08ea8b9ec | 177 | double Freqdevided2 = 10*(rand()%10);//待機時間は配列でランダム(?)化 |
| Tetsuki | 0:baa08ea8b9ec | 178 | double Freqint1 = floor(Freqdevided1);//整数化 |
| Tetsuki | 0:baa08ea8b9ec | 179 | double Freqint2 = floor(Freqdevided2); |
| Tetsuki | 0:baa08ea8b9ec | 180 | AD = DAAD(100*(3+rand()%3)); |
| Tetsuki | 0:baa08ea8b9ec | 181 | wait_ms(Freqint1); |
| Tetsuki | 0:baa08ea8b9ec | 182 | AD = DAAD(0); |
| Tetsuki | 0:baa08ea8b9ec | 183 | wait_ms(Freqint2); |
| Tetsuki | 0:baa08ea8b9ec | 184 | } |
| Tetsuki | 0:baa08ea8b9ec | 185 | } |
| Tetsuki | 0:baa08ea8b9ec | 186 | } |