Component Experiments

Simple Test of Optocoupler and IGBT

Simple test of new FGA50S110P and 6N136:



Original gEDA schematic

const int sensorPin = A0;
const int ledPin = 13;
const int sensorFactor = 5;
const int sensorLimit = 1024 >> sensorFactor;

void setup()
{
  pinMode (ledPin, OUTPUT);
}

void loop()
{  
  int sensorValue = analogRead (sensorPin) >> sensorFactor;

  digitalWrite (ledPin, HIGH);

  delay (sensorValue);

  digitalWrite (ledPin, LOW);

  delay (sensorLimit-sensorValue);
}


Using Current Amplifier for Gate


Original gEDA schematic

const int sensorPin = A0;
const int ledPin = 13;
const int sensorFactor = 5;
const int sensorLimit = 1024 >> sensorFactor;

const int TEMPLIMIT = 700;
const int TEMPSAFE = 600;

int sensorValue = 0;
int OverTemp = 0;

void setup()
{
  pinMode (ledPin, OUTPUT);

  Serial.begin (115200);
}

void loop()
{  
  int TempSensor = analogRead (A1);

  Serial.print (TempSensor);
  Serial.print ('\t');

  sensorValue = analogRead (sensorPin) >> sensorFactor;

  Serial.print (sensorValue);
  
  if (TempSensor < TEMPLIMIT && (!(OverTemp) || TempSensor < TEMPSAFE))
  {  
      digitalWrite (ledPin, HIGH);

      delay (sensorValue);

      digitalWrite (ledPin, LOW);

      delay (sensorLimit-sensorValue);
      
      OverTemp = 0;
  }
  else
  {
      digitalWrite (ledPin, LOW);
      
      OverTemp = 1;
  }
  
  Serial.print ('\n');
}


const int sensorPin = A0;
const int ledPin = 13;
const int sensorFactor = 5;
const int sensorLimit = 1024 >> sensorFactor;

const int TEMPLIMIT = 800;
const int TEMPHIGH = 750;
const int TEMPSAFE = 750;

int sensorValue = 0;
int OverTemp = 0;

void setup()
{
  pinMode (ledPin, OUTPUT);

  Serial.begin (115200);
}

void loop()
{  
  int TempSensor = analogRead (A1);

  Serial.print (TempSensor);
  Serial.print ('\t');

  sensorValue = analogRead (sensorPin) >> sensorFactor;
  
  if (TempSensor > TEMPHIGH)
  {
      sensorValue -= ((TempSensor - TEMPHIGH) >> 2);
      
      if (sensorValue < 0)
          OverTemp = 1;          
  }

  Serial.print (sensorValue);
  
  if (TempSensor < TEMPLIMIT && (!(OverTemp) || TempSensor < TEMPSAFE))
  {
      digitalWrite (ledPin, HIGH);

      delay (sensorValue);

      digitalWrite (ledPin, LOW);

      delay (sensorLimit-sensorValue);
      
      OverTemp = 0;
  }
  else
  {
      digitalWrite (ledPin, LOW);
      
      OverTemp = 1;
  }
  
  Serial.print ('\n');
}


Original gEDA schematic

  if (TempSensor < TEMPLIMIT && (!(OverTemp) || TempSensor < TEMPSAFE))
  {
      digitalWrite (ledPin, HIGH);

      delayMicroseconds (sensorValue);

      digitalWrite (ledPin, LOW);

      delayMicroseconds (sensorLimit-sensorValue);
      
      OverTemp = 0;
  }
  else
  {
      digitalWrite (ledPin, LOW);
      
      OverTemp = 1;
  }

Using Higher Gain Current Amplifier


Original gEDA schematic




Original gEDA schematic

const int TEMPLIMIT = 800;

const int CONTROLINPUT = A0;
const int TEMPINPUT    = A1;
const int MOTOROUTPUT  = 13;

const int TEMPHIGH    = 800;
const int TEMPSAFE    = 700;

int ControlInput = 0;
int TempInput = 0;
int MotorOutput = 0;
int TempHigh = 0;

void setup()
{
  Serial.begin(115200);
}

void loop()
{
  ControlInput = analogRead(CONTROLINPUT);
  TempInput = analogRead(TEMPINPUT);

  MotorOutput = map(ControlInput, 0, 1023, 0, 255);
  
  if (TempHigh)
  {
      if (TempInput < TEMPSAFE)
          TempHigh = 0;
          
      analogWrite(MOTOROUTPUT, 0);
  }
  else
  {
      if (TempInput > TEMPHIGH)
          TempHigh = 1;
          
      analogWrite(MOTOROUTPUT, MotorOutput);
  }

  Serial.print("ControlInput = " );
  Serial.print(ControlInput);
  Serial.print("\tTempInput = " );
  Serial.print(TempInput);
  Serial.print("\t MotorOutput = ");
  Serial.println(MotorOutput);

  delay(100);
}

ControlInput = 291	TempInput = 770	 MotorOutput = 72
ControlInput = 292	TempInput = 770	 MotorOutput = 72
ControlInput = 286	TempInput = 770	 MotorOutput = 71
ControlInput = 291	TempInput = 777	 MotorOutput = 72
ControlInput = 288	TempInput = 769	 MotorOutput = 71
ControlInput = 290	TempInput = 770	 MotorOutput = 72
ControlInput = 290	TempInput = 770	 MotorOutput = 72
ControlInput = 288	TempInput = 770	 MotorOutput = 71
ControlInput = 290	TempInput = 769	 MotorOutput = 72
ControlInput = 290	TempInput = 769	 MotorOutput = 72
ControlInput = 290	TempInput = 769	 MotorOutput = 72
ControlInput = 291	TempInput = 769	 MotorOutput = 72
ControlInput = 290	TempInput = 770	 MotorOutput = 72
ControlInput = 290	TempInput = 769	 MotorOutput = 72
ControlInput = 293	TempInput = 769	 MotorOutput = 73
ControlInput = 290	TempInput = 769	 MotorOutput = 72
ControlInput = 291	TempInput = 768	 MotorOutput = 72
ControlInput = 291	TempInput = 768	 MotorOutput = 72
ControlInput = 290	TempInput = 769	 MotorOutput = 72
ControlInput = 288	TempInput = 768	 MotorOutput = 71
ControlInput = 290	TempInput = 769	 MotorOutput = 72
ControlInput = 288	TempInput = 770	 MotorOutput = 71
ControlInput = 290	TempInput = 769	 MotorOutput = 72



Using Two NPN IGBTs in Push-Pull


Original gEDA schematic




Direct Coupling of the MCU


Original gEDA schematic




Original gEDA schematic
Thermister transfer plots for different lowside loads and linear approximations:

Original GNumeric Spreadsheet
const int CONTROLINPUT = A0;
const int TEMPINPUT    = A1;
const int MOTOROUTPUT  = 11;
const int MOTOROFF     = 255;

const int TEMPHIGH    = 450;
const int TEMPSAFE    = 370;

int ControlInput = 0;
int TempInput = 0;
int TempInC = 0;
int MotorOutput = 0;
int TempHigh = 0;

void setup()
{
  Serial.begin(115200);
  Serial.println("Grahams Motor Test, "__DATE__" ("__TIME__")");
}

void loop()
{
  ControlInput = analogRead(CONTROLINPUT);
  TempInput = analogRead(TEMPINPUT);
  
// For 1k lowside: 45C < Temp ~ +-1C < 112C
  TempInC = (TempInput * 10 / 76) + 21;
  
  if (TempInput < TEMPSAFE)
      TempHigh = 0;
  
  if (TempInput > TEMPHIGH)
      TempHigh = 1;

  MotorOutput = ControlInput >> 2;
          
  if (TempHigh)
      analogWrite(MOTOROUTPUT, MOTOROFF);
  else
      analogWrite(MOTOROUTPUT, MotorOutput);

  Serial.print("ControlInput = " );
  Serial.print(ControlInput);
  Serial.print("\tTempInput = " );
  Serial.print(TempInput);
  Serial.print("(");
  Serial.print(TempInC);
  Serial.print("C)\tMotorOutput = ");
  Serial.println(MotorOutput);

  delay(100);
}
Grahams Motor Test, Apr 20 2016 (12:12:09)
ControlInput = 892	TempInput = 165(42C)	MotorOutput = 223
ControlInput = 891	TempInput = 165(42C)	MotorOutput = 222
ControlInput = 891	TempInput = 166(42C)	MotorOutput = 222
ControlInput = 892	TempInput = 165(42C)	MotorOutput = 223
ControlInput = 891	TempInput = 165(42C)	MotorOutput = 222
ControlInput = 892	TempInput = 162(42C)	MotorOutput = 223
ControlInput = 891	TempInput = 165(42C)	MotorOutput = 222
ControlInput = 891	TempInput = 165(42C)	MotorOutput = 222
ControlInput = 891	TempInput = 165(42C)	MotorOutput = 222
ControlInput = 892	TempInput = 164(42C)	MotorOutput = 223
ControlInput = 891	TempInput = 165(42C)	MotorOutput = 222
ControlInput = 892	TempInput = 164(42C)	MotorOutput = 223
ControlInput = 891	TempInput = 160(42C)	MotorOutput = 222
ControlInput = 891	TempInput = 164(42C)	MotorOutput = 222
ControlInput = 891	TempInput = 164(42C)	MotorOutput = 222
ControlInput = 891	TempInput = 166(42C)	MotorOutput = 222
ControlInput = 891	TempInput = 164(42C)	MotorOutput = 222
ControlInput = 891	TempInput = 165(42C)	MotorOutput = 222
ControlInput = 891	TempInput = 155(41C)	MotorOutput = 222
ControlInput = 891	TempInput = 165(42C)	MotorOutput = 222
ControlInput = 892	TempInput = 164(42C)	MotorOutput = 223
ControlInput = 892	TempInput = 165(42C)	MotorOutput = 223
ControlInput = 891	TempInput = 165(42C)	MotorOutput = 222



Rise time about 10uS:

Fall time about 10uS:

Someone from the Arduino Community has coded a conversion algorithm for the thermistor setup used above [link].
A comparison graph for different low-side resistors against the ND03N00103J is here:

This verifies the use of the 1k low-side (cyan) and means we can now refine the temperature readings.

High Side


Original gEDA schematic




Low Side


Original gEDA schematic




Original gEDA schematic

Gate charging with a current source


Original gEDA schematic




Original gEDA schematic

Rise time in the order of 10uS:

Fall time in the order of 1uS:

Adding current amplifier for gate


Original gEDA schematic




Original gEDA schematic

Original inkscape drawing




Rise time is about 4uS:

Fall time is about 500nS:

Continued on Controller Software, Modelling and Tuning and Field Control


Latest version of DueTest.cpp:



MicroChip Driver IC

Sourced a new driver chip made by Microchip:



Constructed a simple test to see if it works.


Original gEDA schematic

Seems to work quite well.
Below is a test as 62.5kHz.


TIME:2uS/div, Blue:TP1(2vDC/div), Red:TP2(4vDC/div), Green:TP3(10vCD/div).

..and tested with 320A IGBT (IXGN320N60A3)


TIME:2uS/div, Blue:TP1(2vDC/div), Red:TP2(4vDC/div), Green:TP3(10vDC/div).

From these test it seems the driver chip is working in the nanosecond switching range with the low power motor switching within a microsecond too.

Short switch testing shows we can have sub-microsecond PWM mark and space.


TIME:500nS/div, Blue:TP1(2vDC/div), Red:TP2(4vDC/div), Green:TP3(10vDC/div).


TIME:500nS/div, Blue:TP1(2vDC/div), Red:TP2(4vDC/div), Green:TP3(10vDC/div).

Seems to work OK until a low frequency PWM is used.
This show the switch to space at 30Hz:


TIME:200nS/div, Blue:TP1(2vDC/div), Red:TP2(10vDC/div), Green:TP3(40vDC/div), Orange:Gate(10vDC/div).

At higher frequencies (4kHz) the signal is much better:


TIME:200nS/div, Blue:TP1(2vDC/div), Red:TP2(10vDC/div), Green:TP3(40vDC/div), Orange:Gate(10vDC/div).

Unfortunately, this voltage spike (+30v/-50v, above) on the gate is beyond the specification of the IGBT (+-20v), which causes it to blow.

Adding a Schottky parallel diode (D3) makes quite a difference.
Also gate resistor of 11R and a gate discharge diode were added so the turn on times were extended.


Original gEDA schematic


TIME:200nS/div, Blue:TP1(2vDC/div), Orange:TP2(10vDC/div), Red:TP3(10vDC/div), Green:TP4(40vDC/div).

It seems D3 is just accounting for the long wires connecting the gate circuit.



So these were shortened and the result was also better (without D3).




Original gEDA schematic


TIME:200nS/div, Blue:TP1(2vDC/div), Orange:TP2(10vDC/div), Red:TP3(10vDC/div), Green:TP4(40vDC/div).

And now we have success with the high power IGBT.


Original gEDA schematic



This is minimum mark:


TIME:500nS/div, Blue:TP1(2vDC/div), Orange:TP2(10vDC/div), Red:TP3(10vDC/div), Green:TP4(200vDC/div).

This is with more (about 5%) mark:


TIME:500nS/div, Blue:TP1(2vDC/div), Orange:TP2(10vDC/div), Red:TP3(10vDC/div), Green:TP4(200vDC/div).

It's still not perfect as the gate is being taken up to +50vDC (on a 12vDC motor) for about 10nS with higher mark, but at least the IGBT is working stably.

Testing at 30Hz PWM frequency on the milk float motor on 4 x 12v/80Ah batteries



Minimum mark:

TIME:500nS/div, Blue:TP1(2vDC/div), Red:TP4(200vDC/div).

Spinning up:

TIME:500nS/div, Blue:TP1(2vDC/div), Red:TP4(200vDC/div).

This is probably cleaner as the the milk float motor is series wound and has no permanent magnets.

Peak current during testing 92.9 amps:


The main cause of this has to be RF feedback as it's affecting the MCU output signal.
Adding some shielding will probably stop this.


Trinary 3-Phase

Now the basic power testing shows it'll work, the testing moves to the patent 3-phase trinary controller.

UnoBLDC.cpp

static const char Trinary[][TRITS+1] = {
    "++-",
    "+ -",
    "+--",
    "+- ",
    "+-+",
    " -+",
    "--+",
    "- +",
    "-++",
    "-+ ",
    "-+-",
    " +-" 
};


Original gEDA schematic


TIME:500uS/div, Blue:TP1(1vDC/div), Brown:TP2(1vDC/div), Green:TP3(1vDC/div).

The trimmers were set to arbitrarily offset the open-circuit states so we can see them.
Also the mark and space were just short and equal so we can see the switching.

Just to see the transitions of a single channel (blue trace), from high to off then low, off and back to high

TIME:50uS/div, Blue(2vDC/div), Red(2vDC/div), Green(10vDC/div), Yellow(10vDC/div).
Off to low:

TIME:200nS/div, Blue(2vDC/div), Red(2vDC/div), Green(10vDC/div), Yellow(10vDC/div).
Low to off:

TIME:200nS/div, Blue(2vDC/div), Red(2vDC/div), Green(10vDC/div), Yellow(10vDC/div).
Off to high:

TIME:200nS/div, Blue(2vDC/div), Red(2vDC/div), Green(10vDC/div), Yellow(10vDC/div).
High to off:

TIME:200nS/div, Blue(2vDC/div), Red(2vDC/div), Green(10vDC/div), Yellow(10vDC/div).

Simple PWM testing

Using a single channel:


Original gEDA schematic


TIME:500uS/div, Blue:TP1(2vDC/div), Brown:TP2(2vDC/div).

TIME:100nS/div, Blue:TP1(2vDC/div), Brown:TP2(2vDC/div).

TIME:100nS/div, Blue:TP1(2vDC/div), Brown:TP2(2vDC/div).

IGBT testing:


Original gEDA schematic


TIME:1mS/div, Blue:TP1(2vDC/div), Brown:TP2(4vDC/div).

TIME:1uS/div, Blue:TP1(2vDC/div), Brown:TP2(4vDC/div).

TIME:1uS/div, Blue:TP1(2vDC/div), Brown:TP2(4vDC/div).

Low side:


Original gEDA schematic


TIME:50uS/div, Blue:TP1(2vDC/div), Red:TP2(2vDC/div), Green:TP3(10vDC/div), Yellow:TP4(10vDC/div).

TIME:1uS/div, Blue:TP1(2vDC/div), Red:TP2(2vDC/div), Green:TP3(10vDC/div), Yellow:TP4(10vDC/div).

TIME:1uS/div, Blue:TP1(2vDC/div), Red:TP2(2vDC/div), Green:TP3(10vDC/div), Yellow:TP4(10vDC/div).

High side:


Original gEDA schematic


Electromagnets

Since a new patent motor is being designed this needs some research into inductors and magnetic circuitry.

Some preliminary research shows that the most powerful magnets for the same volume are electromagnets.
Also the copper in an electromagnet is much cheaper and easier to use than cobalt or neodymium, and far more environmentally friendly.

It is possible, and the subject of more research, that a motor using an electromagnetic exciter
would be less efficient than one made from permanent magnets.

	Volts	Current	Ohms		
air	0.822	3	0.274		-0.002
	1.14	4.2	0.271		0.001
	1.52	5.6	0.271	0.272	0.001
bar	0.833	3.2	0.260		0.007
	1.17	4.3	0.272		-0.005
	1.54	5.7	0.270	0.268	-0.003
					
air	5.1	4.8	1.063		0.016
	4.3	3.9	1.103		-0.024
	3.45	3.2	1.078		0.001
	2.55	2.4	1.063		0.016
	1.85	1.7	1.088	1.079	-0.009
bar	1.85	1.7	1.088		0.044
	2.6	2.3	1.130		0.002
	3.49	3.1	1.126		0.006
	4.37	3.8	1.150		-0.018
	5.25	4.5	1.167	1.132	-0.034
Original GNumeric spreadsheet