Infineon DC Motor Shield w/ TLE94112EL for Arduino - Review

Table of contents

RoadTest: Infineon DC Motor Shield w/ TLE94112EL for Arduino

Author: geralds

Creation date:

Evaluation Type: Evaluation Boards

Did you receive all parts the manufacturer stated would be included in the package?: True

What other parts do you consider comparable to this product?: -

What were the biggest problems encountered?: There was no big problems, but a bit more information about the TLE94112EL Arduino shield on the web site would be fine. Also a bit more application notes, e.g. software routines would be nice. But ok, i found all what i need for the application.

Detailed Review:

Dear suppliers, Dear Randall,

Thank you very much for selecting me for participate to this RoadTest.

 

1.) The TLE94112EL motor controller is a fine IC with that you can drive many kinds of motors or inductive loads also resistive loads, e.g. power LEDs with two channels.

For my projects, this device will be one of favorites in many applications what I've planned.

Ok, this device is defined for the automotive application, but I will use it in the household in household appliances as well.

So also in extended temperature or climate conditions should be noticed. - ok-

 

Here are my first impressions, with that comments:

Blister packs... receiving the modules:

https://www.element14.com/community/roadTests/1760/l/infineon-dc-motor-shield-w-tle94112el-for-arduino#start=25

 

Installing the software - IDE, demo source, brief about the motors:

https://www.element14.com/community/roadTests/1760/l/infineon-dc-motor-shield-w-tle94112el-for-arduino#start=50

 

Hello world - the motor driver works, there is the first video which shows the first switch on:

https://www.element14.com/community/roadTests/1760/l/infineon-dc-motor-shield-w-tle94112el-for-arduino#comment-108760

 

The motor:

PMDC motor 12V, 70mA without load; <1A by blocking the motor.

The manufacturer: http://www.jp-igarashi.com/en/productssearch/index.php/search?cell018=&cell019=&cell031=1

The type of my motor is a bit older than there are shown on that website.

https://www.element14.com/community/servlet/JiveServlet/downloadImage/105-109293-423924/674-900/dc-motor-servo.gif

 

The TLE94112EL:

This device can drive up to eleven motors, wow, fine.

With the Arduino shield i used only two motors: first for all tests i did, second was used just for cooling the TLE94112EL itself, ...."may be..." - i have just this only module.

 

imageimage

 

Attached there is the Eagle lbr file of the TLE94112EL. Because in the library file was some mistakes I've modified it a bit.

 

I used the demo file from Infineon.

https://www.infineon.com/cms/en/product/evaluation-boards/TLE94112EL_SHIELD/productType.html?productType=5546d46259d9a4b…

 

As described in the data sheet,  https://www.infineon.com/dgdl/Infineon-TLE94112EL-DS-v01_00-EN.pdf?fileId=5546d462576f347501579a2795837d3e

in page 38, SPI interface, the TLE94112EL will be controlled via the SPI.

If the chip is enabled EN, using the interface lines SCLK, SDI, SDO and the chip select line CSN (Chip Select Not), the transmission cycle will start, or end.

This works fine.

image

(source: TLE94112EL data sheet, page 38)

Information: all images, copied from the data sheet, or application notes, are only for related  information in this RoadTest. Infineon is owner of this images.

-------------

All measurements was made with the oscilloscope Keysight DSOX1102G. - Please see also the RoadTest InfiniiVision 1000 X-Series Oscilloscope DSOX1102G

 

At this point I want to say, many thanks to the distributor of the Keysight here in Austria.

I could lend the oscilloscope for this RoadTest; / I didn't won as one of the Road Tester. /

Die neue 1000X-Serie von Keysight - x.test

Feedback/Kontakt - x.test

--------------

 

The screen of the oscilloscope shows the lines: CSN (blue - extern trigger); SDO (yellow 1. channel); SCLK (green 2. channel).

 

There are now the sequences with SDI - transmitting the data from µC to the motor controller.

imageimageimage

 

There are now the sequences with the SDO - response from TLE94112EL to the µC.

imageimageimage

 

The complete sequence of the serial communication, triggered with the data values:

SDI

image

SDO

image

 

The complete sequence on the motor:

The sequence of the motor driver here is about 7 seconds.

The demo software switches on the first motor for 1 sec forward (cw), for 300ms switches to brake, then 1 sec reverse (ccw), then ccw with PWM_fast and PWM_slow, then brake.

This diagram shows the voltage plus on the motor, OUT1 (yellow).

image

 

The current through the motor, from OUT1 to OUT2: The current was measured with an 0.1 Ohm shunt resistor.

The motor starts cw with inrush current about 400mA, then it switch to ccw, then at the last 1/3 (near by the cursor) the PWM slows down the motor.

image

----

Now there are following some videos that show the workplace, also  the actions with the motor driving sequences.

 

The blue signal indicates the SCLK, which triggers the motor signal - motor plus (yellow) motor minus (green).

 

 

On the left is the motor, on the right the oscilloscope signal, which corresponds to the motor directions also to the speed.

The PS is a 12V / 2A SMPS - the controller board also the driver board are connected to the PS; the USB does not supply the controller board directly.

Its better for higher current usage. I use the USB just for data communication.

 

On the screen of the oscilloscope is shown

1. green: HIGH - the motor drives cw, also brake

2. yellow: HIGH - the motor drives ccw

3. yellow: Impulses - the motor drives (ccw) via PWM, first fast then slower, also brake.

 

 

The shunt resistor for testing the current:

image

 

The complete sequence measurement on the motor, voltage also the current:

 

The current measurement, first in details, zoomed screen, second the complete sequence:

 

 

--

The hardware:

image

The TLE94112EL will be controlled serial via SCLK, SDI, SDO, CSN and the chip enable EN.

It have 12 OUT ports which can drive several kind of loads.

Also for driving resistive loads, e.g. power LEDs which that PWM can be driven the brightness as well.

Please read the data sheet.

https://www.infineon.com/dgdl/Infineon-TLE94112EL-DS-v01_00-EN.pdf?fileId=5546d462576f347501579a2795837d3e

 

The Arduino shield:

image

image

Some details:

As you can see, the TLE94112EL is a very complex device in a very small package.

On the bottom side there is an exposed pad, EP (see data sheet page 6). This is for cooling the device.

But normally it is not usable as electrical ground. Electrical GND must be provided by the GND pins 1, 12, 13, 24.

For better EMC and cooling purposes, it is recommended to connect the EP to GND (only to bring to the same pot as GND, not to the current switch).

I have created the lbr file for the footprint for Eagle with the necessary EP, so for the stencil mask.

For EMC purposes, it is also recommended that on all outputs are connected filter circuits. How you can do it, this can you read in the datasheet

 

It is important to protect the TLE94112EL against the reverse battery voltage, VS also VDD.

This can be do with a diode connected in serial to VDD and for more power current active with a P-channel MOSFET in serial to the VS pins.

Please see the schematics of the Arduino shield "reverse battery protection"

 

Electrical characteristics:

The TLE94112EL has two supply inputs, VS and VDD.

The half bridge outputs are supplied by VS, which is connected to the 12V (<18V normal operating voltage; extended 18..20V) power supply rail.

VDD is used to supply the IO buffers (logic supply voltage 3.0 ... 5.5V) and internal voltage regulator of the device.

The overcurrent shutdown threshold is min 0.9A to max 1.4A, typ 1.1A

The max cont. supply current is about 3A VS1, VS2.

image

 

->> so, can the device deliver up to 12A? NO - the device must be programmed so that the outputs are driving their loads in time multiplex.

Parallel outputs are possible if more drive current is needing; max supply current.
This have to configure in the control registers. Please read in the data sheet page 26.

 

Software:

For this RoadTest i just used the demo software downloadable https://www.infineon.com/cms/en/product/evaluation-boards/TLE94112EL_SHIELD/productType.html?productType=5546d46259d9a4b…

 

This is good for starting your own application, for testing the basic functions of the TLE94112EL.

For me, i will migrate the functions into the PIC environment because momentary i work with PIC from microchip.
In the future - Infineon, why not, but actual situated i have projects with PIC.

The commands are very easy to use.

 

The SPI Frame:

The video shows the SPI communication with CSN, SDO, SCLK. The settings was on this oscilloscope:

ext. Trigger SCLK, yellow (ch1) SDO, green (ch2) CSN.

In the communication frame you have 16 clocks and the data values, separated in two groups of 8 clocks.

image

---

 

Source example; fragment of the demo software :

 

const int EN = 8;                       // Set pin 8 to control Enable pin of TLE94112
const int CSN = 10;                     // Set pin 10 (CSN1) to control CSN of TLE94112 (default)
// Note: CSN2 (pin 12) can also be used to control CSN of the TLE94112: R7 must be desoldered, and a 0 Ohm resistor must be soldered on R8 pad
// Refer to the user manual at http://www.infineon.com/shields-for-arduino
...
const byte HB_ACT_1_CTRL = B0000011;    // Activation/deactivation of  HB1-4
const byte HB_MODE_1_CTRL = B1100011;   // Control mode (PWM enable, PWM channel) of HB1-4
const byte PWM_CH_FREQ_CTRL = B0110011; // PWM clock frequency and frequency modulation of the oscillator
const byte PWM1_DC_CTRL = B1110011;     // Duty cycle of PWM Channel 1
...
const byte FW_OL_CTRL = B0101011;       // LED mode for HS1/2 and active free-wheeling of HB1-6
const byte FW_CTRL = B1101011;          // Active free-wheeling of HB7-12
const byte CONFIG_CTRL = B1100111;      // Device ID

// Address of the status registers
const byte SYS_DIAG_1 = B00011011;      // Global Status Register
const byte SYS_DIAG_2 = B01011011;      // Overcurrent HB1-4
const byte SYS_DIAG_5 = B00000111;      // Open load HB1-4

const byte WRITE = 0b10000000; // Mask for write commands to control registers
const byte CLEAR = 0b10000000; // Mask for clear commands to status registers

void setup() {
  // Setup fo the parameters for SPI communication, set CSN and EN pins as outputs and set EN to High  
  Serial.begin(9600);                     // sets the baud rate for communication with the computer to 9600 bauds
  SPI.begin();                            // Initializes the SPI bus
  SPI.setBitOrder(LSBFIRST);              // Least significant bit is sent first 
  SPI.setClockDivider(SPI_CLOCK_DIV16);   // SPI clock frequency set to 1 MHz
  SPI.setDataMode(SPI_MODE1);             // Set SPI clock polarity and clock phase; CPOL = 0, CPHA = 1
  pinMode(CSN, OUTPUT);                   // sets CSN as output
  pinMode(EN, OUTPUT);                    // sets EN as output
  digitalWrite(EN, HIGH);                 // TLE94112 set in active mode (ENABLE pin = high)
}
void loop()
{
  activateMotor1_4();                    // Motors 1-6 are activated for 1s, then braked for 300 ms and activated in the reverse direction for 1s and braked for 300 ms 
  activateMotor1_PWM();                  // Motor 1 is activated for 2s with 90% duty cycle / 100 Hz, for 2s with 20% duty cycle, then braked for 300 ms
}
void activateMotor1_PWM()
{
    // In this function activates the motor connected between OUT1 and OUT2 in PWM
    // at 90% duty cycle for 2s: HS1 ON with 90% duty cycle for 2s / 100 Hz, LS2 ON
    // at 20% duty cycle for 2s: HS1 ON with 20% duty cycle for 2s / 100 Hz, LS2 ON
    // then, Motor1 is braked to GND for 300 ms (LS1 and LS2 are ON)
    writeRegister(HB_MODE_1_CTRL,0b1);      // Map HB1 to PWM channel 1
    writeRegister(PWM_CH_FREQ_CTRL,0b10);   // Set Frequency of PWM channel 1 to 100 Hz
    writeRegister(PWM1_DC_CTRL,0b11100110); // Set duty cycle of PWM channel to 90 %
    writeRegister(HB_ACT_1_CTRL,0b0110);    // Activate HS1/LS2
    delay(2000);                            // Wait 2000 ms
    writeRegister(PWM1_DC_CTRL,0b00110011); // Set duty cycle of PWM channel to 20 %
    delay(2000);                            // Wait 2000 ms
    writeRegister(HB_ACT_1_CTRL,0b0101);    // Activate LS1/LS2
    delay(300);                             // Wait 300 ms
    
    writeRegister(HB_MODE_1_CTRL,0b0);      // HB1 is not mapped to PWM channel 1
  }
void activateMotor1_6()
{
    // The motors 1-6 are activated in one direction for 1s
    // Then the motors 1-6  are braked to GND for 300 ms
    // Then the motors 1-6 are activated in the other direction for 1s
    // Then the mtors 1-6 are braked to GND for 300 ms
    
    writeRegister(HB_ACT_1_CTRL, 0b10011001); // LS1,LS3,HS2,HS4 activated    : Motors 1&2 are turned on
    writeRegister(HB_ACT_2_CTRL, 0b10011001); // LS5,LS7,HS6,HS8 activated    : Motors 3&4 are turned on
    ...
    delay(1000);                              // wait 1000 ms
    writeRegister(HB_ACT_1_CTRL, 0b01010101); // LS1,LS2,LS3,LS4 activated    : Motors 1&2 are braked to GND
    writeRegister(HB_ACT_2_CTRL, 0b01010101); // LS5,LS6,LS7,LS8 activated    : Motors 3&4 are braked to GND
    ...
    delay(300);                               // wait 300 ms
    writeRegister(HB_ACT_1_CTRL, 0b01100110); // LS2,LS4,HS1,HS3 activated    : Motors 1&2 are turned on in the reverse direction
    writeRegister(HB_ACT_2_CTRL, 0b01100110); // LS6,LS8,HS5,HS7 activated    : Motors 3&4 are turned on in the reverse direction
    ...
    delay(1000);                              // wait 1000 ms
    writeRegister(HB_ACT_1_CTRL, 0b01010101); // LS1,LS2,LS3,LS4 activated    : Motors 1&2 are braked to GND
    writeRegister(HB_ACT_2_CTRL, 0b01010101); // LS5,LS6,LS7,LS8 activated    : Motors 3&4 are braked to GND
    ...
    delay(300);                               // wait 300 ms
}
int writeRegister(byte address, byte data)
{
/*   This function sends SPI commands to the address  "address" with the data "data"
 *   The data sent by the TLE94112EL to the Arduino Uno (SDO) and the data sent by the Arduino Uno to the TLE94112EL (SDI) are reported in the
 *   Serial Monitor (CTRL + SHIFT + M)
 */
  address = address | WRITE ;
  digitalWrite(CSN, LOW);               // take the CSN pin low to select the chip:
  byte byte0 = SPI.transfer(address);   // send address byte to the TLE94112 and store the received byte to byte 0
  byte byte1 = SPI.transfer(data);      // send data byte to the TLE94112 and store the received byte to byte 1
  digitalWrite(CSN, HIGH);              // take the CSN pin high to terminate the SPI frame
  Serial.println();                     // insert a carriage return to the serial monitor
  Serial.print("SDI:\t");
  printByte(address);                   // write address to the serial monitor
  printByte(data);                      // write data to the serial monitor
  Serial.print("SDO:\t");
  printByte(byte0);                     // write byte0 (Global Satus Register of the TLE94112EL) to the serial monitor
  printByte(byte1);                     // write byte1 (Data Byte sent by the TLE9412EL) to the serial monitor
  int result = ( ((int)byte0 << 8) | (int)byte1 ); // concatenates byte0 and byte1 in result
  return (result);
}
int readRegister(byte address)          // This function reads a register and returns the data sent by the TLE94112EL. Data sent and received by the TLE94112EL are displayed on the serial monitor
{
  digitalWrite(CSN, LOW);               // take the CSN pin low to select the chip:
  byte byte0 = SPI.transfer(address);   // send Low Byte
  byte byte1 = SPI.transfer(0);         // send High Byte
  digitalWrite(CSN, HIGH);              // take the CSN pin high to de-select the chip:
  Serial.println();
  
  Serial.print("SDI:\t");
  printByte(address);                   // write address to the serial monitor
  printByte(0);                         // write data to the serial monitor
  Serial.print("SDO:\t");
  printByte(byte0);                     // write byte0 (Global Satus Register of the TLE94112EL) to the serial monitor
  printByte(byte1);                     // write byte1 (Data Byte sent by the TLE9412EL) to the serial monitor
  int result = ( ((int)byte0 << 8) | (int)byte1 ); // concatenates byte0 and byte1 in result
  return (result);
}
int clearRegister(int address)          // This function clears a register and returns the data sent by the TLE94112EL. Data sent and received by the TLE94112EL are displayed on the serial monitor
{
  address = address | CLEAR ;
  digitalWrite(CSN, LOW);               // take the CSN pin low to select the chip:
  byte byte0 = SPI.transfer(address);
  byte byte1 = SPI.transfer(0);
  digitalWrite(CSN, HIGH);              // take the CSN pin high to de-select the chip:
  Serial.println();
  
  Serial.print("SDI:\t");
  printByte(address);                   // write address to the serial monitor
  printByte(0);                         // write data to the serial monitor
  Serial.print("SDO:\t");               
  printByte(byte0);                     // write byte0 (Global Satus Register of the TLE94112EL) to the serial monitor
  printByte(byte1);                     // write byte1 (Data Byte sent by the TLE9412EL) to the serial monitor
  int result = ( ((int)byte0 << 0) | (int)byte1 ); // concatenates byte0 and byte1 in result
  return (result);
}
void printByte(byte printByte)          // This function writes to the serial monitor the value of the byte printByte in binary form 
{
  for (int i = 7; i >= 0; i--)
  {
    Serial.print(bitRead(printByte, i));
  }
  Serial.print("\t");
}

---

 

 

Conclusion:

The TLE94112EL is a very good driver IC for many loads. This component is very small, so you can mount it in many applications.

 

"11 motors" - ok, a multi-mirror manipulator as an example. Or body support for needy people. Or multi-load pullout in the cupboard. Or seat adjustment.

Or wing control for flight models. Or in the industry for robots with multiple tools. - Operations robot as a helping hand in the hospital.

 

Future:

I will also test the hard parameters of the IC. But with the Arduino shield this is not really possible. ... "heating over 100°, or cooling down to the winter temperature"...

 

Thank you for selecting me, for participating in this RoadTest for this fine TLE94112EL Arduino shield.

Best Regards

Gerald

Anonymous