6243_ASIC PCB code as of 02092016

Dependencies:   USBDevice mbed

Committer:
adambalkan
Date:
Fri Sep 02 06:56:13 2016 +0000
Revision:
0:dfbf890fb03a
6243 ASIC PCB code, as of 02092016

Who changed what in which revision?

UserRevisionLine numberNew contents of line
adambalkan 0:dfbf890fb03a 1 #include "mbed.h"
adambalkan 0:dfbf890fb03a 2 #include "USBSerial.h"
adambalkan 0:dfbf890fb03a 3
adambalkan 0:dfbf890fb03a 4 USBSerial pc;
adambalkan 0:dfbf890fb03a 5
adambalkan 0:dfbf890fb03a 6 DigitalOut ASIC_CS(P0_2);
adambalkan 0:dfbf890fb03a 7 DigitalOut DAC_CS(P1_26);
adambalkan 0:dfbf890fb03a 8 DigitalOut DAC_LDAC(P1_14);
adambalkan 0:dfbf890fb03a 9 DigitalOut DAC_SHDN(P1_15);
adambalkan 0:dfbf890fb03a 10 DigitalInOut PD_CHA(P0_21);
adambalkan 0:dfbf890fb03a 11
adambalkan 0:dfbf890fb03a 12
adambalkan 0:dfbf890fb03a 13 AnalogIn DAC_OUT_A(P0_11);
adambalkan 0:dfbf890fb03a 14 AnalogIn DAC_OUT_B(P0_12);
adambalkan 0:dfbf890fb03a 15 AnalogIn OUT_N(P0_13);
adambalkan 0:dfbf890fb03a 16 AnalogIn OUT_P(P0_14);
adambalkan 0:dfbf890fb03a 17 AnalogIn BG_BUF(P0_15);
adambalkan 0:dfbf890fb03a 18 AnalogIn PHOTO_DIODE(P0_22);
adambalkan 0:dfbf890fb03a 19
adambalkan 0:dfbf890fb03a 20 PwmOut SWITCH(P1_24); // shorts the op-amp feedback network when high 24
adambalkan 0:dfbf890fb03a 21 //PwmOut EXTCLK(P1_25); // can be used to apply an external clock to the ASIC if needed (need to solder to P0_20 (if actually required) due to mistake)
adambalkan 0:dfbf890fb03a 22
adambalkan 0:dfbf890fb03a 23 SPI ASIC(P0_9, P0_8, P1_29);//MOSI, MISO, SCLK
adambalkan 0:dfbf890fb03a 24 SPI DAC(P1_22, P1_21, P1_20);// MOSI, MISO, SCLK
adambalkan 0:dfbf890fb03a 25
adambalkan 0:dfbf890fb03a 26 int ASIC_SPI_REGISTER;
adambalkan 0:dfbf890fb03a 27 char command, p1, p2, p3, p4;
adambalkan 0:dfbf890fb03a 28 void variable_defaults()
adambalkan 0:dfbf890fb03a 29 {
adambalkan 0:dfbf890fb03a 30 ASIC_SPI_REGISTER = (0x0000);
adambalkan 0:dfbf890fb03a 31 ASIC_CS=1;
adambalkan 0:dfbf890fb03a 32 DAC_CS=1;
adambalkan 0:dfbf890fb03a 33 DAC_LDAC=0;
adambalkan 0:dfbf890fb03a 34 DAC_SHDN=0; //Disable DAC
adambalkan 0:dfbf890fb03a 35 PD_CHA.input();
adambalkan 0:dfbf890fb03a 36 PD_CHA.mode(PullNone);
adambalkan 0:dfbf890fb03a 37 }
adambalkan 0:dfbf890fb03a 38
adambalkan 0:dfbf890fb03a 39 void connect_PD_CHA(int value)//connect power down and drive to value
adambalkan 0:dfbf890fb03a 40 {
adambalkan 0:dfbf890fb03a 41 PD_CHA.output();
adambalkan 0:dfbf890fb03a 42 PD_CHA = value;
adambalkan 0:dfbf890fb03a 43 }
adambalkan 0:dfbf890fb03a 44
adambalkan 0:dfbf890fb03a 45 void disable_DAC()
adambalkan 0:dfbf890fb03a 46 {
adambalkan 0:dfbf890fb03a 47 DAC_SHDN=0;
adambalkan 0:dfbf890fb03a 48 }
adambalkan 0:dfbf890fb03a 49
adambalkan 0:dfbf890fb03a 50 void disconnect_PD_CHA()
adambalkan 0:dfbf890fb03a 51 {
adambalkan 0:dfbf890fb03a 52 PD_CHA.input();
adambalkan 0:dfbf890fb03a 53 PD_CHA.mode(PullNone);
adambalkan 0:dfbf890fb03a 54 }
adambalkan 0:dfbf890fb03a 55
adambalkan 0:dfbf890fb03a 56 int Set_DAC_A(int desired_value_A) // sets the value of MCP4922 DAC channel A
adambalkan 0:dfbf890fb03a 57 {
adambalkan 0:dfbf890fb03a 58 // int desired_value_A = (voutA/3.3)*4096;
adambalkan 0:dfbf890fb03a 59 DAC_SHDN=1; //Enable DAC
adambalkan 0:dfbf890fb03a 60 char command_register_msb = (0x70);// 01110000 for DAC A, BUF, Gain =1 and no shutdown
adambalkan 0:dfbf890fb03a 61 command_register_msb = ((command_register_msb)|desired_value_A>>8); // assign first 4 bits to first byte to send
adambalkan 0:dfbf890fb03a 62 char command_register_lsb = desired_value_A; // assign last 8 bits to second byte to send
adambalkan 0:dfbf890fb03a 63 DAC_CS =0; // bring CS low
adambalkan 0:dfbf890fb03a 64 int junk= DAC.write(command_register_msb); // write first byte
adambalkan 0:dfbf890fb03a 65 junk= DAC.write(command_register_lsb); // write second byte
adambalkan 0:dfbf890fb03a 66 DAC_CS=1; // De-select device
adambalkan 0:dfbf890fb03a 67 return 1;
adambalkan 0:dfbf890fb03a 68 }
adambalkan 0:dfbf890fb03a 69
adambalkan 0:dfbf890fb03a 70 int Set_DAC_B(int desired_value_B) // sets the value of MCP4922 DAC channel B
adambalkan 0:dfbf890fb03a 71 {
adambalkan 0:dfbf890fb03a 72 // int desired_value_B = (voutB/3.3)*4096;
adambalkan 0:dfbf890fb03a 73 DAC_SHDN=1; //Enable DAC
adambalkan 0:dfbf890fb03a 74 char command_register_msb = (0xF0);// 11110000 for DAC B, BUF, Gain =1 and no shutdown
adambalkan 0:dfbf890fb03a 75 command_register_msb = ((command_register_msb)|desired_value_B>>8); // assign first 4 bits to first byte to send
adambalkan 0:dfbf890fb03a 76 char command_register_lsb = desired_value_B; // assign last 8 bits to second byte to send
adambalkan 0:dfbf890fb03a 77 DAC_CS =0; // bring CS low
adambalkan 0:dfbf890fb03a 78 int junk= DAC.write(command_register_msb); // write first byte
adambalkan 0:dfbf890fb03a 79 junk= DAC.write(command_register_lsb); // write second byte
adambalkan 0:dfbf890fb03a 80 DAC_CS=1; // De-select device
adambalkan 0:dfbf890fb03a 81 return 1;
adambalkan 0:dfbf890fb03a 82 }
adambalkan 0:dfbf890fb03a 83
adambalkan 0:dfbf890fb03a 84 void Send_ASIC_SPI(char to_send)
adambalkan 0:dfbf890fb03a 85 {
adambalkan 0:dfbf890fb03a 86 ASIC_CS=0;
adambalkan 0:dfbf890fb03a 87 int junk = ASIC.write(to_send);
adambalkan 0:dfbf890fb03a 88 ASIC_CS=1;
adambalkan 0:dfbf890fb03a 89 }
adambalkan 0:dfbf890fb03a 90
adambalkan 0:dfbf890fb03a 91 void ExternalClock(float duty_cycle, int period_us)
adambalkan 0:dfbf890fb03a 92 {
adambalkan 0:dfbf890fb03a 93 //EXTCLK.write(duty_cycle);
adambalkan 0:dfbf890fb03a 94 // EXTCLK.period_us(period_us);
adambalkan 0:dfbf890fb03a 95 }
adambalkan 0:dfbf890fb03a 96
adambalkan 0:dfbf890fb03a 97 void SWITCH_SET(float duty_cycle, int period_us)
adambalkan 0:dfbf890fb03a 98 {
adambalkan 0:dfbf890fb03a 99 SWITCH.write(duty_cycle);
adambalkan 0:dfbf890fb03a 100 SWITCH.period_us(period_us);
adambalkan 0:dfbf890fb03a 101 }
adambalkan 0:dfbf890fb03a 102
adambalkan 0:dfbf890fb03a 103 int main() {
adambalkan 0:dfbf890fb03a 104 variable_defaults();
adambalkan 0:dfbf890fb03a 105 Set_DAC_A(0);
adambalkan 0:dfbf890fb03a 106 Set_DAC_B(0);
adambalkan 0:dfbf890fb03a 107 ExternalClock(0.0, 1000);
adambalkan 0:dfbf890fb03a 108 SWITCH_SET(10,255);
adambalkan 0:dfbf890fb03a 109 ASIC.format(8, 1);// the ASIC should operate in SPI mode 1
adambalkan 0:dfbf890fb03a 110 // PHOTODIODE.mode(PullNone);
adambalkan 0:dfbf890fb03a 111 while(1) {
adambalkan 0:dfbf890fb03a 112 if (pc.readable()){
adambalkan 0:dfbf890fb03a 113 command = pc.getc(); // Data from PC (command)
adambalkan 0:dfbf890fb03a 114 p1 = pc.getc(); // Data from PC (param p1)
adambalkan 0:dfbf890fb03a 115 p2 = pc.getc(); // Data from PC (param p2)
adambalkan 0:dfbf890fb03a 116 p3 = pc.getc(); // Data from PC (param p2)
adambalkan 0:dfbf890fb03a 117 p4 = pc.getc(); // Data from PC (param p2)
adambalkan 0:dfbf890fb03a 118 int scrap = pc.getc(); // Carriage Return
adambalkan 0:dfbf890fb03a 119
adambalkan 0:dfbf890fb03a 120 if (command=='A') // update ASIC SPI REGISTER
adambalkan 0:dfbf890fb03a 121 {
adambalkan 0:dfbf890fb03a 122 ASIC_SPI_REGISTER=0x0000; //clear register
adambalkan 0:dfbf890fb03a 123 ASIC_SPI_REGISTER = ASIC_SPI_REGISTER|p2<<16;
adambalkan 0:dfbf890fb03a 124 ASIC_SPI_REGISTER = ASIC_SPI_REGISTER|p3<<8;
adambalkan 0:dfbf890fb03a 125 ASIC_SPI_REGISTER = ASIC_SPI_REGISTER|p4;
adambalkan 0:dfbf890fb03a 126 Send_ASIC_SPI((p2));
adambalkan 0:dfbf890fb03a 127 Send_ASIC_SPI((p3));
adambalkan 0:dfbf890fb03a 128 Send_ASIC_SPI((p4));
adambalkan 0:dfbf890fb03a 129 // pc.printf("%d\n",ASIC_SPI_REGISTER);
adambalkan 0:dfbf890fb03a 130 // pc.printf("%d\n",0xff&(ASIC_SPI_REGISTER>>16));
adambalkan 0:dfbf890fb03a 131 // pc.printf("%d\n",0xff&(ASIC_SPI_REGISTER>>8));
adambalkan 0:dfbf890fb03a 132 // pc.printf("%d\n",0xff&(ASIC_SPI_REGISTER));
adambalkan 0:dfbf890fb03a 133 }
adambalkan 0:dfbf890fb03a 134 else if (command=='a') // set vouta of DAC
adambalkan 0:dfbf890fb03a 135 {
adambalkan 0:dfbf890fb03a 136 int desired_value = ((0x0f)&p3)<<8;
adambalkan 0:dfbf890fb03a 137 desired_value = desired_value|p4;
adambalkan 0:dfbf890fb03a 138 Set_DAC_A(desired_value);
adambalkan 0:dfbf890fb03a 139 // pc.printf("%d\n",desired_value);
adambalkan 0:dfbf890fb03a 140 }
adambalkan 0:dfbf890fb03a 141 else if (command=='b') // set voutb of DAC
adambalkan 0:dfbf890fb03a 142 {
adambalkan 0:dfbf890fb03a 143 int desired_value = ((0x0f)&p3)<<8;
adambalkan 0:dfbf890fb03a 144 desired_value = desired_value|p4;
adambalkan 0:dfbf890fb03a 145 Set_DAC_B(desired_value);
adambalkan 0:dfbf890fb03a 146 }
adambalkan 0:dfbf890fb03a 147 else if(command=='C')// read all analog inputs
adambalkan 0:dfbf890fb03a 148 {
adambalkan 0:dfbf890fb03a 149 pc.printf("%f,%f,%f,%f,%f,%f\n", DAC_OUT_A.read(), DAC_OUT_B.read(), OUT_N.read(), OUT_P.read(), BG_BUF.read(), PHOTO_DIODE.read());
adambalkan 0:dfbf890fb03a 150 }
adambalkan 0:dfbf890fb03a 151 else if(command=='K')// set external clock
adambalkan 0:dfbf890fb03a 152 {
adambalkan 0:dfbf890fb03a 153 // float duty_cycle = (float)p3/ (float)256; // duty cycle
adambalkan 0:dfbf890fb03a 154 // int period_us = p4; //period in microseconds
adambalkan 0:dfbf890fb03a 155 // ExternalClock(duty_cycle, period_us);
adambalkan 0:dfbf890fb03a 156 // pc.printf("%f, %d, %d, %d, %d, %d\n", duty_cycle, period_us, p1, p2, p3, p4);
adambalkan 0:dfbf890fb03a 157 }
adambalkan 0:dfbf890fb03a 158 else if(command=='S')// set switching settings
adambalkan 0:dfbf890fb03a 159 {
adambalkan 0:dfbf890fb03a 160 float duty_cycle = (float)p3/ (float)256; // duty cycle
adambalkan 0:dfbf890fb03a 161 int period_us = p4; //period in microseconds
adambalkan 0:dfbf890fb03a 162 SWITCH_SET(duty_cycle, period_us);
adambalkan 0:dfbf890fb03a 163 // pc.printf("%f, %d\n", duty_cycle, period_us);
adambalkan 0:dfbf890fb03a 164 // pc.printf("%f, %d, %d, %d, %d, %d\n", duty_cycle, period_us, p1, p2, p3, p4);
adambalkan 0:dfbf890fb03a 165 }
adambalkan 0:dfbf890fb03a 166 else if(command=='P')
adambalkan 0:dfbf890fb03a 167 {
adambalkan 0:dfbf890fb03a 168 connect_PD_CHA(1);
adambalkan 0:dfbf890fb03a 169 }
adambalkan 0:dfbf890fb03a 170 else if(command=='p')
adambalkan 0:dfbf890fb03a 171 {
adambalkan 0:dfbf890fb03a 172 connect_PD_CHA(0);
adambalkan 0:dfbf890fb03a 173 }
adambalkan 0:dfbf890fb03a 174 else if(command=='O')
adambalkan 0:dfbf890fb03a 175 {
adambalkan 0:dfbf890fb03a 176 disconnect_PD_CHA();
adambalkan 0:dfbf890fb03a 177 }
adambalkan 0:dfbf890fb03a 178 else if(command=='d')
adambalkan 0:dfbf890fb03a 179 {
adambalkan 0:dfbf890fb03a 180 disable_DAC();
adambalkan 0:dfbf890fb03a 181 }
adambalkan 0:dfbf890fb03a 182 }
adambalkan 0:dfbf890fb03a 183 }
adambalkan 0:dfbf890fb03a 184 }