Tetsuki Fukuda / Mbed 2 deprecated Red_Tansan_Only2

Dependencies:   mbed

Committer:
Tetsuki
Date:
Tue Mar 16 08:24:53 2021 +0000
Revision:
0:baa08ea8b9ec
Red Tansan Only

Who changed what in which revision?

UserRevisionLine numberNew 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 }