// ///////////////////////////////////////////////////////////// /* * ARDUINO TRANSITOR CURVE TRACER "TANACHAI" https://www.changpuak.ch/electronics/Arduino-Shield-TANACHAI.php Software Version 1.0, USED FOR BC141-16 09.05.2016, Alexander C. Frank */ // ///////////////////////////////////////////////////////////// // GLOBAL LIMITS BY DESIGN // = GainDAC * GainOpamp * Reference, Millivolt const unsigned int MaxVoltA = 27034 ; const unsigned int MaxVoltB = 27034 ; unsigned int Voltage ; unsigned int Current ; unsigned int StartIB = 650; // 0 uA * 27 kR + 0.65V = 0.65V = 650 mV unsigned int StopIB = 14150; // 500 uA * 27 kR + 0.65V = 2V = 2'000 mV unsigned int StepIB = 3375; // 3.375 V / 27 kR = 125 uA unsigned int StartUC = 0; unsigned int StopUC = 10000; // 10'000 mV = 10V unsigned int StepUC = 100; // 100 mV float MaxPower = 2000 ; // mW float Power ; float aux; float I ; // DAC PINs int CS = 11; int SCLK = 12; int SDAT = 13; int LOAD = 10; // ///////////////////////////////////////////////////////////// void Info() { Serial.println("\nARDUINO TRANSISTOR CURVE TRACER 'TANACHAI'"); Serial.println("V3.0, (UNO + SPREADSHEET) 24.05.2016, BY CHANGPUAK.CH"); Serial.println("FOR THREE PORT DEVICES LIKE NPNs, ..."); } // ///////////////////////////////////////////////////////////// void SET_DAC_A(unsigned int VoltageA) { unsigned int pointer = 0x8000; if (VoltageA > MaxVoltA) VoltageA = MaxVoltA; // NO NEED TO CHANGE LINE BELOW, AS DAC's WITH LESS BITS IGNORE THE LSB's unsigned int DACA = (int)( VoltageA * pow(2, 12) / MaxVoltA ); DACA |= 0x1000; // GAIN = 2, DON'T SLEEP, Write to DACA digitalWrite(CS, LOW); for (int i=0; i < 16; i++) { if ((DACA & pointer) > 0) { digitalWrite(SDAT, HIGH); } else { digitalWrite(SDAT, LOW); } digitalWrite(SCLK, HIGH); digitalWrite(SCLK, LOW); pointer = pointer >> 1; } digitalWrite(CS, HIGH); digitalWrite(LOAD, LOW); digitalWrite(LOAD, HIGH); } // ///////////////////////////////////////////////////////////// void SET_DAC_B(unsigned int VoltageB) { unsigned int pointer = 0x8000; if (VoltageB > MaxVoltB) VoltageB = MaxVoltB; // NO NEED TO CHANGE LINE BELOW, AS DAC's WITH LESS BITS IGNORE THE LSB's unsigned int DACB = (int)( VoltageB * pow(2, 12) / MaxVoltB ); DACB |= 0x9000 ; // GAIN = 2, DON'T SLEEP, Write to DACB digitalWrite(CS, LOW); for (int i=0; i < 16; i++) { if ((DACB & pointer) > 0) { digitalWrite(SDAT, HIGH); } else { digitalWrite(SDAT, LOW); } digitalWrite(SCLK, HIGH); digitalWrite(SCLK, LOW); pointer = pointer >> 1; } digitalWrite(CS, HIGH); digitalWrite(LOAD, LOW); digitalWrite(LOAD, HIGH); } // ///////////////////////////////////////////////////////////// void setup() { Serial.begin(9600); pinMode(CS, OUTPUT); pinMode(SDAT, OUTPUT); pinMode(SCLK, OUTPUT); pinMode(LOAD, OUTPUT); digitalWrite(CS, HIGH); digitalWrite(SDAT, LOW); digitalWrite(SCLK, LOW); digitalWrite(LOAD, HIGH); // RUN THE SWEEP ONCE Info(); // TITLE Serial.println("VOLT, ICE@IB=...\n"); for (unsigned int j = StartUC; j <= StopUC; j += StepUC){ SET_DAC_A(j) ; aux = j * 0.001 ; Serial.print(aux,3); Serial.print(","); for (unsigned int i = StartIB; i <= StopIB; i += StepIB){ SET_DAC_B(i) ; delay(5); Current = 0; for (int k=0; k<64; k++) { Current = Current + analogRead(A0); delay(1); } aux = 5000.0 * Current / ( 64.0 * 1024.0 * 48.0 ); Serial.print(aux,3); Serial.print(","); // OVERLOAD PROTECTION, POWER SUPPLY DELIVERS 33 V Power = (float)(33000 - j) * aux * 0.001 ; // Serial.print(" , ");Serial.println(Power); if (Power > MaxPower) break ; } Serial.print("\n"); } SET_DAC_A(0) ; SET_DAC_B(0) ; } // ///////////////////////////////////////////////////////////// void loop() { // MACH MAL PAUSE :-) } // ///////////////////////////////////////////////////////////// // END OF FILE. // /////////////////////////////////////////////////////////////